Class: Bora::Resolver::Ami

Inherits:
Object
  • Object
show all
Defined in:
lib/bora/resolver/ami.rb

Constant Summary collapse

NoAMI =
Class.new(StandardError)
InvalidParameter =
Class.new(StandardError)
InvalidUserId =
Class.new(StandardError)

Instance Method Summary collapse

Constructor Details

#initialize(stack) ⇒ Ami

Returns a new instance of Ami.



9
10
11
# File 'lib/bora/resolver/ami.rb', line 9

def initialize(stack)
  @stack = stack
end

Instance Method Details

#resolve(uri) ⇒ Object

Raises:



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/bora/resolver/ami.rb', line 13

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