lib/terraforming/resource/route_table.rb
module Terraforming
module Resource
class RouteTable
include Terraforming::Util
def self.tf(client: Aws::EC2::Client.new)
self.new(client).tf
end
def self.tfstate(client: Aws::EC2::Client.new)
self.new(client).tfstate
end
def initialize(client)
@client = client
end
def tf
apply_template(@client, "tf/route_table")
end
def tfstate
route_tables.inject({}) do |resources, route_table|
attributes = {
"id" => route_table.route_table_id,
"vpc_id" => route_table.vpc_id,
}
attributes.merge!(tags_attributes_of(route_table))
attributes.merge!(routes_attributes_of(route_table))
attributes.merge!(propagating_vgws_attributes_of(route_table))
resources["aws_route_table.#{module_name_of(route_table)}"] = {
"type" => "aws_route_table",
"primary" => {
"id" => route_table.route_table_id,
"attributes" => attributes
}
}
resources
end
end
private
def routes_of(route_table)
route_table.routes.reject do |route|
route.gateway_id.to_s == 'local' ||
route.origin.to_s == 'EnableVgwRoutePropagation' ||
route.destination_prefix_list_id
end
end
def module_name_of(route_table)
normalize_module_name(name_from_tag(route_table, route_table.route_table_id))
end
def route_tables
@client.describe_route_tables.map(&:route_tables).flatten
end
def routes_attributes_of(route_table)
routes = routes_of(route_table)
attributes = { "route.#" => routes.length.to_s }
routes.each do |route|
attributes.merge!(route_attributes_of(route))
end
attributes
end
def route_attributes_of(route)
hashcode = route_hashcode_of(route)
attributes = {
"route.#{hashcode}.cidr_block" => route.destination_cidr_block.to_s,
"route.#{hashcode}.gateway_id" => route.gateway_id.to_s,
"route.#{hashcode}.instance_id" => route.instance_id.to_s,
"route.#{hashcode}.network_interface_id" => route.network_interface_id.to_s,
"route.#{hashcode}.vpc_peering_connection_id" => route.vpc_peering_connection_id.to_s
}
attributes
end
def route_hashcode_of(route)
string = "#{route.destination_cidr_block}-#{route.gateway_id}-"
instance_set = !route.instance_id.nil? && route.instance_id != ''
string << route.instance_id.to_s if instance_set
string << route.vpc_peering_connection_id.to_s
string << route.network_interface_id.to_s unless instance_set
Zlib.crc32(string)
end
def propagaving_vgws_of(route_table)
route_table.propagating_vgws.map(&:gateway_id).map(&:to_s)
end
def propagating_vgws_attributes_of(route_table)
vgws = propagaving_vgws_of(route_table)
attributes = { "propagating_vgws.#" => vgws.length.to_s }
vgws.each do |gateway_id|
hashcode = Zlib.crc32(gateway_id)
attributes["propagating_vgws.#{hashcode}"] = gateway_id
end
attributes
end
def tags_attributes_of(route_table)
tags = route_table.tags
attributes = { "tags.#" => tags.length.to_s }
tags.each { |tag| attributes["tags.#{tag.key}"] = tag.value }
attributes
end
end
end
end