diff options
author | Patrick J Cherry <patrick@bytemark.co.uk> | 2012-11-27 16:12:10 +0000 |
---|---|---|
committer | Patrick J Cherry <patrick@bytemark.co.uk> | 2012-11-27 16:12:10 +0000 |
commit | 07a0e4aa01c8545fa370d54727f1dd8a41153597 (patch) | |
tree | d3f9c69b8a6fb1c9bd5d2d41c09bcdb735f263e3 /lib | |
parent | b9e7978c92fc5295782799da1892d7492b97a12f (diff) |
Re-jigged alert saving / history saving using transactions.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/mauve/alert.rb | 143 |
1 files changed, 64 insertions, 79 deletions
diff --git a/lib/mauve/alert.rb b/lib/mauve/alert.rb index cf87f0d..024ce5c 100644 --- a/lib/mauve/alert.rb +++ b/lib/mauve/alert.rb @@ -89,7 +89,7 @@ module Mauve "[\xF1-\xF3][\x80-\xBF]{3}", # planes 4-15 "\xF4[\x80-\x8F][\x80-\xBF]{2}" # plane 16 ].join("|")})*$/) - + property :id, Serial property :alert_id, String, :required => true, :unique_index => :alert_index, :length=>256, :lazy => false property :source, String, :required => true, :unique_index => :alert_index, :length=>512, :lazy => false @@ -118,9 +118,7 @@ module Mauve before :valid?, :do_set_timestamps before :save, :do_sanitize_html - before :save, :take_copy_of_changes - after :save, :notify_if_needed after :destroy, :destroy_associations validates_with_method :check_dates @@ -301,93 +299,95 @@ module Mauve end end - # This allows us to take a copy of the changes before we save. + + # Remove all history for an alert, when an alert is destroyed. # - def take_copy_of_changes - @attributes_before_save = Hash.new - self.original_attributes.each do |k,v| - @attributes_before_save[k.name] = v - end + # + def destroy_associations + AlertHistory.all(:alert_id => self.id).destroy end - # This sends notifications. It is called after each save. + public + + # Send a notification for this alert. # - # @return [Boolean] - def notify_if_needed - # puts "Saved #{self.inspect}" - # - # Make sure we don't barf - # - @attributes_before_save ||= Hash.new + # @return [Boolean] Showing if an alert has been sent. + def notify(at = Time.now) + Server.notification_push([self, at]) + end + # Save an alert, creating a history and notifications, as needed. + # + # + def save # - # Do not alert about changes, for now. + # Fetch the original update type. # - is_a_change = false # [:subject, :summary].any?{|k| @attributes_before_save.keys.include?(k)} + update_type_key = self.original_attributes.keys.find{|k| k.name == :update_type} # # Work out what state the alert was in before the update. # - if @attributes_before_save.has_key?(:update_type) - original_update_type = @attributes_before_save[:update_type] + if self.dirty? and !update_type_key.nil? + original_update_type = self.original_attributes[update_type_key] + # # If the original update type is nil, then it was cleared. # original_update_type ||= "cleared" + else # # If there was no update, the original type is the same as the current type. # original_update_type = self.update_type - end - # - # We notify if the update type has changed, or if the update type is - # "raised", and the above is_a_change condition is true - # - if (self.update_type != original_update_type) or (is_a_change and self.raised?) + end - self.notify + is_a_change = false + should_notify = ((self.update_type != original_update_type) or (is_a_change and self.raised?)) - h = History.new(:alerts => [self], :type => "update") + begin + self.transaction do + self.raise_on_save_failure = true + super - if self.update_type == "acknowledged" - h.event = "ACKNOWLEDGED until #{self.will_unacknowledge_at}" - h.user = self.acknowledged_by + # + # We notify if the update type has changed, or if the update type is + # "raised", and the above is_a_change condition is true + # + if should_notify + h = History.new(:alerts => [self], :type => "update") + h.raise_on_save_failure = true - elsif is_a_change - h.event = "CHANGED: " - h.event += @attributes_before_save.keys.collect{|k| "#{k.to_s}: #{@attributes_before_save[k]} -> #{self.__send__(k)}"}.join(", ") + if self.update_type == "acknowledged" + h.event = "ACKNOWLEDGED until #{self.will_unacknowledge_at}" + h.user = self.acknowledged_by - else - h.event = (self.update_type || "UNKNOWN").upcase + else + h.event = (self.update_type || "UNKNOWN").upcase - end + end - h.save - end + h.save + end - true - end + end # end of transaction -- if the save has failed, the notify won't get executed. - # - # - # + if should_notify + self.notify + end - # Remove all history for an alert, when an alert is destroyed. - # - # - def destroy_associations - AlertHistory.all(:alert_id => self.id).destroy - end + # + # Success + # + return true + rescue DataMapper::SaveFailureError => err + logger.error "Failed to save #{self} due to #{err.inspect}" + end - public - - # Send a notification for this alert. - # - # @return [Boolean] Showing if an alert has been sent. - def notify(at = Time.now) - Server.notification_push([self, at]) + # Failure. + return false end # Acknowledge an alert @@ -412,14 +412,9 @@ module Mauve self.will_unacknowledge_at = ack_until self.update_type = "acknowledged" - unless save - logger.error("Couldn't save #{self}") - false - else - true - end + self.save end - + # Unacknowledge an alert # # @return [Boolean] showing the unacknowledgment has been successful @@ -429,12 +424,7 @@ module Mauve self.will_unacknowledge_at = nil self.update_type = (raised? ? "raised" : "cleared") - unless save - logger.error("Couldn't save #{self}") - false - else - true - end + self.save end # Raise an alert at a specified time @@ -473,12 +463,7 @@ module Mauve self.update_type = "raised" if self.update_type.nil? or self.update_type != "changed" or self.original_attributes[Alert.properties[:update_type]] == "cleared" end - unless save - logger.error("Couldn't save #{self}") - false - else - true - end + self.save end # Clear an alert at a specified time @@ -509,7 +494,7 @@ module Mauve self.update_type = "cleared" end - if save + if self.save # # Clear all reminders. # @@ -526,7 +511,7 @@ module Mauve # # Oops. # - logger.error("Couldn't save #{self}") + logger.error("Not clearing reminders as save of #{self} failed") false end end |