lib/flapjack/data/notification_rule.rb in flapjack-0.7.6 vs lib/flapjack/data/notification_rule.rb in flapjack-0.7.7
- old
+ new
@@ -35,17 +35,17 @@
# replacing save! etc
def self.add(rule_data, options = {})
raise "Redis connection not set" unless redis = options[:redis]
rule_id = SecureRandom.uuid
- self.add_or_update(rule_data.merge(:id => rule_id), :redis => redis)
+ self.add_or_update(rule_data.merge(:id => rule_id), options)
self.find_by_id(rule_id, :redis => redis)
end
- def update(rule_data)
- return false unless self.class.add_or_update(rule_data.merge(:id => @id),
- :redis => @redis)
+ def update(rule_data, opts = {})
+ return false unless self.class.add_or_update({:contact_id => @contact_id}.merge(rule_data.merge(:id => @id)),
+ :redis => @redis, :logger => opts[:logger])
refresh
true
end
# NB: ice_cube doesn't have much rule data validation, and has
@@ -106,11 +106,16 @@
end
def self.add_or_update(rule_data, options = {})
redis = options[:redis]
raise "a redis connection must be supplied" unless redis
+ logger = options[:logger]
+ # make some assumptions about the incoming data
+ rule_data[:warning_blackhole] = rule_data[:warning_blackhole] || false
+ rule_data[:critical_blackhole] = rule_data[:critical_blackhole] || false
+
return unless self.validate_data(rule_data, options)
# whitelisting fields, rather than passing through submitted data directly
json_rule_data = {
:id => rule_data[:id].to_s,
@@ -121,10 +126,11 @@
:warning_media => Yajl::Encoder.encode(rule_data[:warning_media]),
:critical_media => Yajl::Encoder.encode(rule_data[:critical_media]),
:warning_blackhole => rule_data[:warning_blackhole],
:critical_blackhole => rule_data[:critical_blackhole],
}
+ logger.debug("NotificationRule#add_or_update json_rule_data: #{json_rule_data.inspect}") if logger
redis.sadd("contact_notification_rules:#{json_rule_data[:contact_id]}",
json_rule_data[:id])
redis.hmset("notification_rule:#{json_rule_data[:id]}",
*json_rule_data.flatten)
@@ -198,51 +204,56 @@
def self.validate_data(d, options = {})
# hash with validation => error_message
validations = {proc { d.has_key?(:id) } =>
"id not set",
- proc { d.has_key?(:entities) &&
- d[:entities].is_a?(Array) &&
- d[:entities].all? {|e| e.is_a?(String)} } =>
+ proc { !d.has_key?(:entities) ||
+ ( d[:entities].nil? ||
+ d[:entities].is_a?(Array) &&
+ d[:entities].all? {|e| e.is_a?(String)} ) } =>
"entities must be a list of strings",
- proc { d.has_key?(:entity_tags) &&
- d[:entity_tags].is_a?(Array) &&
- d[:entity_tags].all? {|et| et.is_a?(String)}} =>
+ proc { !d.has_key?(:entity_tags) ||
+ ( d[:entity_tags].nil? ||
+ d[:entity_tags].is_a?(Array) &&
+ d[:entity_tags].all? {|et| et.is_a?(String)} ) } =>
"entity_tags must be a list of strings",
proc { (d.has_key?(:entities) &&
d[:entities].is_a?(Array) &&
(d[:entities].size > 0)) ||
(d.has_key?(:entity_tags) &&
d[:entity_tags].is_a?(Array) &&
(d[:entity_tags].size > 0)) } =>
"entities or entity tags must have at least one value",
- proc { d.has_key?(:time_restrictions) &&
- d[:time_restrictions].all? {|tr|
- !!prepare_time_restriction(symbolize(tr))
- }
+ proc { !d.has_key?(:time_restrictions) ||
+ ( d[:time_restrictions].nil? ||
+ d[:time_restrictions].all? {|tr|
+ !!prepare_time_restriction(symbolize(tr))
+ } )
} =>
"time restrictions are invalid",
# TODO should the media types be checked against a whitelist?
- proc { d.has_key?(:warning_media) &&
- d[:warning_media].is_a?(Array) &&
- d[:warning_media].all? {|et| et.is_a?(String)}} =>
+ proc { !d.has_key?(:warning_media) ||
+ ( d[:warning_media].nil? ||
+ d[:warning_media].is_a?(Array) &&
+ d[:warning_media].all? {|et| et.is_a?(String)} ) } =>
"warning_media must be a list of strings",
- proc { d.has_key?(:critical_media) &&
- d[:critical_media].is_a?(Array) &&
- d[:critical_media].all? {|et| et.is_a?(String)}} =>
+ proc { !d.has_key?(:critical_media) ||
+ ( d[:critical_media].nil? ||
+ d[:critical_media].is_a?(Array) &&
+ d[:critical_media].all? {|et| et.is_a?(String)} ) } =>
"critical_media must be a list of strings",
- proc { d.has_key?(:warning_blackhole) &&
+ proc { !d.has_key?(:warning_blackhole) ||
[TrueClass, FalseClass].include?(d[:warning_blackhole].class) } =>
"warning_blackhole must be true or false",
- proc { d.has_key?(:critical_blackhole) &&
+ proc { !d.has_key?(:critical_blackhole) ||
[TrueClass, FalseClass].include?(d[:critical_blackhole].class) } =>
"critical_blackhole must be true or false",
}
errors = validations.keys.inject([]) {|ret,vk|
@@ -253,9 +264,10 @@
return true if errors.empty?
if logger = options[:logger]
error_str = errors.join(", ")
logger.info "validation error: #{error_str}"
+ logger.debug "rule failing validations: #{d.inspect}"
end
false
end
def refresh