modules/gcve-service-networking/main.tf (134 lines of code) (raw):

/** * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ locals { subnets = { for x in var.subnets : "${x.subnet_region}/${x.subnet_name}" => x } peer_project_id = element(split("/", data.google_compute_network_peering.servicenetworking.peer_network), 6) gcve_network_name = var.create_gcve_network ? google_vmwareengine_network.gcve_network[0].name : data.google_vmwareengine_network.gcve_network[0].name } data "google_compute_network" "network" { count = var.create_network ? 0 : 1 project = var.project_id name = var.network_name } resource "google_compute_network" "network" { count = var.create_network ? 1 : 0 name = var.network_name auto_create_subnetworks = var.auto_create_subnetworks routing_mode = var.routing_mode project = var.project_id description = var.network_description delete_default_routes_on_create = var.delete_default_internet_gateway_routes mtu = var.mtu } resource "google_compute_subnetwork" "subnetwork" { for_each = local.subnets name = each.value.subnet_name ip_cidr_range = each.value.subnet_ip region = each.value.subnet_region private_ip_google_access = lookup(each.value, "subnet_private_access", "false") private_ipv6_google_access = lookup(each.value, "subnet_private_ipv6_access", null) dynamic "log_config" { for_each = lookup(each.value, "subnet_flow_logs", false) ? [{ aggregation_interval = lookup(each.value, "subnet_flow_logs_interval", "INTERVAL_5_SEC") flow_sampling = lookup(each.value, "subnet_flow_logs_sampling", "0.5") metadata = lookup(each.value, "subnet_flow_logs_metadata", "INCLUDE_ALL_METADATA") filter_expr = lookup(each.value, "subnet_flow_logs_filter", "true") }] : [] content { aggregation_interval = log_config.value.aggregation_interval flow_sampling = log_config.value.flow_sampling metadata = log_config.value.metadata filter_expr = log_config.value.filter_expr } } network = var.create_network ? google_compute_network.network[0].id : data.google_compute_network.network[0].id project = var.project_id description = lookup(each.value, "description", null) secondary_ip_range = [ for i in range( length( contains( keys(var.secondary_ranges), each.value.subnet_name) == true ? var.secondary_ranges[each.value.subnet_name] : [] )) : var.secondary_ranges[each.value.subnet_name][i] ] purpose = lookup(each.value, "purpose", null) role = lookup(each.value, "role", null) stack_type = lookup(each.value, "stack", null) ipv6_access_type = lookup(each.value, "ipv6_type", null) } resource "google_compute_global_address" "private_ip_alloc" { for_each = var.private_ip_allocation_details project = var.project_id name = each.key address = each.value.address purpose = var.address_purpose address_type = var.address_type prefix_length = each.value.prefix_length network = var.create_network ? google_compute_network.network[0].id : data.google_compute_network.network[0].id } resource "google_service_networking_connection" "gcve_psa" { network = var.create_network ? google_compute_network.network[0].id : data.google_compute_network.network[0].id service = var.service reserved_peering_ranges = [google_compute_global_address.private_ip_alloc[var.primary_private_ip_alloc].name] depends_on = [google_compute_network.network] } resource "google_compute_network_peering_routes_config" "peering_routes" { project = var.project_id peering = var.peering network = var.create_network ? google_compute_network.network[0].name : var.network_name import_custom_routes = true export_custom_routes = true depends_on = [google_service_networking_connection.gcve_psa] } data "google_compute_network_peering" "servicenetworking" { name = "servicenetworking-googleapis-com" network = google_compute_network.network[0].self_link depends_on = [ google_compute_network_peering_routes_config.peering_routes, google_service_networking_connection.gcve_psa, google_compute_global_address.private_ip_alloc ] } data "google_vmwareengine_network" "gcve_network" { count = var.create_gcve_network ? 0 : 1 provider = google-beta name = var.gcve_network_name location = var.gcve_network_location } resource "google_vmwareengine_network" "gcve_network" { count = var.create_gcve_network ? 1 : 0 provider = google-beta project = var.project_id name = var.gcve_network_name location = var.gcve_network_location type = var.gcve_network_type description = var.gcve_network_description } module "gcve_private_connection" { source = "terraform-google-modules/gcloud/google" platform = "linux" additional_components = ["beta"] create_cmd_entrypoint = "${path.module}/scripts/create_gcve_private_connection.sh" create_cmd_body = "${var.gcve_connection_name} ${var.pc_location} ${var.project_id} ${local.gcve_network_name} ${var.pc_description} ${var.pc_routing_mode} ${local.peer_project_id} ${var.pc_connection_type}" destroy_cmd_entrypoint = "${path.module}/scripts/delete_gcve_private_connection.sh" destroy_cmd_body = "${var.gcve_connection_name} ${var.pc_location} ${var.project_id}" }