class AWSDSL::AMIBuilder

Public Class Methods

build(stack) click to toggle source
# File lib/awsdsl/ami_builder.rb, line 23
def self.build(stack)
  AMIBuilder.new(stack).build
end
latest_amis(stack) click to toggle source
# File lib/awsdsl/ami_builder.rb, line 27
def self.latest_amis(stack)
  AMIBuilder.new(stack).latest_amis
end
new(stack) click to toggle source
# File lib/awsdsl/ami_builder.rb, line 6
def initialize(stack)
  @stack = stack
end

Public Instance Methods

ami_name(role) click to toggle source
# File lib/awsdsl/ami_builder.rb, line 82
def ami_name(role)
  last = latest_ami(role)
  num = last.name.split('-').last.to_i + 1 if last
  num ||= 1
  "#{@stack.name}-#{role.name}-#{num}"
end
base_ami(role) click to toggle source
# File lib/awsdsl/ami_builder.rb, line 74
def base_ami(role)
  base = role.base_ami || 'ubuntu'
  if BaseAMI::DISTROS.include?(base)
    base = BaseAMI.find(base)
  end
  base
end
build() click to toggle source
# File lib/awsdsl/ami_builder.rb, line 10
def build
  @stack.roles.each do |role|
    build_ami(role)
  end
end
build_ami(role) click to toggle source
# File lib/awsdsl/ami_builder.rb, line 31
def build_ami(role)
  output_ami = ami_name(role)
  # TODO(jpg): This needs to be better, also deep_merge
  json = (@stack.vars || {}).merge(role.vars || {})
  @builder = Gersberms::Gersberms.new base_ami: base_ami(role),
                                      ami_name: output_ami,
                                      json: json
  begin
    start_builder
    role.file_provisioners.each do |provisioner|
      @builder.options[:files] = provisioner
      @builder.upload_files
    end
    role.chef_provisioners.each do |provisioner|
      runlist = provisioner[:runlist]
      runlist = [runlist] unless runlist.is_a? Array
      @builder.options[:runlist] = runlist
      @builder.run_chef
    end
    shutdown_builder
    role.ami = @builder.image.id
  rescue => e
    @builder.destroy_instance
    @builder.destroy_keypair
    raise "Failed to build AMI for #{role.name}:\nError: #{e.message}\nBacktrace: #{e.backtrace.join("\n")}"
  end
end
latest_ami(role) click to toggle source
# File lib/awsdsl/ami_builder.rb, line 89
def latest_ami(role)
  ec2 = AWS::EC2.new
  amis = ec2.images.with_owner('self').select do |i|
    i.name.start_with?("#{@stack.name}-#{role.name}")
  end
  latest_num = amis.map { |i| i.name.split('-').last.to_i }.sort.last
  amis.select { |i| i.name == "#{@stack.name}-#{role.name}-#{latest_num}" }.first
end
latest_amis() click to toggle source
# File lib/awsdsl/ami_builder.rb, line 16
def latest_amis
  @stack.roles.each do |role|
    role.ami = latest_ami(role).id
  end
  @stack
end
shutdown_builder() click to toggle source
# File lib/awsdsl/ami_builder.rb, line 67
def shutdown_builder
  @builder.stop_instance
  @builder.create_ami
  @builder.destroy_instance
  @builder.destroy_keypair
end
start_builder() click to toggle source
# File lib/awsdsl/ami_builder.rb, line 59
def start_builder
  @builder.preflight
  @builder.create_keypair
  @builder.create_instance
  @builder.install_chef
  @builder.upload_cookbooks
end