class Roark::Ami

Attributes

ami_id[RW]
aws[RW]
name[RW]

Public Class Methods

new(args) click to toggle source
# File lib/roark/ami.rb, line 6
def initialize(args)
  @aws    = args[:aws]
  @ami_id = args[:ami_id]
  @name   = args[:name]

  @region = @aws.region
  @logger = Roark.logger
end

Public Instance Methods

add_tags(tags) click to toggle source
# File lib/roark/ami.rb, line 113
def add_tags(tags)
  begin
    tag tags
  rescue AWS::Errors::Base => e
    return Response.new :code => 1, :message => e.message
  end
  Response.new :code => 0, :message => 'Tagging completed successfully.'
end
authorize_account_ids(account_ids) click to toggle source
# File lib/roark/ami.rb, line 122
def authorize_account_ids(account_ids)
  begin
    authorize account_ids
  rescue AWS::Errors::Base => e
    return Response.new :code => 1, :message => e.message
  end
  Response.new :code => 0, :message => 'Authorizations completed successfully.'
end
available?() click to toggle source
# File lib/roark/ami.rb, line 131
def available?
  state == :available
end
create_ami() click to toggle source
# File lib/roark/ami.rb, line 28
def create_ami
  @logger.info "Creating AMI '#{@name}' from Instance '#{instance_id}'."
  begin
    ami = instance.create_ami_from_instance
    @ami_id = ami.id
  rescue AWS::Errors::Base => e
    return Response.new :code => 1, :message => e.message
  end
  @logger.info "AMI '#{@ami_id}' created."
  Response.new :code => 0, :message => "AMI '#{@ami_id}' created."
end
create_instance(args) click to toggle source
# File lib/roark/ami.rb, line 15
def create_instance(args)
  @logger.info "Creating instance in '#{@region}'."
  begin
    instance.create :parameters => args[:parameters],
                    :template   => args[:template]
  rescue AWS::Errors::Base => e
    return Response.new :code => 1, :message => e.message
  end

  @logger.info "Instance created."
  Response.new :code => 0, :message => 'Instance created.'
end
destroy() click to toggle source
# File lib/roark/ami.rb, line 60
def destroy
  @logger.info "Destroying AMI '#{@ami_id}'."
  begin
    ec2_destroy_ami.destroy @ami_id
  rescue AWS::Errors::Base, AWS::Core::Resource::NotFound => e
    return Response.new :code => 1, :message => e.message
  end
  @logger.info "Destroy completed succesfully."
  Response.new :code => 0, :message => "Destroy completed succesfully."
end
destroy_instance() click to toggle source
# File lib/roark/ami.rb, line 50
def destroy_instance
  begin
    instance.destroy
  rescue AWS::Errors::Base => e
    return Response.new :code => 1, :message => e.message
  end
  @logger.info "Instance destroyed."
  Response.new :code => 0, :message => "Instance destroyed."
end
exists?() click to toggle source
# File lib/roark/ami.rb, line 139
def exists?
  ec2_ami_state.exists? @ami_id
end
instance_id() click to toggle source
# File lib/roark/ami.rb, line 147
def instance_id
  instance.instance_id
end
pending?() click to toggle source
# File lib/roark/ami.rb, line 135
def pending?
  state == :pending
end
state() click to toggle source
# File lib/roark/ami.rb, line 143
def state
  ec2_ami_state.state @ami_id
end
stop_instance() click to toggle source
# File lib/roark/ami.rb, line 40
def stop_instance
  @logger.info "Stopping instance."
  begin
    instance.stop
  rescue AWS::Errors::Base => e
    return Response.new :code => 1, :message => e.message
  end
  Response.new :code => 0, :message => "Instance stopped."
end
wait_for_ami() click to toggle source
# File lib/roark/ami.rb, line 96
def wait_for_ami
  while !exists? || pending?
    @logger.info "Waiting for AMI creation to complete. Current state: '#{state}'."
    sleep 15
  end

  if available?
    msg = "AMI completed succesfully."
    @logger.info msg
    Response.new :code => 0, :message => msg
  else
    msg = "AMI did not complete succesfully."
    @logger.info msg
    Response.new :code => 1, :message => msg
  end
end
wait_for_instance() click to toggle source
# File lib/roark/ami.rb, line 71
def wait_for_instance
  while instance.in_progress? || !instance.exists?
    @logger.info "Waiting for instance to come online."
    sleep 60
  end

  if instance.success?
    msg = "Instance '#{instance_id}' completed succesfully."
    @logger.info msg
    Response.new :code => 0, :message => msg
  else
    msg = "Instance did not complete succesfully."
    @logger.info msg
    Response.new :code => 1, :message => msg
  end
end
wait_for_instance_to_stop() click to toggle source
# File lib/roark/ami.rb, line 88
def wait_for_instance_to_stop
  while instance.status != :stopped
    @logger.info "Waiting for instance '#{instance_id}' to stop. Current state: '#{instance.status}'."
    sleep 15
  end
  Response.new :code => 0, :message => "Instance stopped."
end

Private Instance Methods

authorize(account_ids) click to toggle source
# File lib/roark/ami.rb, line 157
def authorize(account_ids)
  ec2_ami_authorizations.add :ami_id => @ami_id, :account_ids => account_ids
end
ec2_ami_authorizations() click to toggle source
# File lib/roark/ami.rb, line 173
def ec2_ami_authorizations
  @ec2_ami_authorizations ||= Roark::Aws::Ec2::AmiAuthorizations.new @aws
end
ec2_ami_state() click to toggle source
# File lib/roark/ami.rb, line 169
def ec2_ami_state
  @ec2_ami_state ||= Roark::Aws::Ec2::AmiState.new @aws
end
ec2_ami_tags() click to toggle source
# File lib/roark/ami.rb, line 177
def ec2_ami_tags
  @ec2_ami_tags ||= Roark::Aws::Ec2::AmiTags.new @aws
end
ec2_destroy_ami() click to toggle source
# File lib/roark/ami.rb, line 181
def ec2_destroy_ami
  @ec2_destroy_ami ||= Roark::Aws::Ec2::DestroyAmi.new @aws
end
instance() click to toggle source
# File lib/roark/ami.rb, line 165
def instance
  @instance ||= Instance.new :aws => @aws, :name => instance_name
end
instance_name() click to toggle source
# File lib/roark/ami.rb, line 153
def instance_name
  @name.downcase.gsub /[^a-zA-Z0-9\-]/, '-'
end
tag(tags) click to toggle source
# File lib/roark/ami.rb, line 161
def tag(tags)
  ec2_ami_tags.add :ami_id => @ami_id, :tags => tags
end