Sha256: aa7993bd4e68d50930c12b56ace034ad09e92ca77ecf71bccf5cb3b103849587

Contents?: true

Size: 1.36 KB

Versions: 5

Compression:

Stored size: 1.36 KB

Contents

require 'bora/cfn/stack'
class Bora
  module Resolver
    class Ami
      NoAMI = Class.new(StandardError)
      InvalidParameter = Class.new(StandardError)
      InvalidUserId = Class.new(StandardError)

      def initialize(stack)
        @stack = stack
      end

      def resolve(uri)
        owners = []
        ami_prefix = uri.host
        raise InvalidParameter, "Invalid ami parameter #{uri}" unless ami_prefix
        if !uri.query.nil? && uri.query.include?('owner')
          query = URI.decode_www_form(uri.query).to_h
          owners = query['owner'].split(',')
        else
          owners << 'self'
        end

        ec2 = Aws::EC2::Client.new(region: @stack.region)
        begin
          images = ec2.describe_images(
            owners: owners,
            filters: [
              {
                name:   'name',
                values: [ami_prefix]
              },
              {
                name:   'state',
                values: ['available']
              }
            ]
          ).images
        rescue Aws::EC2::Errors::InvalidUserIDMalformed
          raise InvalidUserId, "Invalid owner argument in #{uri}"
        end

        raise NoAMI, "No Matching AMI's for prefix #{ami_prefix}" if images.empty?
        images.sort! { |a, b| DateTime.parse(a.creation_date) <=> DateTime.parse(b.creation_date) }.last.image_id
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
bora-1.7.4 lib/bora/resolver/ami.rb
bora-1.7.3 lib/bora/resolver/ami.rb
bora-1.7.2 lib/bora/resolver/ami.rb
bora-1.7.1 lib/bora/resolver/ami.rb
bora-1.7.0 lib/bora/resolver/ami.rb