class Awsom::Subnet

Public Class Methods

new(name, cidr:, az:, vpc_id:) click to toggle source
# File lib/awsom/subnet.rb, line 8
def initialize(name, cidr:, az:, vpc_id:)
  @vpc_id = vpc_id
  @name = name
  @cidr = cidr
  @az = az
end

Public Instance Methods

created() click to toggle source
# File lib/awsom/subnet.rb, line 21
def created
  id = find_id
  if id
    subnet = subnet(id)
    tag(subnet) if not tagged?(subnet)
    return id
  end
  create
end
id() click to toggle source
# File lib/awsom/subnet.rb, line 15
def id
  id = find_id
  error "specified subnet #{@name} doesn't exist in vpc #{@vpc_id}" if not id
  id
end

Private Instance Methods

create() click to toggle source
# File lib/awsom/subnet.rb, line 33
def create
  resp = Ec2.create_subnet(
    vpc_id: @vpc_id,
    cidr_block: @cidr,
    availability_zone: @availability_zone
  )
  logger.info "(#{@name}) created subnet: #{@cidr}"
  id = resp.subnet.subnet_id
  subnet = subnet(id)
  tag(subnet)
  id
rescue Aws::Errors::ServiceError, ArgumentError
  raise Error, "while creating subnet #{@name}"
end
find_id() click to toggle source
# File lib/awsom/subnet.rb, line 73
def find_id
  filters = [
    { name: "vpc-id", values: [@vpc_id.to_s] },
    { name: "cidr", values: [@cidr.to_s] }
  ]
  
  result = Ec2.describe_subnets(filters: filters)
  num_results = result.subnets.size
  raise Error, "mulitple subnets found with name #{@name}" if num_results > 1
  if num_results == 1
    subnet = result.subnets.first
    verify(subnet)
    result.subnets.first.subnet_id
  else
    false
  end
end
subnet(id) click to toggle source
# File lib/awsom/subnet.rb, line 48
def subnet(id)
  Aws::EC2::Subnet.new(id)
end
tag(subnet) click to toggle source
# File lib/awsom/subnet.rb, line 52
def tag(subnet)
  return if tagged?(subnet)
  subnet.create_tags(
    tags: [ { key: "Name", value: @name } ]
  )
  subnet.load
end
tagged?(subnet) click to toggle source
# File lib/awsom/subnet.rb, line 60
def tagged?(subnet)
  subnet.tags.any? { |tag| tag.key == "Name"}
end
verify(subnet) click to toggle source
# File lib/awsom/subnet.rb, line 64
def verify(subnet)
  error "availability zone mismatch for subnet #{@name}" if subnet.availability_zone != @az
  name_tag = subnet.tags.find { |tag| tag.key == "Name" }
  return if not name_tag
  if name_tag.value != @name
    raise Error, "subnet #{@name} already tagged with another name #{name_tag}" 
  end
end