class CreateVpc

Public Instance Methods

execute() click to toggle source
# File migrations/20130412004642_create_vpc.rb, line 2
def execute
  receipt = {}

  receipt["aws"] = config["aws"]

  vpc = Bosh::AwsCliPlugin::VPC.create(ec2, config["vpc"]["cidr"], config["vpc"]["instance_tenancy"])
  receipt["vpc"] = {"id" => vpc.vpc_id, "domain" => config["vpc"]["domain"]}

  receipt["original_configuration"] = config

  unless was_vpc_eventually_available?(vpc)
    err "VPC #{vpc.vpc_id} was not available within 60 seconds, giving up"
  end

  say "creating internet gateway"
  igw = ec2.create_internet_gateway
  vpc.attach_internet_gateway(igw.id)

  security_groups = config["vpc"]["security_groups"]
  say "creating security groups: #{security_groups.map { |group| group["name"] }.join(", ")}"
  vpc.create_security_groups(security_groups)

  subnets = config["vpc"]["subnets"]
  say "creating subnets: #{subnets.keys.join(", ")}"
  vpc.create_subnets(subnets) { |msg| say "  #{msg}" }
  vpc.create_nat_instances(subnets)
  vpc.setup_subnet_routes(subnets) { |msg| say "  #{msg}" }
  receipt["vpc"]["subnets"] = vpc.subnets

  elbs = config["vpc"]["elbs"]
  ssl_certs = config["ssl_certs"]

  say "creating load balancers: #{elbs.keys.join(", ")}" if elbs
  elbs.each do |name, settings|
    settings["domain"] = config["vpc"]["domain"]
    e = elb.create(name, vpc, settings, ssl_certs)
    if settings["dns_record"]
      say "adding CNAME record for #{settings["dns_record"]}.#{config["vpc"]["domain"]}"
      route53.add_record(settings["dns_record"], config["vpc"]["domain"], [e.dns_name], {ttl: settings["ttl"], type: 'CNAME'})
    end
  end

  dhcp_options = config["vpc"]["dhcp_options"]
  say "creating DHCP options"
  vpc.create_dhcp_options(dhcp_options)
rescue Bosh::AwsCliPlugin::ELB::BadCertificateError => e
  err e.message
ensure
  save_receipt("aws_vpc_receipt", receipt)
end

Private Instance Methods

was_vpc_eventually_available?(vpc) click to toggle source
# File migrations/20130412004642_create_vpc.rb, line 55
def was_vpc_eventually_available?(vpc)
  (1..60).any? do |attempt|
    begin
      sleep 1 unless attempt == 1
      vpc.state.to_s == "available"
    rescue Exception => e
      say("Waiting for vpc, continuing after #{e.class}: #{e.message}")
    end
  end
end