class Formatron::CloudFormation::Template::VPC::Subnet::Instance

generates CloudFormation instance resources rubocop:disable Metrics/ClassLength

Constants

INSTANCE_PREFIX
INSTANCE_PROFILE_PREFIX
PRIVATE_ALIAS_RECORD_SET_PREFIX
PRIVATE_RECORD_SET_PREFIX
PUBLIC_ALIAS_RECORD_SET_PREFIX
PUBLIC_RECORD_SET_PREFIX
ROLE_PREFIX
VOLUME_ATTACHMENT_PREFIX
VOLUME_PREFIX
WAIT_CONDITION_HANDLE_PREFIX
WAIT_CONDITION_PREFIX

Public Class Methods

new( instance:, key_pair:, administrator_name:, administrator_password:, availability_zone:, subnet_guid:, hosted_zone_name:, vpc_guid:, vpc_cidr:, kms_key:, private_hosted_zone_id:, public_hosted_zone_id:, bucket:, name:, target: ) click to toggle source

rubocop:disable Metrics/MethodLength rubocop:disable Metrics/AbcSize rubocop:disable Metrics/ParameterLists

# File lib/formatron/cloud_formation/template/vpc/subnet/instance.rb, line 33
def initialize(
  instance:,
  key_pair:,
  administrator_name:,
  administrator_password:,
  availability_zone:,
  subnet_guid:,
  hosted_zone_name:,
  vpc_guid:,
  vpc_cidr:,
  kms_key:,
  private_hosted_zone_id:,
  public_hosted_zone_id:,
  bucket:,
  name:,
  target:
)
  @instance = instance
  @guid = @instance.guid
  @setup = @instance.setup
  @block_devices = @instance.block_device
  @instance_id = "#{INSTANCE_PREFIX}#{@guid}"
  @role_id = "#{ROLE_PREFIX}#{@guid}"
  @instance_profile_id = "#{INSTANCE_PROFILE_PREFIX}#{@guid}"
  @wait_condition_handle_id =
    "#{WAIT_CONDITION_HANDLE_PREFIX}#{@guid}"
  @wait_condition_id =
    "#{WAIT_CONDITION_PREFIX}#{@guid}"
  @policy = @instance.policy
  @security_group = @instance.security_group
  @security_group_id =
    "#{SecurityGroup::SECURITY_GROUP_PREFIX}#{@guid}"
  @availability_zone = availability_zone
  @instance_type = @instance.instance_type || 't2.micro'
  @os = @instance.os || 'ubuntu'
  @ami = @instance.ami
  @key_pair = key_pair
  @administrator_name = administrator_name
  @administrator_password = administrator_password
  @subnet_guid = subnet_guid
  @subnet_id = "#{Subnet::SUBNET_PREFIX}#{@subnet_guid}"
  @sub_domain = @instance.sub_domain
  @hosted_zone_name = hosted_zone_name
  @source_dest_check = @instance.source_dest_check
  @source_dest_check =
    @source_dest_check.nil? ? true : @source_dest_check
  @vpc_guid = vpc_guid
  @vpc_cidr = vpc_cidr
  @kms_key = kms_key
  @private_hosted_zone_id = private_hosted_zone_id
  @public_hosted_zone_id = public_hosted_zone_id
  @private_record_set_id =
    "#{PRIVATE_RECORD_SET_PREFIX}#{@guid}"
  @public_record_set_id =
    "#{PUBLIC_RECORD_SET_PREFIX}#{@guid}"
  @public_aliases = @instance.public_alias
  @private_aliases = @instance.private_alias
  @volumes = @instance.volume
  @bucket = bucket
  @name = name
  @target = target
end

Public Instance Methods

merge(resources:, outputs:) click to toggle source

rubocop:disable Metrics/MethodLength rubocop:disable Metrics/AbcSize

