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

generates CloudFormation subnet resources rubocop:disable Metrics/ClassLength

Constants

SUBNET_PREFIX
SUBNET_ROUTE_TABLE_ASSOCIATION_PREFIX

Public Class Methods

new( subnet:, external:, vpc_guid:, vpc_cidr:, key_pair:, administrator_name:, administrator_password:, hosted_zone_name:, kms_key:, nats:, private_hosted_zone_id:, public_hosted_zone_id:, bucket:, name:, target: ) click to toggle source

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

# File lib/formatron/cloud_formation/template/vpc/subnet.rb, line 22
def initialize(
  subnet:,
  external:,
  vpc_guid:,
  vpc_cidr:,
  key_pair:,
  administrator_name:,
  administrator_password:,
  hosted_zone_name:,
  kms_key:,
  nats:,
  private_hosted_zone_id:,
  public_hosted_zone_id:,
  bucket:,
  name:,
  target:
)
  @subnet = subnet
  @external = external
  @vpc_guid = vpc_guid
  @vpc_cidr = vpc_cidr
  @cidr = @subnet.cidr
  @acl = @subnet.acl
  @key_pair = key_pair
  @administrator_name = administrator_name
  @administrator_password = administrator_password
  @hosted_zone_name = hosted_zone_name
  @kms_key = kms_key
  @nats = nats
  @private_hosted_zone_id = private_hosted_zone_id
  @public_hosted_zone_id = public_hosted_zone_id
  @bucket = bucket
  @name = name
  @target = target
end

Public Instance Methods

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

rubocop:disable Metrics/MethodLength

# File lib/formatron/cloud_formation/template/vpc/subnet.rb, line 62
def merge(resources:, outputs:)
  @guid = @subnet.guid
  if @guid.nil?
    @guid = @external.guid
    _merge_external resources: resources, outputs: outputs
  else
    _merge_local resources: resources, outputs: outputs
  end
end

Private Instance Methods

_add_acl(resources) click to toggle source
# File lib/formatron/cloud_formation/template/vpc/subnet.rb, line 173
def _add_acl(resources)
  acl = ACL.new(
    acl: @acl,
    subnet_guid: @guid,
    vpc_guid: @vpc_guid,
    vpc_cidr: @vpc_cidr
  )
  acl.merge resources: resources
end
_add_subnet(resources, outputs) click to toggle source

rubocop:enable Metrics/MethodLength

# File lib/formatron/cloud_formation/template/vpc/subnet.rb, line 150
def _add_subnet(resources, outputs)
  resources[@subnet_id] = Resources::EC2.subnet(
    vpc: @vpc_id,
    cidr: @cidr,
    availability_zone: @availability_zone,
    map_public_ip_on_launch: @gateway.nil?
  )
  outputs[@subnet_id] = Template.output Template.ref(@subnet_id)
end
_add_subnet_route_table_association(resources) click to toggle source
# File lib/formatron/cloud_formation/template/vpc/subnet.rb, line 160
def _add_subnet_route_table_association(resources)
  route_table = @public_route_table_id
  unless @gateway.nil?
    gateway_guid = @nats[@gateway].guid
    route_table = "#{NAT::ROUTE_TABLE_PREFIX}#{gateway_guid}"
  end
  resources[@subnet_route_table_association_id] =
    Resources::EC2.subnet_route_table_association(
      route_table: route_table,
      subnet: @subnet_id
    )
end
_merge_external(resources:, outputs:) click to toggle source
# File lib/formatron/cloud_formation/template/vpc/subnet.rb, line 72
def _merge_external(resources:, outputs:)
  @gateway = @external.gateway
  @availability_zone = @external.availability_zone
  {
    nat: NAT,
    bastion: Bastion,
    chef_server: ChefServer,
    instance: Instance
  }.each do |symbol, cls|
    @subnet.send(symbol).each do |_, instance|
      args = {
        symbol => instance,
        key_pair: @key_pair,
        administrator_name: @administrator_name,
        administrator_password: @administrator_password,
        availability_zone: @availability_zone,
        subnet_guid: @guid,
        hosted_zone_name: @hosted_zone_name,
        vpc_guid: @vpc_guid,
        vpc_cidr: @vpc_cidr,
        kms_key: @kms_key,
        private_hosted_zone_id: @private_hosted_zone_id,
        public_hosted_zone_id:
          @gateway.nil? ? @public_hosted_zone_id : nil,
        bucket: @bucket,
        name: @name,
        target: @target
      }
      instance = cls.new(**args)
      instance.merge resources: resources, outputs: outputs
    end
  end
end
_merge_local(resources:, outputs:) click to toggle source
# File lib/formatron/cloud_formation/template/vpc/subnet.rb, line 106
def _merge_local(resources:, outputs:)
  @subnet_id = "#{SUBNET_PREFIX}#{@guid}"
  @subnet_route_table_association_id =
    "#{SUBNET_ROUTE_TABLE_ASSOCIATION_PREFIX}#{@guid}"
  @vpc_id = "#{VPC::VPC_PREFIX}#{@vpc_guid}"
  @public_route_table_id =
    "#{VPC::ROUTE_TABLE_PREFIX}#{@vpc_guid}"
  @gateway = @subnet.gateway
  @availability_zone = @subnet.availability_zone
  {
    nat: NAT,
    bastion: Bastion,
    chef_server: ChefServer,
    instance: Instance
  }.each do |symbol, cls|
    @subnet.send(symbol).each do |_, instance|
      args = {
        symbol => instance,
        key_pair: @key_pair,
        administrator_name: @administrator_name,
        administrator_password: @administrator_password,
        availability_zone: @availability_zone,
        subnet_guid: @guid,
        hosted_zone_name: @hosted_zone_name,
        vpc_guid: @vpc_guid,
        vpc_cidr: @vpc_cidr,
        kms_key: @kms_key,
        private_hosted_zone_id: @private_hosted_zone_id,
        public_hosted_zone_id:
          @gateway.nil? ? @public_hosted_zone_id : nil,
        bucket: @bucket,
        name: @name,
        target: @target
      }
      instance = cls.new(**args)
      instance.merge resources: resources, outputs: outputs
    end
  end
  _add_subnet resources, outputs
  _add_subnet_route_table_association resources
  _add_acl resources if @acl && @gateway.nil?
end