Sha256: d90c231db13cc5d0c0fb524144b345c922405ce48422bd565c040bd5c67eb9bb

Contents?: true

Size: 1.99 KB

Versions: 3

Compression:

Stored size: 1.99 KB

Contents

require_relative 'cloud_watch_logs'

module AwsLogCleaner
  class LogGroupCleaner
    API_GATEWAY_LOG_PREFIX = 'API-Gateway-Execution-Logs_'.freeze

    def initialize(
      cloud_watch_logs,
      api_retriever,
      log_group_filterer,
      like,
      clean_orphans
    )
      @cloud_watch_logs = cloud_watch_logs
      @api_retriever = api_retriever
      @log_group_filterer = log_group_filterer
      @like = like.downcase unless like.nil?
      @clean_orphans = clean_orphans
    end

    def plan
      result(log_groups_to_delete)
    end

    def delete
      log_groups = log_groups_to_delete
      @cloud_watch_logs.delete_log_groups(log_groups)
      result(log_groups)
    end

    private

    def log_groups_to_delete
      log_groups = []
      log_groups.concat(log_group_names_containing(@like)) if @like
      log_groups.concat(log_group_names_orphan) if @clean_orphans
      log_groups.uniq
    end

    def log_group_names_containing(text)
      log_groups = @log_group_filterer.filter_by_name_includes(text)

      apis = @api_retriever.retrieve(text)
      apis.each do |api|
        log_groups.concat(
          @log_group_filterer.filter_by_name_includes(
            "#{API_GATEWAY_LOG_PREFIX}#{api.id}"
          )
        )
      end

      log_groups.map(&:log_group_name)
    end

    def log_group_names_orphan
      groups = @cloud_watch_logs.list_all_log_groups
      groups = groups.select { |log_group| orphan?(log_group) }
      groups.map(&:log_group_name)
    end

    def orphan?(log_group)
      apis = @api_retriever.retrieve_all
      api_id = extract_api_id(log_group.log_group_name)
      api_id.nil? ? false : apis.none? { |api| api.id == api_id }
    end

    def extract_api_id(log_group_name)
      match = log_group_name.match(%r{#{API_GATEWAY_LOG_PREFIX}(\w+)/\w+})
      match.captures[0] unless match.nil?
    end

    def result(log_groups)
      to_delete = []
      log_groups.each do |name|
        to_delete.push("(-) #{name}")
      end
      to_delete
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
aws_log_cleaner-0.2.1 lib/aws_log_cleaner/log_group_cleaner.rb
aws_log_cleaner-0.2.0 lib/aws_log_cleaner/log_group_cleaner.rb
aws_log_cleaner-0.1.8 lib/aws_log_cleaner/log_group_cleaner.rb