class Builderator::Model::Cleaner::Images

EC2 AMI Resources

Constants

PROPERTIES

Public Instance Methods

fetch() click to toggle source
# File lib/builderator/model/cleaner/images.rb, line 20
def fetch
  @resources = {}.tap do |i|
    Util.ec2.describe_images(:filters => [
      {
        :name => 'state',
        :values => %w(available pending)
      }
    ], :owners => %w(self)).each do |page|
      page.images.each do |image|
        properties = Util.from_tags(image.tags)
        properties['creation_date'] = DateTime.iso8601(image.creation_date)
        PROPERTIES.each { |pp| properties[pp] = image[pp.to_sym] }

        i[image.image_id] = {
          :id => image.image_id,
          :properties => properties,
          :snapshots => image.block_device_mappings.map { |b| b.ebs.snapshot_id rescue nil }.reject(&:nil?),
          :parent => properties.fetch('parent_ami', '(undefined)')
        }
      end
    end
  end
end
in_use() click to toggle source
# File lib/builderator/model/cleaner/images.rb, line 82
def in_use
  {}.tap do |used|
    used.merge!(select(Cleaner.instances.images))
    used.merge!(select(Cleaner.launch_configs.images))
    used.merge!(latest)
    used.merge!(select(used.values.map { |i| i[:parent] }))
  end
end
latest() click to toggle source
# File lib/builderator/model/cleaner/images.rb, line 48
def latest
  {}.tap do |latest|
    ## Group images
    group_by = Config.cleaner.group_by
    groups = {}.tap do |object|
      break { 'all' => resources.values } if group_by.empty?

      resources.each do |_, image|
        ## Construct a grouping-key from image properties
        grouping_key = group_by.map do |grouping_property|
          image[:properties].fetch(grouping_property.to_s, '(unknown)')
        end.join(':')

        ## Create an array for the group if it doesn't already exist
        ## and add the image to it
        (object[grouping_key] ||= []) << image
      end
    end

    ## Sort each grouping
    groups.each do |_, group|
      group.sort! { |a, b| b[:properties][Config.cleaner.sort_by] <=> a[:properties][Config.cleaner.sort_by] }
    end

    ## Slice to `keep` length
    groups.each do |_, group|
      group.slice!(Config.cleaner.keep..-1)
    end

    ## Reduce
    groups.values.flatten.each { |i| latest[i[:id]] = i }
  end
end
snapshots() click to toggle source
# File lib/builderator/model/cleaner/images.rb, line 44
def snapshots
  resources.values.map { |i| i[:snapshots] }.flatten
end