diff --git a/modules/net-cloudnat/README.md b/modules/net-cloudnat/README.md index 6d30f03925..b3848ee001 100644 --- a/modules/net-cloudnat/README.md +++ b/modules/net-cloudnat/README.md @@ -7,6 +7,7 @@ Simple Cloud NAT management, with optional router creation. - [Subnetwork configuration](#subnetwork-configuration) - [Reserved IPs and custom rules](#reserved-ips-and-custom-rules) - [Hybrid NAT](#hybrid-nat) +- [NAT for Proxy net or Secure Web Proxy](#nat-for-proxy-net-or-secure-web-proxy) - [Variables](#variables) - [Outputs](#outputs) @@ -156,25 +157,41 @@ module "vpc1-nat" { } # tftest modules=2 resources=7 inventory=hybrid.yaml ``` + +## NAT for Proxy net or Secure Web Proxy +By default NAT is provided only for VMs (`ENDPOINT_TYPE_VM`). You can also define endpoint type for managed proxy (`ENDPOINT_TYPE_MANAGED_PROXY_LB`) or Secure Web Proxy (`ENDPOINT_TYPE_SWG`). Currently only one `endpoint_type` can be provided per NAT instance. + +```hcl +module "nat" { + source = "./fabric/modules/net-cloudnat" + project_id = var.project_id + region = var.region + name = "default" + endpoint_types = ["ENDPOINT_TYPE_MANAGED_PROXY_LB"] + router_network = var.vpc.self_link +} +# tftest modules=1 resources=2 inventory=proxy-net-nat.yaml e2e +``` ## Variables | name | description | type | required | default | |---|---|:---:|:---:|:---:| -| [name](variables.tf#L77) | Name of the Cloud NAT resource. | string | ✓ | | -| [project_id](variables.tf#L82) | Project where resources will be created. | string | ✓ | | -| [region](variables.tf#L87) | Region where resources will be created. | string | ✓ | | +| [name](variables.tf#L92) | Name of the Cloud NAT resource. | string | ✓ | | +| [project_id](variables.tf#L97) | Project where resources will be created. | string | ✓ | | +| [region](variables.tf#L102) | Region where resources will be created. | string | ✓ | | | [addresses](variables.tf#L17) | Optional list of external address self links. | list(string) | | [] | | [config_port_allocation](variables.tf#L23) | Configuration for how to assign ports to virtual machines. min_ports_per_vm and max_ports_per_vm have no effect unless enable_dynamic_port_allocation is set to 'true'. | object({…}) | | {} | | [config_source_subnetworks](variables.tf#L39) | Subnetwork configuration. | object({…}) | | {} | -| [config_timeouts](variables.tf#L58) | Timeout configurations. | object({…}) | | {} | -| [logging_filter](variables.tf#L71) | Enables logging if not null, value is one of 'ERRORS_ONLY', 'TRANSLATIONS_ONLY', 'ALL'. | string | | null | -| [router_asn](variables.tf#L92) | Router ASN used for auto-created router. | number | | null | -| [router_create](variables.tf#L98) | Create router. | bool | | true | -| [router_name](variables.tf#L104) | Router name, leave blank if router will be created to use auto generated name. | string | | null | -| [router_network](variables.tf#L110) | Name of the VPC used for auto-created router. | string | | null | -| [rules](variables.tf#L116) | List of rules associated with this NAT. | list(object({…})) | | [] | -| [type](variables.tf#L136) | Whether this Cloud NAT is used for public or private IP translation. One of 'PUBLIC' or 'PRIVATE'. | string | | "PUBLIC" | +| [config_timeouts](variables.tf#L54) | Timeout configurations. | object({…}) | | {} | +| [endpoint_types](variables.tf#L67) | Specifies the endpoint Types supported by the NAT Gateway. Supported values include: ENDPOINT_TYPE_VM, ENDPOINT_TYPE_SWG, ENDPOINT_TYPE_MANAGED_PROXY_LB. | list(string) | | null | +| [logging_filter](variables.tf#L86) | Enables logging if not null, value is one of 'ERRORS_ONLY', 'TRANSLATIONS_ONLY', 'ALL'. | string | | null | +| [router_asn](variables.tf#L107) | Router ASN used for auto-created router. | number | | null | +| [router_create](variables.tf#L113) | Create router. | bool | | true | +| [router_name](variables.tf#L119) | Router name, leave blank if router will be created to use auto generated name. | string | | null | +| [router_network](variables.tf#L125) | Name of the VPC used for auto-created router. | string | | null | +| [rules](variables.tf#L131) | List of rules associated with this NAT. | list(object({…})) | | [] | +| [type](variables.tf#L151) | Whether this Cloud NAT is used for public or private IP translation. One of 'PUBLIC' or 'PRIVATE'. | string | | "PUBLIC" | ## Outputs diff --git a/modules/net-cloudnat/main.tf b/modules/net-cloudnat/main.tf index bf5b7bc785..b5fc4a6cea 100644 --- a/modules/net-cloudnat/main.tf +++ b/modules/net-cloudnat/main.tf @@ -47,13 +47,14 @@ resource "google_compute_router" "router" { } resource "google_compute_router_nat" "nat" { - provider = google-beta - project = var.project_id - region = var.region - name = var.name - type = var.type - router = local.router_name - nat_ips = var.addresses + provider = google-beta + project = var.project_id + region = var.region + name = var.name + endpoint_types = var.endpoint_types + type = var.type + router = local.router_name + nat_ips = var.addresses nat_ip_allocate_option = ( var.type == "PRIVATE" ? null @@ -128,4 +129,3 @@ resource "google_compute_router_nat" "nat" { } } } - diff --git a/modules/net-cloudnat/variables.tf b/modules/net-cloudnat/variables.tf index d8ca6413c2..b7f5216410 100644 --- a/modules/net-cloudnat/variables.tf +++ b/modules/net-cloudnat/variables.tf @@ -51,10 +51,6 @@ variable "config_source_subnetworks" { default = {} } -output "foo" { - value = var.config_source_subnetworks.subnetworks -} - variable "config_timeouts" { description = "Timeout configurations." type = object({ @@ -68,6 +64,25 @@ variable "config_timeouts" { nullable = false } +variable "endpoint_types" { + description = "Specifies the endpoint Types supported by the NAT Gateway. Supported values include: ENDPOINT_TYPE_VM, ENDPOINT_TYPE_SWG, ENDPOINT_TYPE_MANAGED_PROXY_LB." + type = list(string) + default = null + validation { + condition = (var.endpoint_types == null ? true : setunion([ + "ENDPOINT_TYPE_VM", + "ENDPOINT_TYPE_SWG", + "ENDPOINT_TYPE_MANAGED_PROXY_LB", + ], var.endpoint_types) == toset([ + "ENDPOINT_TYPE_VM", + "ENDPOINT_TYPE_SWG", + "ENDPOINT_TYPE_MANAGED_PROXY_LB", + ]) + ) + error_message = "Proivde one of: ENDPOINT_TYPE_VM, ENDPOINT_TYPE_SWG or ENDPOINT_TYPE_MANAGED_PROXY_LB as endpoint_types" + } +} + variable "logging_filter" { description = "Enables logging if not null, value is one of 'ERRORS_ONLY', 'TRANSLATIONS_ONLY', 'ALL'." type = string diff --git a/tests/modules/net_cloudnat/examples/proxy-net-nat.yaml b/tests/modules/net_cloudnat/examples/proxy-net-nat.yaml new file mode 100644 index 0000000000..ff3148c00b --- /dev/null +++ b/tests/modules/net_cloudnat/examples/proxy-net-nat.yaml @@ -0,0 +1,31 @@ +# Copyright 2024 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. +# + +values: + module.nat.google_compute_router.router[0]: + name: default-nat + network: projects/xxx/global/networks/aaa + project: project-id + region: europe-west8 + module.nat.google_compute_router_nat.nat: + endpoint_types: + - ENDPOINT_TYPE_MANAGED_PROXY_LB + icmp_idle_timeout_sec: 30 + name: default + project: project-id + region: europe-west8 + router: default-nat + source_subnetwork_ip_ranges_to_nat: ALL_SUBNETWORKS_ALL_IP_RANGES + type: PUBLIC diff --git a/tools/pre-commit-tfdoc.sh b/tools/pre-commit-tfdoc.sh index 0743f8f56f..b2c5b67645 100755 --- a/tools/pre-commit-tfdoc.sh +++ b/tools/pre-commit-tfdoc.sh @@ -17,6 +17,8 @@ set -e SCRIPT_DIR=$(dirname -- "$(readlink -f -- "$0")") +TFDOC_CMD="${SCRIPT_DIR}/tfdoc.py" +CHECKDOC_CMD="${SCRIPT_DIR}/check_documentation.py" for file in "$@"; do if [ -d "${file}" ]; then @@ -28,4 +30,4 @@ for file in "$@"; do echo "${dir}" fi -done | sort | uniq | xargs -I {} /bin/sh -c "echo python \"${SCRIPT_DIR}/tfdoc.py\" {} ; python \"${SCRIPT_DIR}/tfdoc.py\" {}" +done | sort | uniq | xargs -I {} /bin/sh -c "echo python \"${TFDOC_CMD}\" {} ; python \"${TFDOC_CMD}\" {} ; echo python \"${CHECKDOC_CMD}\" {} ; python \"${CHECKDOC_CMD}\" {}"