From 6aba0c3d8e2d30797755dc8b968fe338e13b8df4 Mon Sep 17 00:00:00 2001 From: Patrick J Cherry Date: Thu, 18 Aug 2011 18:11:10 +0100 Subject: * Fixed up Alert to postpone raises/clears within initial sleep period for old alerts * Fixed up AlertChanged to do the same * Added a migration method for the new AlertHistories table * added singleton cleanup for tests * moar tests * cleaned up Alert a bit --- lib/mauve/alert.rb | 87 ++++++++++++++++++++++++++++------------------ lib/mauve/alert_changed.rb | 13 ++++++- lib/mauve/person.rb | 6 ---- lib/mauve/server.rb | 7 +++- 4 files changed, 72 insertions(+), 41 deletions(-) (limited to 'lib') diff --git a/lib/mauve/alert.rb b/lib/mauve/alert.rb index 28dfcf1..22f6784 100644 --- a/lib/mauve/alert.rb +++ b/lib/mauve/alert.rb @@ -87,12 +87,10 @@ module Mauve validates_with_method :check_dates - def inspect + def to_s "#" end - alias to_s inspect - # # This is to stop datamapper inserting duff dates into the database. # @@ -163,20 +161,8 @@ module Mauve def subject; attribute_get(:subject) || attribute_get(:source) || "not set" ; end def detail; attribute_get(:detail) || "_No detail set._" ; end - # def subject=(subject); set_changed_if_different( :subject, subject ); end - # def summary=(summary); set_changed_if_different( :summary, summary ); end - - # def source=(source); attribute_set( :source, source ); end - # def detail=(detail); attribute_set( :detail, detail ); end - protected - #def set_changed_if_different(attribute, value) - # return if self.__send__(attribute) == value - # self.update_type ||= "changed" - # attribute_set(attribute.to_sym, value) - #end - # # This allows us to take a copy of the changes before we save. # @@ -208,6 +194,7 @@ module Mauve # if (@attributes_before_save.has_key?(:update_type) and !is_a_new_alert) or (self.update_type == "raised" and (is_a_new_alert or is_a_change)) + self.notify h = History.new(:alerts => [self], :type => "update") @@ -265,27 +252,61 @@ module Mauve end def raise!(at = Time.now) - self.acknowledged_by = nil - self.acknowledged_at = nil - self.will_unacknowledge_at = nil - self.raised_at = at if self.raised_at.nil? - self.will_raise_at = nil - self.cleared_at = nil - # Don't clear will_clear_at - self.update_type = "raised" if self.update_type.nil? or self.update_type != "changed" or self.original_attributes[Alert.properties[:update_type]] == "cleared" + # + # OK if this is an alert updated in the last run, do not raise, just postpone. + # + if (self.will_raise_at or self.will_unacknowledge_at) and + Server.instance.in_initial_sleep? and + self.updated_at and + self.updated_at < Server.instance.started_at + + postpone_until = Server.instance.started_at + Server.instance.initial_sleep + + if self.will_raise_at and self.will_raise_at <= Time.now + self.will_raise_at = postpone_until + end + + if self.will_unacknowledge_at and self.will_unacknowledge_at <= Time.now + self.will_unacknowledge_at = postpone_until + end + + logger.info("Postponing raise of #{self} until #{postpone_until} as it was last updated in a prior run of Mauve.") + else + self.acknowledged_by = nil + self.acknowledged_at = nil + self.will_unacknowledge_at = nil + self.raised_at = at if self.raised_at.nil? + self.will_raise_at = nil + self.cleared_at = nil + # Don't clear will_clear_at + self.update_type = "raised" if self.update_type.nil? or self.update_type != "changed" or self.original_attributes[Alert.properties[:update_type]] == "cleared" + end logger.error("Couldn't save #{self}") unless save end def clear!(at = Time.now) - self.acknowledged_by = nil - self.acknowledged_at = nil - self.will_unacknowledge_at = nil - self.raised_at = nil - # Don't clear will_raise_at - self.cleared_at = at if self.cleared_at.nil? - self.will_clear_at = nil - self.update_type = "cleared" + # + # Postpone clearance if we're in the sleep period. + # + if self.will_clear_at and + Server.instance.in_initial_sleep? and + self.updated_at and + self.updated_at < Server.instance.started_at + + self.will_clear_at = Server.instance.started_at + Server.instance.initial_sleep + + logger.info("Postponing clear of #{self} until #{self.will_clear_at} as it was last updated in a prior run of Mauve.") + else + self.acknowledged_by = nil + self.acknowledged_at = nil + self.will_unacknowledge_at = nil + self.raised_at = nil + # Don't clear will_raise_at + self.cleared_at = at if self.cleared_at.nil? + self.will_clear_at = nil + self.update_type = "cleared" + end logger.error("Couldn't save #{self}") unless save end @@ -301,7 +322,7 @@ module Mauve raise! if (will_unacknowledge_at and will_unacknowledge_at <= Time.now) or (will_raise_at and will_raise_at <= Time.now) clear! if will_clear_at && will_clear_at <= Time.now - logger.info("Polled #{self.inspect}") + logger.info("Polled #{self.to_s}") end @@ -518,7 +539,7 @@ module Mauve # # Record the fact we received an update. # - logger.info("Received update from #{ip_source} for #{alert_db.inspect}") + logger.info("Received update from #{ip_source} for #{alert_db}") end diff --git a/lib/mauve/alert_changed.rb b/lib/mauve/alert_changed.rb index 9b74396..2871aee 100644 --- a/lib/mauve/alert_changed.rb +++ b/lib/mauve/alert_changed.rb @@ -61,11 +61,22 @@ module Mauve if alert.acknowledged? - logger.info("Alert already acknowledged. Clearing reminder due for #{self.alert}.") + logger.info("Alert already acknowledged. Clearing reminder due for #{self.alert}.") self.remind_at = nil return save end + # + # Postpone reminders from previous runs, if needed. + # + if Server.instance.in_initial_sleep? and + self.at < Server.instance.started_at + + self.remind_at = Server.instance.started_at + Server.instance.initial_sleep + logger.info("Postponing reminder for #{self.alert} until #{self.remind_at} since this reminder was updated in a prior run of Mauve.") + return save + end + alert_group.notify(alert) # # Need to make sure this reminder is cleared. diff --git a/lib/mauve/person.rb b/lib/mauve/person.rb index 3831529..64ed07e 100644 --- a/lib/mauve/person.rb +++ b/lib/mauve/person.rb @@ -163,12 +163,6 @@ module Mauve else logger.info "Starting to send notifications again for #{username}." if was_suppressed - - end - - if Server.instance.started_at > alert.updated_at and (Server.instance.started_at + Server.instance.initial_sleep) > Time.now - logger.info("Alert last updated in prior run of mauve -- ignoring for initial sleep period.") - return true end # diff --git a/lib/mauve/server.rb b/lib/mauve/server.rb index 138636e..eb5872b 100644 --- a/lib/mauve/server.rb +++ b/lib/mauve/server.rb @@ -65,6 +65,10 @@ module Mauve @initial_sleep = s end + def in_initial_sleep? + Time.now < self.started_at + self.initial_sleep + end + def logger @logger ||= Log4r::Logger.new(self.class.to_s) end @@ -92,7 +96,8 @@ module Mauve # m.auto_migrate! if m.respond_to?("auto_migrate!") end - Mauve::AlertEarliestDate.create_view! + AlertHistory.migrate! + AlertEarliestDate.create_view! return nil end -- cgit v1.2.1