mmv1/products/compute/RouterNat.yaml (463 lines of code) (raw):
# Copyright 2024 Google Inc.
# 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.
---
name: 'RouterNat'
api_resource_type_kind: Router
description: |
A NAT service created in a router.
~> **Note:** Recreating a `google_compute_address` that is being used by `google_compute_router_nat` will give a `resourceInUseByAnotherResource` error.
Use `lifecycle.create_before_destroy` on this address resource to avoid this type of error as shown in the Manual Ips example.
references:
guides:
'Google Cloud Router': 'https://cloud.google.com/router/docs/'
api: 'https://cloud.google.com/compute/docs/reference/rest/v1/routers'
docs:
id_format: '{{project}}/{{region}}/{{router}}/{{name}}'
base_url: 'projects/{{project}}/regions/{{region}}/routers/{{router}}'
self_link: 'projects/{{project}}/regions/{{region}}/routers/{{router}}'
create_url: 'projects/{{project}}/regions/{{region}}/routers/{{router}}'
create_verb: 'PATCH'
update_url: 'projects/{{project}}/regions/{{region}}/routers/{{router}}'
update_verb: 'PATCH'
delete_url: 'projects/{{project}}/regions/{{region}}/routers/{{router}}'
delete_verb: 'PATCH'
mutex: 'router/{{region}}/{{router}}'
timeouts:
insert_minutes: 20
update_minutes: 20
delete_minutes: 20
async:
actions: ['create', 'delete', 'update']
type: 'OpAsync'
operation:
base_url: '{{op_id}}'
result:
resource_inside_response: false
collection_url_key: 'nats'
identity:
- name
nested_query:
keys:
- nats
is_list_of_ids: false
modify_by_patch: true
custom_code:
constants: 'templates/terraform/constants/router_nat.go.tmpl'
encoder: 'templates/terraform/encoders/router_nat_set_initial_nat_ips.go.tmpl'
pre_create: 'templates/terraform/constants/router_nat_validate_action_active_range.go.tmpl'
pre_update: 'templates/terraform/constants/router_nat_validate_action_active_range.go.tmpl'
custom_diff:
- 'resourceComputeRouterNatDrainNatIpsCustomDiff'
exclude_tgc: true
examples:
# These examples are not used to autogenerate tests, as fine-grained
# resources do not fit the normal test flow - we need to test deletion
# in a test step while parent resource still exists vs in CheckDestroy
# when all resources have been deleted.
- name: 'router_nat_basic'
primary_resource_id: 'nat'
vars:
router_name: 'my-router'
nat_name: 'my-router-nat'
network_name: 'my-network'
subnet_name: 'my-subnetwork'
exclude_test: true
- name: 'router_nat_manual_ips'
primary_resource_id: 'nat_manual'
vars:
router_name: 'my-router'
nat_name: 'my-router-nat'
network_name: 'my-network'
subnet_name: 'my-subnetwork'
address_name: 'nat-manual-ip'
exclude_test: true
- name: 'router_nat_rules'
primary_resource_id: 'nat_rules'
vars:
router_name: 'my-router'
nat_name: 'my-router-nat'
network_name: 'my-network'
subnet_name: 'my-subnetwork'
address_name1: 'nat-address1'
address_name2: 'nat-address2'
address_name3: 'nat-address3'
exclude_test: true
- name: 'router_nat_private'
primary_resource_id: 'nat_type'
vars:
router_name: 'my-router'
nat_name: 'my-router-nat'
network_name: 'my-network'
subnet_name: 'my-subnetwork'
hub_name: 'my-hub'
spoke_name: 'my-spoke'
exclude_test: true
parameters:
- name: 'router'
type: ResourceRef
description: |
The name of the Cloud Router in which this NAT will be configured.
url_param_only: true
required: true
immutable: true
resource: 'Router'
imports: 'name'
- name: 'region'
type: ResourceRef
description: Region where the router and NAT reside.
url_param_only: true
required: false
immutable: true
default_from_api: true
custom_flatten: 'templates/terraform/custom_flatten/name_from_self_link.tmpl'
resource: 'Region'
imports: 'name'
properties:
- name: 'name'
type: String
description: |
Name of the NAT service. The name must be 1-63 characters long and
comply with RFC1035.
required: true
immutable: true
validation:
function: 'verify.ValidateRFC1035Name(2, 63)'
- name: 'natIpAllocateOption'
type: Enum
description: |
How external IPs should be allocated for this NAT. Valid values are
`AUTO_ONLY` for only allowing NAT IPs allocated by Google Cloud
Platform, or `MANUAL_ONLY` for only user-allocated NAT IP addresses.
required: false
enum_values:
- 'MANUAL_ONLY'
- 'AUTO_ONLY'
- name: 'initialNatIps'
type: Array
description: |
Self-links of NAT IPs to be used as initial value for creation alongside a RouterNatAddress resource.
Conflicts with natIps and drainNatIps. Only valid if natIpAllocateOption is set to MANUAL_ONLY.
is_set: true
immutable: true
ignore_read: true
send_empty_value: true
conflicts:
- natIps
- drainNatIps
set_hash_func: computeRouterNatIPsHash
custom_expand: 'templates/terraform/custom_expand/array_resourceref_with_validation.go.tmpl'
item_type:
name: 'address'
type: ResourceRef
description: 'A reference to an address associated with this NAT'
resource: 'Address'
imports: 'selfLink'
- name: 'natIps'
type: Array
description: |
Self-links of NAT IPs. Only valid if natIpAllocateOption
is set to MANUAL_ONLY.
If this field is used alongside with a count created list of address resources `google_compute_address.foobar.*.self_link`,
the access level resource for the address resource must have a `lifecycle` block with `create_before_destroy = true` so
the number of resources can be increased/decreased without triggering the `resourceInUseByAnotherResource` error.
is_set: true
default_from_api: true
send_empty_value: true
set_hash_func: computeRouterNatIPsHash
custom_expand: 'templates/terraform/custom_expand/array_resourceref_with_validation.go.tmpl'
item_type:
name: 'address'
type: ResourceRef
description: 'A reference to an address associated with this NAT'
resource: 'Address'
imports: 'selfLink'
- name: 'drainNatIps'
type: Array
description: |
A list of URLs of the IP resources to be drained. These IPs must be
valid static external IPs that have been assigned to the NAT.
is_set: true
default_from_api: true
send_empty_value: true
custom_expand: 'templates/terraform/custom_expand/array_resourceref_with_validation.go.tmpl'
item_type:
name: 'address'
type: ResourceRef
description: 'A reference to an address associated with this NAT'
resource: 'Address'
imports: 'selfLink'
- name: 'sourceSubnetworkIpRangesToNat'
type: Enum
description: |
How NAT should be configured per Subnetwork.
If `ALL_SUBNETWORKS_ALL_IP_RANGES`, all of the
IP ranges in every Subnetwork are allowed to Nat.
If `ALL_SUBNETWORKS_ALL_PRIMARY_IP_RANGES`, all of the primary IP
ranges in every Subnetwork are allowed to Nat.
`LIST_OF_SUBNETWORKS`: A list of Subnetworks are allowed to Nat
(specified in the field subnetwork below). Note that if this field
contains ALL_SUBNETWORKS_ALL_IP_RANGES or
ALL_SUBNETWORKS_ALL_PRIMARY_IP_RANGES, then there should not be any
other RouterNat section in any Router for this network in this region.
required: true
enum_values:
- 'ALL_SUBNETWORKS_ALL_IP_RANGES'
- 'ALL_SUBNETWORKS_ALL_PRIMARY_IP_RANGES'
- 'LIST_OF_SUBNETWORKS'
- name: 'subnetwork'
type: Array
description: |
One or more subnetwork NAT configurations. Only used if
`source_subnetwork_ip_ranges_to_nat` is set to `LIST_OF_SUBNETWORKS`
api_name: subnetworks
is_set: true
send_empty_value: true
set_hash_func: computeRouterNatSubnetworkHash
item_type:
type: NestedObject
properties:
- name: 'name'
type: ResourceRef
description: 'Self-link of subnetwork to NAT'
required: true
custom_expand: 'templates/terraform/custom_expand/resourceref_with_validation.go.tmpl'
resource: 'Subnetwork'
imports: 'selfLink'
- name: 'sourceIpRangesToNat'
type: Array
description: |
List of options for which source IPs in the subnetwork
should have NAT enabled. Supported values include:
`ALL_IP_RANGES`, `LIST_OF_SECONDARY_IP_RANGES`,
`PRIMARY_IP_RANGE`.
is_set: true
required: true
item_type:
type: String
min_size: 1
- name: 'secondaryIpRangeNames'
type: Array
description: |
List of the secondary ranges of the subnetwork that are allowed
to use NAT. This can be populated only if
`LIST_OF_SECONDARY_IP_RANGES` is one of the values in
sourceIpRangesToNat
is_set: true
item_type:
type: String
- name: 'minPortsPerVm'
type: Integer
description: |
Minimum number of ports allocated to a VM from this NAT. Defaults to 64 for static port allocation and 32 dynamic port allocation if not set.
default_from_api: true
- name: 'maxPortsPerVm'
type: Integer
description: |
Maximum number of ports allocated to a VM from this NAT.
This field can only be set when enableDynamicPortAllocation is enabled.
- name: 'enableDynamicPortAllocation'
type: Boolean
description: |
Enable Dynamic Port Allocation.
If minPortsPerVm is set, minPortsPerVm must be set to a power of two greater than or equal to 32.
If minPortsPerVm is not set, a minimum of 32 ports will be allocated to a VM from this NAT config.
If maxPortsPerVm is set, maxPortsPerVm must be set to a power of two greater than minPortsPerVm.
If maxPortsPerVm is not set, a maximum of 65536 ports will be allocated to a VM from this NAT config.
Mutually exclusive with enableEndpointIndependentMapping.
default_from_api: true
send_empty_value: true
- name: 'udpIdleTimeoutSec'
type: Integer
description: |
Timeout (in seconds) for UDP connections. Defaults to 30s if not set.
custom_flatten: 'templates/terraform/custom_flatten/default_if_empty.tmpl'
default_value: 30
- name: 'icmpIdleTimeoutSec'
type: Integer
description: |
Timeout (in seconds) for ICMP connections. Defaults to 30s if not set.
custom_flatten: 'templates/terraform/custom_flatten/default_if_empty.tmpl'
default_value: 30
- name: 'tcpEstablishedIdleTimeoutSec'
type: Integer
description: |
Timeout (in seconds) for TCP established connections.
Defaults to 1200s if not set.
custom_flatten: 'templates/terraform/custom_flatten/default_if_empty.tmpl'
default_value: 1200
- name: 'tcpTransitoryIdleTimeoutSec'
type: Integer
description: |
Timeout (in seconds) for TCP transitory connections.
Defaults to 30s if not set.
custom_flatten: 'templates/terraform/custom_flatten/default_if_empty.tmpl'
default_value: 30
- name: 'tcpTimeWaitTimeoutSec'
type: Integer
description: |
Timeout (in seconds) for TCP connections that are in TIME_WAIT state.
Defaults to 120s if not set.
custom_flatten: 'templates/terraform/custom_flatten/default_if_empty.tmpl'
default_value: 120
- name: 'logConfig'
type: NestedObject
description: |
Configuration for logging on NAT
send_empty_value: true
properties:
- name: 'enable'
type: Boolean
description: |
Indicates whether or not to export logs.
required: true
- name: 'filter'
type: Enum
description: |
Specifies the desired filtering of logs on this NAT.
required: true
enum_values:
- 'ERRORS_ONLY'
- 'TRANSLATIONS_ONLY'
- 'ALL'
- name: 'endpointTypes'
type: Array
description: |
Specifies the endpoint Types supported by the NAT Gateway.
Supported values include:
`ENDPOINT_TYPE_VM`, `ENDPOINT_TYPE_SWG`,
`ENDPOINT_TYPE_MANAGED_PROXY_LB`.
immutable: true
default_from_api: true
item_type:
type: String
min_size: 1
- name: 'rules'
type: Array
description: 'A list of rules associated with this NAT.'
is_set: true
send_empty_value: true
set_hash_func: computeRouterNatRulesHash
item_type:
type: NestedObject
properties:
- name: 'ruleNumber'
type: Integer
description: |
An integer uniquely identifying a rule in the list.
The rule number must be a positive value between 0 and 65000, and must be unique among rules within a NAT.
required: true
send_empty_value: true
validation:
function: 'validation.IntBetween(0, 65000)'
- name: 'description'
type: String
description: 'An optional description of this rule.'
- name: 'match'
type: String
description: |
CEL expression that specifies the match condition that egress traffic from a VM is evaluated against.
If it evaluates to true, the corresponding action is enforced.
The following examples are valid match expressions for public NAT:
"inIpRange(destination.ip, '1.1.0.0/16') || inIpRange(destination.ip, '2.2.0.0/16')"
"destination.ip == '1.1.0.1' || destination.ip == '8.8.8.8'"
The following example is a valid match expression for private NAT:
"nexthop.hub == 'https://networkconnectivity.googleapis.com/v1alpha1/projects/my-project/global/hub/hub-1'"
required: true
- name: 'action'
type: NestedObject
description:
'The action to be enforced for traffic that matches this rule.'
default_from_api: true
properties:
- name: 'sourceNatActiveIps'
type: Array
description: |
A list of URLs of the IP resources used for this NAT rule.
These IP addresses must be valid static external IP addresses assigned to the project.
This field is used for public NAT.
is_set: true
set_hash_func: computeRouterNatIPsHash
custom_flatten: 'templates/terraform/custom_flatten/nat_rules_ip_set.tmpl'
custom_expand: 'templates/terraform/custom_expand/array_resourceref_with_validation.go.tmpl'
item_type:
name: 'address'
type: ResourceRef
description:
'A reference to an address associated with this NAT'
resource: 'Address'
imports: 'selfLink'
- name: 'sourceNatDrainIps'
type: Array
description: |
A list of URLs of the IP resources to be drained.
These IPs must be valid static external IPs that have been assigned to the NAT.
These IPs should be used for updating/patching a NAT rule only.
This field is used for public NAT.
is_set: true
set_hash_func: computeRouterNatIPsHash
custom_flatten: 'templates/terraform/custom_flatten/nat_rules_ip_set.tmpl'
custom_expand: 'templates/terraform/custom_expand/array_resourceref_with_validation.go.tmpl'
item_type:
name: 'address'
type: ResourceRef
description:
'A reference to an address associated with this NAT'
resource: 'Address'
imports: 'selfLink'
- name: 'sourceNatActiveRanges'
type: Array
description: |
A list of URLs of the subnetworks used as source ranges for this NAT Rule.
These subnetworks must have purpose set to PRIVATE_NAT.
This field is used for private NAT.
is_set: true
set_hash_func: computeRouterNatRulesSubnetHash
custom_flatten: 'templates/terraform/custom_flatten/nat_rules_subnets_set.tmpl'
custom_expand: 'templates/terraform/custom_expand/array_resourceref_with_validation.go.tmpl'
item_type:
name: 'subnet'
type: ResourceRef
description:
'A reference to a subnetwork address associated with this NAT'
resource: 'Subnetwork'
imports: 'selfLink'
- name: 'sourceNatDrainRanges'
type: Array
description: |
A list of URLs of subnetworks representing source ranges to be drained.
This is only supported on patch/update, and these subnetworks must have previously been used as active ranges in this NAT Rule.
This field is used for private NAT.
is_set: true
set_hash_func: computeRouterNatRulesSubnetHash
custom_flatten: 'templates/terraform/custom_flatten/nat_rules_subnets_set.tmpl'
custom_expand: 'templates/terraform/custom_expand/array_resourceref_with_validation.go.tmpl'
item_type:
name: 'subnet'
type: ResourceRef
description:
'A reference to a subnetwork address associated with this NAT'
resource: 'Subnetwork'
imports: 'selfLink'
- name: 'enableEndpointIndependentMapping'
type: Boolean
description: |
Enable endpoint independent mapping.
For more information see the [official documentation](https://cloud.google.com/nat/docs/overview#specs-rfcs).
default_from_api: true
send_empty_value: true
- name: 'type'
type: Enum
description: |
Indicates whether this NAT is used for public or private IP translation.
If unspecified, it defaults to PUBLIC.
If `PUBLIC` NAT used for public IP translation.
If `PRIVATE` NAT used for private IP translation.
immutable: true
default_value: "PUBLIC"
enum_values:
- 'PUBLIC'
- 'PRIVATE'
- name: 'autoNetworkTier'
type: Enum
description: |
The network tier to use when automatically reserving NAT IP addresses.
Must be one of: PREMIUM, STANDARD. If not specified, then the current
project-level default tier is used.
default_from_api: true
enum_values:
- 'PREMIUM'
- 'STANDARD'