# File lib/formatron/cloud_formation/template/vpc/subnet/instance.rb, line 101
def merge(resources:, outputs:)
  @outputs = outputs
  resources[@role_id] = Resources::IAM.role
  resources[@instance_profile_id] = Resources::IAM.instance_profile(
    role: @role_id
  )
  policy = Policy.new(
    policy: @policy,
    instance_guid: @guid,
    kms_key: @kms_key,
    bucket: @bucket,
    name: @name,
    target: @target
  )
  policy.merge resources: resources
  security_group = SecurityGroup.new(
    os: @os,
    security_group: @security_group,
    instance_guid: @guid,
    vpc_guid: @vpc_guid,
    vpc_cidr: @vpc_cidr
  )
  security_group.merge resources: resources
  resources[@wait_condition_handle_id] =
    Resources::CloudFormation.wait_condition_handle
  instance = Resources::EC2.instance(
    instance_profile: @instance_profile_id,
    availability_zone: @availability_zone,
    instance_type: @instance_type,
    key_name: @key_pair,
    administrator_name: @administrator_name,
    administrator_password: @administrator_password,
    subnet: @subnet_id,
    name: "#{@sub_domain}.#{@hosted_zone_name}",
    wait_condition_handle: @wait_condition_handle_id,
    security_group: @security_group_id,
    logical_id: @instance_id,
    source_dest_check: @source_dest_check,
    os: @os,
    ami: @ami
  )
  setup = Setup.new(
    setup: @setup,
    sub_domain: @sub_domain,
    hosted_zone_name: @hosted_zone_name,
    os: @os,
    wait_condition_handle: @wait_condition_handle_id
  )
  setup.merge instance: instance
  block_devices = BlockDevices.new(
    block_devices: @block_devices
  )
  block_devices.merge properties: instance[:Properties]
  resources[@instance_id] = instance
  outputs[@instance_id] = Template.output(
    Template.ref(@instance_id)
  )
  resources[@wait_condition_id] =
    Resources::CloudFormation.wait_condition(
      wait_condition_handle: @wait_condition_handle_id,
      instance: @instance_id
    )
  resources[@private_record_set_id] =
    Resources::Route53.record_set(
      hosted_zone_id: Template.ref(@private_hosted_zone_id),
      sub_domain: @sub_domain,
      hosted_zone_name: @hosted_zone_name,
      instance: @instance_id,
      attribute: 'PrivateIp'
    )
  resources[@public_record_set_id] =
    Resources::Route53.record_set(
      hosted_zone_id: @public_hosted_zone_id,
      sub_domain: @sub_domain,
      hosted_zone_name: @hosted_zone_name,
      instance: @instance_id,
      attribute: 'PublicIp'
    ) unless @public_hosted_zone_id.nil?
  _add_public_aliases resources unless @public_hosted_zone_id.nil?
  _add_private_aliases resources
  _add_volumes resources
end

Private Instance Methods

_add_private_aliases(resources) click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/formatron/cloud_formation/template/vpc/subnet/instance.rb, line 203
def _add_private_aliases(resources)
  @private_aliases.each_index do |index|
    sub_domain = @private_aliases[index]
    logical_id =
      "#{PRIVATE_ALIAS_RECORD_SET_PREFIX}#{index}#{@guid}"
    resources[logical_id] = Resources::Route53.record_set(
      hosted_zone_id: Template.ref(@private_hosted_zone_id),
      sub_domain: sub_domain,
      hosted_zone_name: @hosted_zone_name,
      instance: @instance_id,
      attribute: 'PrivateIp'
    )
  end
end
_add_public_aliases(resources) click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/formatron/cloud_formation/template/vpc/subnet/instance.rb, line 187
def _add_public_aliases(resources)
  @public_aliases.each_index do |index|
    sub_domain = @public_aliases[index]
    logical_id = "#{PUBLIC_ALIAS_RECORD_SET_PREFIX}#{index}#{@guid}"
    resources[logical_id] = Resources::Route53.record_set(
      hosted_zone_id: @public_hosted_zone_id,
      sub_domain: sub_domain,
      hosted_zone_name: @hosted_zone_name,
      instance: @instance_id,
      attribute: 'PublicIp'
    )
  end
end
_add_volumes(resources) click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/formatron/cloud_formation/template/vpc/subnet/instance.rb, line 220
def _add_volumes(resources)
  @volumes.each_index do |index|
    volume = @volumes[index]
    volume_id = "#{VOLUME_PREFIX}#{index}#{@guid}"
    volume_attachment_id =
      "#{VOLUME_ATTACHMENT_PREFIX}#{index}#{@guid}"
    resources[volume_id] = Resources::EC2.volume(
      availability_zone: @availability_zone,
      size: volume.size,
      type: volume.type,
      iops: volume.iops
    )
    resources[volume_attachment_id] =
      Resources::EC2.volume_attachment(
        device: volume.device,
        instance: "#{INSTANCE_PREFIX}#{@guid}",
        volume: volume_id
      )
  end
end