lib/terraforming/resource/cloud_watch_alarm.rb
module Terraforming
module Resource
class CloudWatchAlarm
include Terraforming::Util
def self.tf(client: Aws::CloudWatch::Client.new)
self.new(client).tf
end
def self.tfstate(client: Aws::CloudWatch::Client.new)
self.new(client).tfstate
end
def initialize(client)
@client = client
end
def tf
apply_template(@client, "tf/cloud_watch_alarm")
end
def tfstate
alarms.inject({}) do |resources, alarm|
resources["aws_cloudwatch_metric_alarm.#{module_name_of(alarm)}"] = {
"type" => "aws_cloudwatch_metric_alarm",
"primary" => {
"id" => alarm.alarm_name,
"attributes" => alarm_attributes(alarm)
}
}
resources
end
end
private
def alarm_attributes(alarm)
attributes = {
"actions_enabled" => alarm.actions_enabled.to_s,
"alarm_description" => sanitize(alarm.alarm_description),
"alarm_name" => alarm.alarm_name,
"comparison_operator" => alarm.comparison_operator,
"evaluation_periods" => alarm.evaluation_periods.to_s,
"id" => alarm.alarm_name,
"metric_name" => alarm.metric_name,
"namespace" => alarm.namespace,
"period" => alarm.period.to_s,
"statistic" => alarm.statistic,
"threshold" => alarm.threshold.to_s,
"unit" => sanitize(alarm.unit)
}
add_checksummed_attributes(attributes, alarm)
end
def alarms
@client.describe_alarms.map(&:metric_alarms).flatten
end
def module_name_of(alarm)
normalize_module_name(alarm.alarm_name)
end
def sanitize(argument)
argument.nil? ? "" : argument
end
def add_checksummed_attributes(attributes, alarm)
%w(insufficient_data_actions alarm_actions ok_actions dimensions).each do |action|
attribute = alarm.send(action.to_sym)
attributes["#{action}.#"] = attribute.size.to_s
attribute.each do |attr|
if attr.is_a? String
checksum = Zlib.crc32(attr)
value = attr
else
checksum = attr.name
value = attr.value
end
attributes["#{action}.#{checksum}"] = value
end
end
attributes
end
end
end
end