class Awsom::InstanceDSL

Attributes

setup_proc[R]

Public Class Methods

new(name, subnet_id:, vpc_id:) click to toggle source
# File lib/awsom/instance_dsl.rb, line 7
def initialize(name, subnet_id:, vpc_id:)
  @name = name
  @subnet_id = subnet_id
  @vpc_id = vpc_id
  @volumes = {}
  @security_groups = []
  @attrs = {
    image_id: nil,
    key_name: nil,
    size: nil,
    associate_public_ip_address: true,
    credits: "unlimited",
    term_protect: false,
  }
  @setup_proc = nil
end

Public Instance Methods

include_config(pr) click to toggle source
# File lib/awsom/instance_dsl.rb, line 32
def include_config(pr)
  instance_eval(&pr) if pr
end
read(&block) click to toggle source
# File lib/awsom/instance_dsl.rb, line 24
def read(&block)
  instance_eval(&block)
end
run_params() click to toggle source
# File lib/awsom/instance_dsl.rb, line 28
def run_params
  params
end

Private Instance Methods

associate_public_ip_address(val) click to toggle source
# File lib/awsom/instance_dsl.rb, line 66
def associate_public_ip_address(val)
  set :associate_public_ip_address, val
end
get(key) click to toggle source
# File lib/awsom/instance_dsl.rb, line 43
def get(key)
  val = @attrs[key]
  raise Error, "key #{key} not found" if val.nil?
  val
end
image_id(val) click to toggle source
# File lib/awsom/instance_dsl.rb, line 62
def image_id(val)
  set :image_id, val
end
key_name(val) click to toggle source
# File lib/awsom/instance_dsl.rb, line 70
def key_name(val)
  set :key_name, val
end
load_ami_volumes() click to toggle source
# File lib/awsom/instance_dsl.rb, line 89
def load_ami_volumes
  Image.block_device_mappings(get :image_id).each do |m|
    name = m.device_name
    ebs = m.ebs.to_h
    if @volumes.key?(name)
      @volumes[name][:ebs].merge!(ebs) { |k, old, new| old }
    else
      @volumes[name] = { device_name: name, ebs: ebs }
    end
  end
end
network_interfaces() click to toggle source
# File lib/awsom/instance_dsl.rb, line 101
def network_interfaces
  groups = @security_groups.map do |i|
    SecurityGroup.id(i, @vpc_id)
  end
  
  netif = {
    associate_public_ip_address: get(:associate_public_ip_address),
    delete_on_termination: true,
    device_index: 0,
    groups: groups,
    subnet_id: @subnet_id
  }
  [netif]
end
params() click to toggle source
# File lib/awsom/instance_dsl.rb, line 116
def params
  load_ami_volumes
  tag_specifications = [
    { resource_type: "instance", tags: [ { key: "Name", value: @name } ] },
    { resource_type: "volume", tags: [ { key: "Name", value: @name } ] }
  ]

  params = {
    image_id: get(:image_id),
    instance_type: get(:size),
    key_name: get(:key_name),
    disable_api_termination: get(:term_protect),
    block_device_mappings: @volumes.values,
    network_interfaces: network_interfaces,
    tag_specifications: tag_specifications,
    min_count: 1,
    max_count: 1
  }

  params[:credit_specification] = { cpu_credits: get(:credits) } if get(:size) =~ /\At[23]/
  params
end
security_groups(val) click to toggle source
# File lib/awsom/instance_dsl.rb, line 85
def security_groups(val)
  @security_groups = Set.new(val)
end
set(key, val) click to toggle source
# File lib/awsom/instance_dsl.rb, line 38
def set(key, val)
  raise Error, "unknown attr #{key}" if not @attrs.key?(key)
  @attrs[key] = val
end
setup(&block) click to toggle source
# File lib/awsom/instance_dsl.rb, line 49
def setup(&block)
  @setup_proc = block
end
setup_salt(template, &block) click to toggle source
# File lib/awsom/instance_dsl.rb, line 53
def setup_salt(template, &block)
  require_relative 'salt_bootstrap'
  @setup_proc = Proc.new do |instance|
    ip = instance.private_ip_address
    bootstrap = SaltBootstrap.new(@name, ip: ip, template: template)
    bootstrap.run
  end
end
size(val) click to toggle source
# File lib/awsom/instance_dsl.rb, line 74
def size(val)
  set :size, val
end
volume(name, size:, **opts) click to toggle source
# File lib/awsom/instance_dsl.rb, line 78
def volume(name, size:, **opts)
  ebs = { delete_on_termination: false, volume_type: "gp2", iops: nil }
  ebs[:volume_size] = size
  ebs.merge!(opts)
  @volumes[name] = { device_name: name, ebs: ebs }
end