Sha256: 74ed1d32f9b49d4ea938bcbeec81650eb7eacccdb73d2bc7fb891bb10f0f864f

Contents?: true

Size: 1.9 KB

Versions: 13

Compression:

Stored size: 1.9 KB

Contents

require 'aws-sdk-cloudwatch'
require 'cfnguardian/cloudwatch'
require 'cfnguardian/log'

module CfnGuardian
  class Tagger
    include Logging

    def initialize()
      @client = Aws::CloudWatch::Client.new(max_attempts: 5)
    end

    def tag_alarm(alarm, global_tags={})
      alarm_arn = CfnGuardian::CloudWatch.get_alarm_arn(alarm)
      
      new_tags = get_tags(alarm, global_tags)
      current_tags = get_alarm_tags(alarm_arn)
      tags_to_delete = get_tags_to_delete(current_tags, new_tags)

      if tags_to_delete.any?
        logger.debug "Removing tags #{tags_to_delete} from alarm #{alarm_arn}"
        @client.untag_resource({
          resource_arn: alarm_arn,
          tag_keys: tags_to_delete
        })
      end

      if tags_changed?(current_tags, new_tags)
        logger.debug "Updating tags on alarm #{alarm_arn}"
        @client.tag_resource({
          resource_arn: alarm_arn,
          tags: new_tags.map {|key,value| {key: key, value: value}}
        })
      end
    end

    def get_tags(alarm, global_tags)
      defaults = {
        'guardian:resource:id' => alarm.resource_id,
        'guardian:resource:group' => alarm.group,
        'guardian:alarm:name' => alarm.name,
        'guardian:alarm:metric' => alarm.metric_name,
        'guardian:alarm:severity' => alarm.alarm_action
      }
      tags = global_tags.merge(defaults)
      return alarm.tags.merge(tags)
    end

    def get_alarm_tags(alarm_arn)
      resp = @client.list_tags_for_resource({
        resource_arn: alarm_arn
      })
      return resp.tags
    end

    def get_tags_to_delete(current_tags, new_tags)
      return current_tags.select {|tag| !new_tags.has_key?(tag.key)}.map {|tag| tag.key}
    end

    def tags_changed?(current_tags, new_tags)
      return tags_to_hash(current_tags) != new_tags
    end

    def tags_to_hash(tags)
      return tags.map {|tag| {tag.key => tag.value} }.reduce(Hash.new, :merge)
    end

  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
cfn-guardian-0.10.4 lib/cfnguardian/tagger.rb
cfn-guardian-0.10.1 lib/cfnguardian/tagger.rb
cfn-guardian-0.10.0 lib/cfnguardian/tagger.rb
cfn-guardian-0.9.2 lib/cfnguardian/tagger.rb
cfn-guardian-0.9.1 lib/cfnguardian/tagger.rb
cfn-guardian-0.9.0 lib/cfnguardian/tagger.rb
cfn-guardian-0.8.6 lib/cfnguardian/tagger.rb
cfn-guardian-0.8.5 lib/cfnguardian/tagger.rb
cfn-guardian-0.8.4 lib/cfnguardian/tagger.rb
cfn-guardian-0.8.3 lib/cfnguardian/tagger.rb
cfn-guardian-0.8.2 lib/cfnguardian/tagger.rb
cfn-guardian-0.8.1 lib/cfnguardian/tagger.rb
cfn-guardian-0.8.0 lib/cfnguardian/tagger.rb