locals.routing.tf (101 lines of code) (raw):
# Route Tables
locals {
create_route_tables_firewall = { for key, value in var.hub_virtual_networks : key => value.firewall != null || value.hub_router_ip_address != null }
create_route_tables_user_subnets = { for key, value in var.hub_virtual_networks : key => value.firewall != null || value.hub_router_ip_address != null }
route_tables_firewall = { for key, value in var.hub_virtual_networks : key => value if local.create_route_tables_firewall[key] || length(value.route_table_entries_firewall) > 0 }
route_tables_user_subnets = { for key, value in var.hub_virtual_networks : key => value if local.create_route_tables_user_subnets[key] || length(value.route_table_entries_user_subnets) > 0 }
}
# Final Routes
locals {
final_route_map_firewall = merge(local.mesh_route_map_firewall, local.route_table_entries_firewall)
final_route_map_user_subnets = merge(local.mesh_route_map_internet, local.mesh_route_map_user_subnets, local.route_table_entries_user_subnet)
}
# Firewall Routes
locals {
default_route_internet = {
for key, value in var.hub_virtual_networks : key => {
virtual_network_key = key
key = key
name = local.firewall_internet_route_name
address_prefix = "0.0.0.0/0"
next_hop_type = "Internet"
next_hop_in_ip_address = null
resource_group_name = try(value.resource_group_name, azurerm_resource_group.rg[key].name)
} if local.create_route_tables_firewall[key]
}
firewall_private_ip = {
for vnet_name, fw in module.hub_firewalls : vnet_name => fw.resource.ip_configuration[0].private_ip_address
}
mesh_route_map_firewall = {
for route in flatten([
for k_src, v_src in var.hub_virtual_networks : [
for k_dst, v_dst in var.hub_virtual_networks : [
for index, cidr in v_dst.routing_address_space : {
virtual_network_key = k_src
key = "${k_src}-${k_dst}-${index}"
name = "${k_src}-${k_dst}-${replace(cidr, "/", "-")}"
address_prefix = cidr
next_hop_type = "VirtualAppliance"
next_hop_in_ip_address = try(local.firewall_private_ip[k_dst], v_dst.hub_router_ip_address)
resource_group_name = try(v_src.resource_group_name, azurerm_resource_group.rg[k_src].name)
} if k_src != k_dst && v_dst.mesh_peering_enabled && can(v_dst.routing_address_space[0]) && local.create_route_tables_firewall[k_dst]
]
] if v_src.mesh_peering_enabled
]) : route.key => route
}
route_table_entries_firewall = {
for route in flatten([
for k_src, v_src in var.hub_virtual_networks : [
for route_table_entry in v_src.route_table_entries_firewall : {
virtual_network_key = k_src
name = route_table_entry.name
address_prefix = route_table_entry.address_prefix
next_hop_type = route_table_entry.next_hop_type
next_hop_in_ip_address = route_table_entry.next_hop_ip_address
resource_group_name = try(v_src.resource_group_name, azurerm_resource_group.rg[k_src].name)
}
]
]) : route.name => route
}
}
# User Subnet and Spoke Routes
locals {
mesh_route_map_internet = {
for key, value in var.hub_virtual_networks : "${key}-internet" => {
virtual_network_key = key
key = "${key}-internet"
name = "${key}-0.0.0.0-0"
address_prefix = "0.0.0.0/0"
next_hop_type = "VirtualAppliance"
next_hop_in_ip_address = try(local.firewall_private_ip[key], value.hub_router_ip_address)
resource_group_name = try(value.resource_group_name, azurerm_resource_group.rg[key].name)
} if local.create_route_tables_user_subnets[key]
}
mesh_route_map_user_subnets = {
for route in flatten([
for k_src, v_src in var.hub_virtual_networks : [
for k_dst, v_dst in var.hub_virtual_networks : [
for index, cidr in v_dst.routing_address_space : {
virtual_network_key = k_src
key = "${k_src}-${k_dst}-${index}"
name = "${k_src}-${k_dst}-${replace(cidr, "/", "-")}"
address_prefix = cidr
next_hop_type = "VirtualAppliance"
next_hop_in_ip_address = try(local.firewall_private_ip[k_dst], v_dst.hub_router_ip_address)
resource_group_name = try(v_src.resource_group_name, azurerm_resource_group.rg[k_src].name)
} if v_dst.mesh_peering_enabled && can(v_dst.routing_address_space[0]) && local.create_route_tables_user_subnets[k_dst]
]
] if v_src.mesh_peering_enabled
]) : route.key => route
}
route_table_entries_user_subnet = {
for route in flatten([
for k_src, v_src in var.hub_virtual_networks : [
for route_table_entry in v_src.route_table_entries_user_subnets : {
virtual_network_key = k_src
name = route_table_entry.name
address_prefix = route_table_entry.address_prefix
next_hop_type = route_table_entry.next_hop_type
next_hop_in_ip_address = route_table_entry.next_hop_ip_address
resource_group_name = try(v_src.resource_group_name, azurerm_resource_group.rg[k_src].name)
}
]
]) : route.name => route
}
}