# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: MPL-2.0

"""
# Terraform CDK google Provider ~> 3.0

This repo builds and publishes the Terraform google Provider bindings for [cdktf](https://cdk.tf).

Current build targets are:

* npm
* Pypi

## Versioning

This project is explicitly not tracking the Terraform google Provider version 1:1. In fact, it always tracks `latest` of `~> 3.0` with every release. If there scenarios where you explicitly have to pin your provider version, you can do so by generating the [provider constructs manually](https://cdk.tf/imports).

These are the upstream dependencies:

* [Terraform CDK](https://cdk.tf)
* [Terraform google Provider](https://github.com/terraform-providers/terraform-provider-google)
* [Terraform Engine](https://terraform.io)

If there are breaking changes (backward incompatible) in any of the above, the major version of this project will be bumped. While the Terraform Engine and the Terraform google Provider are relatively stable, the Terraform CDK is in an early stage. Therefore, it's likely that there will be breaking changes.

## Features / Issues / Bugs

Please report bugs and issues to the [terraform cdk](https://cdk.tf) project:

* [Create bug report](https://cdk.tf/bug)
* [Create feature request](https://cdk.tf/feature)

## Contributing

## projen

This is mostly based on [projen](https://github.com/eladb/projen), which takes care of generating the entire repository.

## cdktf-provider-project based on projen

There's a custom [project builder](https://github.com/skorfmann/cdktf-provider-project) which encapsulate the common settings for all `cdktf` providers.

## provider version

The provider version can be adjusted in [./.projenrc.js](./.projenrc.js).
"""
import abc
import builtins
import datetime
import enum
import typing

import jsii
import jsii.compat
import publication

from ._jsii import *

import cdktf
import constructs


class AccessContextManagerAccessLevel(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AccessContextManagerAccessLevel"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, parent: str, title: str, basic: typing.Optional[typing.List["AccessContextManagerAccessLevelBasic"]]=None, custom: typing.Optional[typing.List["AccessContextManagerAccessLevelCustom"]]=None, description: typing.Optional[str]=None, timeouts: typing.Optional["AccessContextManagerAccessLevelTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Resource name for the Access Level. The short_name component must begin with a letter and only include alphanumeric and '_'. Format: accessPolicies/{policy_id}/accessLevels/{short_name}
        :param parent: The AccessPolicy this AccessLevel lives in. Format: accessPolicies/{policy_id}
        :param title: Human readable title. Must be unique within the Policy.
        :param basic: basic block.
        :param custom: custom block.
        :param description: Description of the AccessLevel and its use. Does not affect behavior.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AccessContextManagerAccessLevelConfig(name=name, parent=parent, title=title, basic=basic, custom=custom, description=description, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(AccessContextManagerAccessLevel, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="parent")
    def parent(self) -> str:
        return jsii.get(self, "parent")

    @parent.setter
    def parent(self, value: str) -> None:
        jsii.set(self, "parent", value)

    @builtins.property
    @jsii.member(jsii_name="title")
    def title(self) -> str:
        return jsii.get(self, "title")

    @title.setter
    def title(self, value: str) -> None:
        jsii.set(self, "title", value)

    @builtins.property
    @jsii.member(jsii_name="basic")
    def basic(self) -> typing.Optional[typing.List["AccessContextManagerAccessLevelBasic"]]:
        return jsii.get(self, "basic")

    @basic.setter
    def basic(self, value: typing.Optional[typing.List["AccessContextManagerAccessLevelBasic"]]) -> None:
        jsii.set(self, "basic", value)

    @builtins.property
    @jsii.member(jsii_name="custom")
    def custom(self) -> typing.Optional[typing.List["AccessContextManagerAccessLevelCustom"]]:
        return jsii.get(self, "custom")

    @custom.setter
    def custom(self, value: typing.Optional[typing.List["AccessContextManagerAccessLevelCustom"]]) -> None:
        jsii.set(self, "custom", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["AccessContextManagerAccessLevelTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["AccessContextManagerAccessLevelTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerAccessLevelBasic", jsii_struct_bases=[], name_mapping={'conditions': 'conditions', 'combining_function': 'combiningFunction'})
class AccessContextManagerAccessLevelBasic():
    def __init__(self, *, conditions: typing.List["AccessContextManagerAccessLevelBasicConditions"], combining_function: typing.Optional[str]=None) -> None:
        """
        :param conditions: conditions block.
        :param combining_function: How the conditions list should be combined to determine if a request is granted this AccessLevel. If AND is used, each Condition in conditions must be satisfied for the AccessLevel to be applied. If OR is used, at least one Condition in conditions must be satisfied for the AccessLevel to be applied. Default value: "AND" Possible values: ["AND", "OR"]
        """
        self._values = {
            'conditions': conditions,
        }
        if combining_function is not None: self._values["combining_function"] = combining_function

    @builtins.property
    def conditions(self) -> typing.List["AccessContextManagerAccessLevelBasicConditions"]:
        """conditions block."""
        return self._values.get('conditions')

    @builtins.property
    def combining_function(self) -> typing.Optional[str]:
        """How the conditions list should be combined to determine if a request is granted this AccessLevel.

        If AND is used, each Condition in
        conditions must be satisfied for the AccessLevel to be applied. If
        OR is used, at least one Condition in conditions must be satisfied
        for the AccessLevel to be applied. Default value: "AND" Possible values: ["AND", "OR"]
        """
        return self._values.get('combining_function')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerAccessLevelBasic(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerAccessLevelBasicConditions", jsii_struct_bases=[], name_mapping={'device_policy': 'devicePolicy', 'ip_subnetworks': 'ipSubnetworks', 'members': 'members', 'negate': 'negate', 'regions': 'regions', 'required_access_levels': 'requiredAccessLevels'})
class AccessContextManagerAccessLevelBasicConditions():
    def __init__(self, *, device_policy: typing.Optional[typing.List["AccessContextManagerAccessLevelBasicConditionsDevicePolicy"]]=None, ip_subnetworks: typing.Optional[typing.List[str]]=None, members: typing.Optional[typing.List[str]]=None, negate: typing.Optional[bool]=None, regions: typing.Optional[typing.List[str]]=None, required_access_levels: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param device_policy: device_policy block.
        :param ip_subnetworks: A list of CIDR block IP subnetwork specification. May be IPv4 or IPv6. Note that for a CIDR IP address block, the specified IP address portion must be properly truncated (i.e. all the host bits must be zero) or the input is considered malformed. For example, "192.0.2.0/24" is accepted but "192.0.2.1/24" is not. Similarly, for IPv6, "2001:db8::/32" is accepted whereas "2001:db8::1/32" is not. The originating IP of a request must be in one of the listed subnets in order for this Condition to be true. If empty, all IP addresses are allowed.
        :param members: An allowed list of members (users, service accounts). Using groups is not supported yet. The signed-in user originating the request must be a part of one of the provided members. If not specified, a request may come from any user (logged in/not logged in, not present in any groups, etc.). Formats: 'user:{emailid}', 'serviceAccount:{emailid}'
        :param negate: Whether to negate the Condition. If true, the Condition becomes a NAND over its non-empty fields, each field must be false for the Condition overall to be satisfied. Defaults to false.
        :param regions: The request must originate from one of the provided countries/regions. Format: A valid ISO 3166-1 alpha-2 code.
        :param required_access_levels: A list of other access levels defined in the same Policy, referenced by resource name. Referencing an AccessLevel which does not exist is an error. All access levels listed must be granted for the Condition to be true. Format: accessPolicies/{policy_id}/accessLevels/{short_name}
        """
        self._values = {
        }
        if device_policy is not None: self._values["device_policy"] = device_policy
        if ip_subnetworks is not None: self._values["ip_subnetworks"] = ip_subnetworks
        if members is not None: self._values["members"] = members
        if negate is not None: self._values["negate"] = negate
        if regions is not None: self._values["regions"] = regions
        if required_access_levels is not None: self._values["required_access_levels"] = required_access_levels

    @builtins.property
    def device_policy(self) -> typing.Optional[typing.List["AccessContextManagerAccessLevelBasicConditionsDevicePolicy"]]:
        """device_policy block."""
        return self._values.get('device_policy')

    @builtins.property
    def ip_subnetworks(self) -> typing.Optional[typing.List[str]]:
        """A list of CIDR block IP subnetwork specification.

        May be IPv4
        or IPv6.
        Note that for a CIDR IP address block, the specified IP address
        portion must be properly truncated (i.e. all the host bits must
        be zero) or the input is considered malformed. For example,
        "192.0.2.0/24" is accepted but "192.0.2.1/24" is not. Similarly,
        for IPv6, "2001:db8::/32" is accepted whereas "2001:db8::1/32"
        is not. The originating IP of a request must be in one of the
        listed subnets in order for this Condition to be true.
        If empty, all IP addresses are allowed.
        """
        return self._values.get('ip_subnetworks')

    @builtins.property
    def members(self) -> typing.Optional[typing.List[str]]:
        """An allowed list of members (users, service accounts). Using groups is not supported yet.

        The signed-in user originating the request must be a part of one
        of the provided members. If not specified, a request may come
        from any user (logged in/not logged in, not present in any
        groups, etc.).
        Formats: 'user:{emailid}', 'serviceAccount:{emailid}'
        """
        return self._values.get('members')

    @builtins.property
    def negate(self) -> typing.Optional[bool]:
        """Whether to negate the Condition.

        If true, the Condition becomes
        a NAND over its non-empty fields, each field must be false for
        the Condition overall to be satisfied. Defaults to false.
        """
        return self._values.get('negate')

    @builtins.property
    def regions(self) -> typing.Optional[typing.List[str]]:
        """The request must originate from one of the provided countries/regions.

        Format: A valid ISO 3166-1 alpha-2 code.
        """
        return self._values.get('regions')

    @builtins.property
    def required_access_levels(self) -> typing.Optional[typing.List[str]]:
        """A list of other access levels defined in the same Policy, referenced by resource name.

        Referencing an AccessLevel which
        does not exist is an error. All access levels listed must be
        granted for the Condition to be true.
        Format: accessPolicies/{policy_id}/accessLevels/{short_name}
        """
        return self._values.get('required_access_levels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerAccessLevelBasicConditions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerAccessLevelBasicConditionsDevicePolicy", jsii_struct_bases=[], name_mapping={'allowed_device_management_levels': 'allowedDeviceManagementLevels', 'allowed_encryption_statuses': 'allowedEncryptionStatuses', 'os_constraints': 'osConstraints', 'require_admin_approval': 'requireAdminApproval', 'require_corp_owned': 'requireCorpOwned', 'require_screen_lock': 'requireScreenLock'})
class AccessContextManagerAccessLevelBasicConditionsDevicePolicy():
    def __init__(self, *, allowed_device_management_levels: typing.Optional[typing.List[str]]=None, allowed_encryption_statuses: typing.Optional[typing.List[str]]=None, os_constraints: typing.Optional[typing.List["AccessContextManagerAccessLevelBasicConditionsDevicePolicyOsConstraints"]]=None, require_admin_approval: typing.Optional[bool]=None, require_corp_owned: typing.Optional[bool]=None, require_screen_lock: typing.Optional[bool]=None) -> None:
        """
        :param allowed_device_management_levels: A list of allowed device management levels. An empty list allows all management levels. Possible values: ["MANAGEMENT_UNSPECIFIED", "NONE", "BASIC", "COMPLETE"]
        :param allowed_encryption_statuses: A list of allowed encryptions statuses. An empty list allows all statuses. Possible values: ["ENCRYPTION_UNSPECIFIED", "ENCRYPTION_UNSUPPORTED", "UNENCRYPTED", "ENCRYPTED"]
        :param os_constraints: os_constraints block.
        :param require_admin_approval: Whether the device needs to be approved by the customer admin.
        :param require_corp_owned: Whether the device needs to be corp owned.
        :param require_screen_lock: Whether or not screenlock is required for the DevicePolicy to be true. Defaults to false.
        """
        self._values = {
        }
        if allowed_device_management_levels is not None: self._values["allowed_device_management_levels"] = allowed_device_management_levels
        if allowed_encryption_statuses is not None: self._values["allowed_encryption_statuses"] = allowed_encryption_statuses
        if os_constraints is not None: self._values["os_constraints"] = os_constraints
        if require_admin_approval is not None: self._values["require_admin_approval"] = require_admin_approval
        if require_corp_owned is not None: self._values["require_corp_owned"] = require_corp_owned
        if require_screen_lock is not None: self._values["require_screen_lock"] = require_screen_lock

    @builtins.property
    def allowed_device_management_levels(self) -> typing.Optional[typing.List[str]]:
        """A list of allowed device management levels.

        An empty list allows all management levels. Possible values: ["MANAGEMENT_UNSPECIFIED", "NONE", "BASIC", "COMPLETE"]
        """
        return self._values.get('allowed_device_management_levels')

    @builtins.property
    def allowed_encryption_statuses(self) -> typing.Optional[typing.List[str]]:
        """A list of allowed encryptions statuses.

        An empty list allows all statuses. Possible values: ["ENCRYPTION_UNSPECIFIED", "ENCRYPTION_UNSUPPORTED", "UNENCRYPTED", "ENCRYPTED"]
        """
        return self._values.get('allowed_encryption_statuses')

    @builtins.property
    def os_constraints(self) -> typing.Optional[typing.List["AccessContextManagerAccessLevelBasicConditionsDevicePolicyOsConstraints"]]:
        """os_constraints block."""
        return self._values.get('os_constraints')

    @builtins.property
    def require_admin_approval(self) -> typing.Optional[bool]:
        """Whether the device needs to be approved by the customer admin."""
        return self._values.get('require_admin_approval')

    @builtins.property
    def require_corp_owned(self) -> typing.Optional[bool]:
        """Whether the device needs to be corp owned."""
        return self._values.get('require_corp_owned')

    @builtins.property
    def require_screen_lock(self) -> typing.Optional[bool]:
        """Whether or not screenlock is required for the DevicePolicy to be true.

        Defaults to false.
        """
        return self._values.get('require_screen_lock')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerAccessLevelBasicConditionsDevicePolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerAccessLevelBasicConditionsDevicePolicyOsConstraints", jsii_struct_bases=[], name_mapping={'os_type': 'osType', 'minimum_version': 'minimumVersion'})
class AccessContextManagerAccessLevelBasicConditionsDevicePolicyOsConstraints():
    def __init__(self, *, os_type: str, minimum_version: typing.Optional[str]=None) -> None:
        """
        :param os_type: The operating system type of the device. Possible values: ["OS_UNSPECIFIED", "DESKTOP_MAC", "DESKTOP_WINDOWS", "DESKTOP_LINUX", "DESKTOP_CHROME_OS"]
        :param minimum_version: The minimum allowed OS version. If not set, any version of this OS satisfies the constraint. Format: "major.minor.patch" such as "10.5.301", "9.2.1".
        """
        self._values = {
            'os_type': os_type,
        }
        if minimum_version is not None: self._values["minimum_version"] = minimum_version

    @builtins.property
    def os_type(self) -> str:
        """The operating system type of the device.

        Possible values: ["OS_UNSPECIFIED", "DESKTOP_MAC", "DESKTOP_WINDOWS", "DESKTOP_LINUX", "DESKTOP_CHROME_OS"]
        """
        return self._values.get('os_type')

    @builtins.property
    def minimum_version(self) -> typing.Optional[str]:
        """The minimum allowed OS version.

        If not set, any version
        of this OS satisfies the constraint.
        Format: "major.minor.patch" such as "10.5.301", "9.2.1".
        """
        return self._values.get('minimum_version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerAccessLevelBasicConditionsDevicePolicyOsConstraints(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerAccessLevelConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'parent': 'parent', 'title': 'title', 'basic': 'basic', 'custom': 'custom', 'description': 'description', 'timeouts': 'timeouts'})
class AccessContextManagerAccessLevelConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, parent: str, title: str, basic: typing.Optional[typing.List["AccessContextManagerAccessLevelBasic"]]=None, custom: typing.Optional[typing.List["AccessContextManagerAccessLevelCustom"]]=None, description: typing.Optional[str]=None, timeouts: typing.Optional["AccessContextManagerAccessLevelTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Resource name for the Access Level. The short_name component must begin with a letter and only include alphanumeric and '_'. Format: accessPolicies/{policy_id}/accessLevels/{short_name}
        :param parent: The AccessPolicy this AccessLevel lives in. Format: accessPolicies/{policy_id}
        :param title: Human readable title. Must be unique within the Policy.
        :param basic: basic block.
        :param custom: custom block.
        :param description: Description of the AccessLevel and its use. Does not affect behavior.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = AccessContextManagerAccessLevelTimeouts(**timeouts)
        self._values = {
            'name': name,
            'parent': parent,
            'title': title,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if basic is not None: self._values["basic"] = basic
        if custom is not None: self._values["custom"] = custom
        if description is not None: self._values["description"] = description
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Resource name for the Access Level.

        The short_name component must begin
        with a letter and only include alphanumeric and '_'.
        Format: accessPolicies/{policy_id}/accessLevels/{short_name}
        """
        return self._values.get('name')

    @builtins.property
    def parent(self) -> str:
        """The AccessPolicy this AccessLevel lives in.

        Format: accessPolicies/{policy_id}
        """
        return self._values.get('parent')

    @builtins.property
    def title(self) -> str:
        """Human readable title.

        Must be unique within the Policy.
        """
        return self._values.get('title')

    @builtins.property
    def basic(self) -> typing.Optional[typing.List["AccessContextManagerAccessLevelBasic"]]:
        """basic block."""
        return self._values.get('basic')

    @builtins.property
    def custom(self) -> typing.Optional[typing.List["AccessContextManagerAccessLevelCustom"]]:
        """custom block."""
        return self._values.get('custom')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Description of the AccessLevel and its use.

        Does not affect behavior.
        """
        return self._values.get('description')

    @builtins.property
    def timeouts(self) -> typing.Optional["AccessContextManagerAccessLevelTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerAccessLevelConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerAccessLevelCustom", jsii_struct_bases=[], name_mapping={'expr': 'expr'})
class AccessContextManagerAccessLevelCustom():
    def __init__(self, *, expr: typing.List["AccessContextManagerAccessLevelCustomExpr"]) -> None:
        """
        :param expr: expr block.
        """
        self._values = {
            'expr': expr,
        }

    @builtins.property
    def expr(self) -> typing.List["AccessContextManagerAccessLevelCustomExpr"]:
        """expr block."""
        return self._values.get('expr')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerAccessLevelCustom(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerAccessLevelCustomExpr", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'description': 'description', 'location': 'location', 'title': 'title'})
class AccessContextManagerAccessLevelCustomExpr():
    def __init__(self, *, expression: str, description: typing.Optional[str]=None, location: typing.Optional[str]=None, title: typing.Optional[str]=None) -> None:
        """
        :param expression: Textual representation of an expression in Common Expression Language syntax.
        :param description: Description of the expression.
        :param location: String indicating the location of the expression for error reporting, e.g. a file name and a position in the file.
        :param title: Title for the expression, i.e. a short string describing its purpose.
        """
        self._values = {
            'expression': expression,
        }
        if description is not None: self._values["description"] = description
        if location is not None: self._values["location"] = location
        if title is not None: self._values["title"] = title

    @builtins.property
    def expression(self) -> str:
        """Textual representation of an expression in Common Expression Language syntax."""
        return self._values.get('expression')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Description of the expression."""
        return self._values.get('description')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """String indicating the location of the expression for error reporting, e.g. a file name and a position in the file."""
        return self._values.get('location')

    @builtins.property
    def title(self) -> typing.Optional[str]:
        """Title for the expression, i.e. a short string describing its purpose."""
        return self._values.get('title')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerAccessLevelCustomExpr(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerAccessLevelTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class AccessContextManagerAccessLevelTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerAccessLevelTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class AccessContextManagerAccessPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AccessContextManagerAccessPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, parent: str, title: str, timeouts: typing.Optional["AccessContextManagerAccessPolicyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param parent: The parent of this AccessPolicy in the Cloud Resource Hierarchy. Format: organizations/{organization_id}
        :param title: Human readable title. Does not affect behavior.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AccessContextManagerAccessPolicyConfig(parent=parent, title=title, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(AccessContextManagerAccessPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="updateTime")
    def update_time(self) -> str:
        return jsii.get(self, "updateTime")

    @builtins.property
    @jsii.member(jsii_name="parent")
    def parent(self) -> str:
        return jsii.get(self, "parent")

    @parent.setter
    def parent(self, value: str) -> None:
        jsii.set(self, "parent", value)

    @builtins.property
    @jsii.member(jsii_name="title")
    def title(self) -> str:
        return jsii.get(self, "title")

    @title.setter
    def title(self, value: str) -> None:
        jsii.set(self, "title", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["AccessContextManagerAccessPolicyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["AccessContextManagerAccessPolicyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerAccessPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'parent': 'parent', 'title': 'title', 'timeouts': 'timeouts'})
class AccessContextManagerAccessPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, parent: str, title: str, timeouts: typing.Optional["AccessContextManagerAccessPolicyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param parent: The parent of this AccessPolicy in the Cloud Resource Hierarchy. Format: organizations/{organization_id}
        :param title: Human readable title. Does not affect behavior.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = AccessContextManagerAccessPolicyTimeouts(**timeouts)
        self._values = {
            'parent': parent,
            'title': title,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def parent(self) -> str:
        """The parent of this AccessPolicy in the Cloud Resource Hierarchy.

        Format: organizations/{organization_id}
        """
        return self._values.get('parent')

    @builtins.property
    def title(self) -> str:
        """Human readable title.

        Does not affect behavior.
        """
        return self._values.get('title')

    @builtins.property
    def timeouts(self) -> typing.Optional["AccessContextManagerAccessPolicyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerAccessPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerAccessPolicyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class AccessContextManagerAccessPolicyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerAccessPolicyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class AccessContextManagerServicePerimeter(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AccessContextManagerServicePerimeter"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, parent: str, title: str, description: typing.Optional[str]=None, perimeter_type: typing.Optional[str]=None, spec: typing.Optional[typing.List["AccessContextManagerServicePerimeterSpec"]]=None, status: typing.Optional[typing.List["AccessContextManagerServicePerimeterStatus"]]=None, timeouts: typing.Optional["AccessContextManagerServicePerimeterTimeouts"]=None, use_explicit_dry_run_spec: typing.Optional[bool]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Resource name for the ServicePerimeter. The short_name component must begin with a letter and only include alphanumeric and '_'. Format: accessPolicies/{policy_id}/servicePerimeters/{short_name}
        :param parent: The AccessPolicy this ServicePerimeter lives in. Format: accessPolicies/{policy_id}
        :param title: Human readable title. Must be unique within the Policy.
        :param description: Description of the ServicePerimeter and its use. Does not affect behavior.
        :param perimeter_type: Specifies the type of the Perimeter. There are two types: regular and bridge. Regular Service Perimeter contains resources, access levels, and restricted services. Every resource can be in at most ONE regular Service Perimeter. In addition to being in a regular service perimeter, a resource can also be in zero or more perimeter bridges. A perimeter bridge only contains resources. Cross project operations are permitted if all effected resources share some perimeter (whether bridge or regular). Perimeter Bridge does not contain access levels or services: those are governed entirely by the regular perimeter that resource is in. Perimeter Bridges are typically useful when building more complex topologies with many independent perimeters that need to share some data with a common perimeter, but should not be able to share data among themselves. Default value: "PERIMETER_TYPE_REGULAR" Possible values: ["PERIMETER_TYPE_REGULAR", "PERIMETER_TYPE_BRIDGE"]
        :param spec: spec block.
        :param status: status block.
        :param timeouts: timeouts block.
        :param use_explicit_dry_run_spec: Use explicit dry run spec flag. Ordinarily, a dry-run spec implicitly exists for all Service Perimeters, and that spec is identical to the status for those Service Perimeters. When this flag is set, it inhibits the generation of the implicit spec, thereby allowing the user to explicitly provide a configuration ("spec") to use in a dry-run version of the Service Perimeter. This allows the user to test changes to the enforced config ("status") without actually enforcing them. This testing is done through analyzing the differences between currently enforced and suggested restrictions. useExplicitDryRunSpec must bet set to True if any of the fields in the spec are set to non-default values.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AccessContextManagerServicePerimeterConfig(name=name, parent=parent, title=title, description=description, perimeter_type=perimeter_type, spec=spec, status=status, timeouts=timeouts, use_explicit_dry_run_spec=use_explicit_dry_run_spec, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(AccessContextManagerServicePerimeter, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="updateTime")
    def update_time(self) -> str:
        return jsii.get(self, "updateTime")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="parent")
    def parent(self) -> str:
        return jsii.get(self, "parent")

    @parent.setter
    def parent(self, value: str) -> None:
        jsii.set(self, "parent", value)

    @builtins.property
    @jsii.member(jsii_name="title")
    def title(self) -> str:
        return jsii.get(self, "title")

    @title.setter
    def title(self, value: str) -> None:
        jsii.set(self, "title", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="perimeterType")
    def perimeter_type(self) -> typing.Optional[str]:
        return jsii.get(self, "perimeterType")

    @perimeter_type.setter
    def perimeter_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "perimeterType", value)

    @builtins.property
    @jsii.member(jsii_name="spec")
    def spec(self) -> typing.Optional[typing.List["AccessContextManagerServicePerimeterSpec"]]:
        return jsii.get(self, "spec")

    @spec.setter
    def spec(self, value: typing.Optional[typing.List["AccessContextManagerServicePerimeterSpec"]]) -> None:
        jsii.set(self, "spec", value)

    @builtins.property
    @jsii.member(jsii_name="status")
    def status(self) -> typing.Optional[typing.List["AccessContextManagerServicePerimeterStatus"]]:
        return jsii.get(self, "status")

    @status.setter
    def status(self, value: typing.Optional[typing.List["AccessContextManagerServicePerimeterStatus"]]) -> None:
        jsii.set(self, "status", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["AccessContextManagerServicePerimeterTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["AccessContextManagerServicePerimeterTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="useExplicitDryRunSpec")
    def use_explicit_dry_run_spec(self) -> typing.Optional[bool]:
        return jsii.get(self, "useExplicitDryRunSpec")

    @use_explicit_dry_run_spec.setter
    def use_explicit_dry_run_spec(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "useExplicitDryRunSpec", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerServicePerimeterConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'parent': 'parent', 'title': 'title', 'description': 'description', 'perimeter_type': 'perimeterType', 'spec': 'spec', 'status': 'status', 'timeouts': 'timeouts', 'use_explicit_dry_run_spec': 'useExplicitDryRunSpec'})
class AccessContextManagerServicePerimeterConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, parent: str, title: str, description: typing.Optional[str]=None, perimeter_type: typing.Optional[str]=None, spec: typing.Optional[typing.List["AccessContextManagerServicePerimeterSpec"]]=None, status: typing.Optional[typing.List["AccessContextManagerServicePerimeterStatus"]]=None, timeouts: typing.Optional["AccessContextManagerServicePerimeterTimeouts"]=None, use_explicit_dry_run_spec: typing.Optional[bool]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Resource name for the ServicePerimeter. The short_name component must begin with a letter and only include alphanumeric and '_'. Format: accessPolicies/{policy_id}/servicePerimeters/{short_name}
        :param parent: The AccessPolicy this ServicePerimeter lives in. Format: accessPolicies/{policy_id}
        :param title: Human readable title. Must be unique within the Policy.
        :param description: Description of the ServicePerimeter and its use. Does not affect behavior.
        :param perimeter_type: Specifies the type of the Perimeter. There are two types: regular and bridge. Regular Service Perimeter contains resources, access levels, and restricted services. Every resource can be in at most ONE regular Service Perimeter. In addition to being in a regular service perimeter, a resource can also be in zero or more perimeter bridges. A perimeter bridge only contains resources. Cross project operations are permitted if all effected resources share some perimeter (whether bridge or regular). Perimeter Bridge does not contain access levels or services: those are governed entirely by the regular perimeter that resource is in. Perimeter Bridges are typically useful when building more complex topologies with many independent perimeters that need to share some data with a common perimeter, but should not be able to share data among themselves. Default value: "PERIMETER_TYPE_REGULAR" Possible values: ["PERIMETER_TYPE_REGULAR", "PERIMETER_TYPE_BRIDGE"]
        :param spec: spec block.
        :param status: status block.
        :param timeouts: timeouts block.
        :param use_explicit_dry_run_spec: Use explicit dry run spec flag. Ordinarily, a dry-run spec implicitly exists for all Service Perimeters, and that spec is identical to the status for those Service Perimeters. When this flag is set, it inhibits the generation of the implicit spec, thereby allowing the user to explicitly provide a configuration ("spec") to use in a dry-run version of the Service Perimeter. This allows the user to test changes to the enforced config ("status") without actually enforcing them. This testing is done through analyzing the differences between currently enforced and suggested restrictions. useExplicitDryRunSpec must bet set to True if any of the fields in the spec are set to non-default values.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = AccessContextManagerServicePerimeterTimeouts(**timeouts)
        self._values = {
            'name': name,
            'parent': parent,
            'title': title,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if perimeter_type is not None: self._values["perimeter_type"] = perimeter_type
        if spec is not None: self._values["spec"] = spec
        if status is not None: self._values["status"] = status
        if timeouts is not None: self._values["timeouts"] = timeouts
        if use_explicit_dry_run_spec is not None: self._values["use_explicit_dry_run_spec"] = use_explicit_dry_run_spec

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Resource name for the ServicePerimeter.

        The short_name component must
        begin with a letter and only include alphanumeric and '_'.
        Format: accessPolicies/{policy_id}/servicePerimeters/{short_name}
        """
        return self._values.get('name')

    @builtins.property
    def parent(self) -> str:
        """The AccessPolicy this ServicePerimeter lives in.

        Format: accessPolicies/{policy_id}
        """
        return self._values.get('parent')

    @builtins.property
    def title(self) -> str:
        """Human readable title.

        Must be unique within the Policy.
        """
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Description of the ServicePerimeter and its use.

        Does not affect
        behavior.
        """
        return self._values.get('description')

    @builtins.property
    def perimeter_type(self) -> typing.Optional[str]:
        """Specifies the type of the Perimeter.

        There are two types: regular and
        bridge. Regular Service Perimeter contains resources, access levels,
        and restricted services. Every resource can be in at most
        ONE regular Service Perimeter.

        In addition to being in a regular service perimeter, a resource can also
        be in zero or more perimeter bridges. A perimeter bridge only contains
        resources. Cross project operations are permitted if all effected
        resources share some perimeter (whether bridge or regular). Perimeter
        Bridge does not contain access levels or services: those are governed
        entirely by the regular perimeter that resource is in.

        Perimeter Bridges are typically useful when building more complex
        topologies with many independent perimeters that need to share some data
        with a common perimeter, but should not be able to share data among
        themselves. Default value: "PERIMETER_TYPE_REGULAR" Possible values: ["PERIMETER_TYPE_REGULAR", "PERIMETER_TYPE_BRIDGE"]
        """
        return self._values.get('perimeter_type')

    @builtins.property
    def spec(self) -> typing.Optional[typing.List["AccessContextManagerServicePerimeterSpec"]]:
        """spec block."""
        return self._values.get('spec')

    @builtins.property
    def status(self) -> typing.Optional[typing.List["AccessContextManagerServicePerimeterStatus"]]:
        """status block."""
        return self._values.get('status')

    @builtins.property
    def timeouts(self) -> typing.Optional["AccessContextManagerServicePerimeterTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def use_explicit_dry_run_spec(self) -> typing.Optional[bool]:
        """Use explicit dry run spec flag.

        Ordinarily, a dry-run spec implicitly exists
        for all Service Perimeters, and that spec is identical to the status for those
        Service Perimeters. When this flag is set, it inhibits the generation of the
        implicit spec, thereby allowing the user to explicitly provide a
        configuration ("spec") to use in a dry-run version of the Service Perimeter.
        This allows the user to test changes to the enforced config ("status") without
        actually enforcing them. This testing is done through analyzing the differences
        between currently enforced and suggested restrictions. useExplicitDryRunSpec must
        bet set to True if any of the fields in the spec are set to non-default values.
        """
        return self._values.get('use_explicit_dry_run_spec')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerServicePerimeterConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class AccessContextManagerServicePerimeterResource(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AccessContextManagerServicePerimeterResource"):
    def __init__(self, scope: constructs.Construct, id: str, *, perimeter_name: str, resource: str, timeouts: typing.Optional["AccessContextManagerServicePerimeterResourceTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param perimeter_name: The name of the Service Perimeter to add this resource to.
        :param resource: A GCP resource that is inside of the service perimeter. Currently only projects are allowed. Format: projects/{project_number}
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AccessContextManagerServicePerimeterResourceConfig(perimeter_name=perimeter_name, resource=resource, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(AccessContextManagerServicePerimeterResource, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="perimeterName")
    def perimeter_name(self) -> str:
        return jsii.get(self, "perimeterName")

    @perimeter_name.setter
    def perimeter_name(self, value: str) -> None:
        jsii.set(self, "perimeterName", value)

    @builtins.property
    @jsii.member(jsii_name="resource")
    def resource(self) -> str:
        return jsii.get(self, "resource")

    @resource.setter
    def resource(self, value: str) -> None:
        jsii.set(self, "resource", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["AccessContextManagerServicePerimeterResourceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["AccessContextManagerServicePerimeterResourceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerServicePerimeterResourceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'perimeter_name': 'perimeterName', 'resource': 'resource', 'timeouts': 'timeouts'})
class AccessContextManagerServicePerimeterResourceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, perimeter_name: str, resource: str, timeouts: typing.Optional["AccessContextManagerServicePerimeterResourceTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param perimeter_name: The name of the Service Perimeter to add this resource to.
        :param resource: A GCP resource that is inside of the service perimeter. Currently only projects are allowed. Format: projects/{project_number}
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = AccessContextManagerServicePerimeterResourceTimeouts(**timeouts)
        self._values = {
            'perimeter_name': perimeter_name,
            'resource': resource,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def perimeter_name(self) -> str:
        """The name of the Service Perimeter to add this resource to."""
        return self._values.get('perimeter_name')

    @builtins.property
    def resource(self) -> str:
        """A GCP resource that is inside of the service perimeter.

        Currently only projects are allowed.
        Format: projects/{project_number}
        """
        return self._values.get('resource')

    @builtins.property
    def timeouts(self) -> typing.Optional["AccessContextManagerServicePerimeterResourceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerServicePerimeterResourceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerServicePerimeterResourceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class AccessContextManagerServicePerimeterResourceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerServicePerimeterResourceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerServicePerimeterSpec", jsii_struct_bases=[], name_mapping={'access_levels': 'accessLevels', 'resources': 'resources', 'restricted_services': 'restrictedServices', 'vpc_accessible_services': 'vpcAccessibleServices'})
class AccessContextManagerServicePerimeterSpec():
    def __init__(self, *, access_levels: typing.Optional[typing.List[str]]=None, resources: typing.Optional[typing.List[str]]=None, restricted_services: typing.Optional[typing.List[str]]=None, vpc_accessible_services: typing.Optional[typing.List["AccessContextManagerServicePerimeterSpecVpcAccessibleServices"]]=None) -> None:
        """
        :param access_levels: A list of AccessLevel resource names that allow resources within the ServicePerimeter to be accessed from the internet. AccessLevels listed must be in the same policy as this ServicePerimeter. Referencing a nonexistent AccessLevel is a syntax error. If no AccessLevel names are listed, resources within the perimeter can only be accessed via GCP calls with request origins within the perimeter. For Service Perimeter Bridge, must be empty. Format: accessPolicies/{policy_id}/accessLevels/{access_level_name}
        :param resources: A list of GCP resources that are inside of the service perimeter. Currently only projects are allowed. Format: projects/{project_number}
        :param restricted_services: GCP services that are subject to the Service Perimeter restrictions. Must contain a list of services. For example, if 'storage.googleapis.com' is specified, access to the storage buckets inside the perimeter must meet the perimeter's access restrictions.
        :param vpc_accessible_services: vpc_accessible_services block.
        """
        self._values = {
        }
        if access_levels is not None: self._values["access_levels"] = access_levels
        if resources is not None: self._values["resources"] = resources
        if restricted_services is not None: self._values["restricted_services"] = restricted_services
        if vpc_accessible_services is not None: self._values["vpc_accessible_services"] = vpc_accessible_services

    @builtins.property
    def access_levels(self) -> typing.Optional[typing.List[str]]:
        """A list of AccessLevel resource names that allow resources within the ServicePerimeter to be accessed from the internet.

        AccessLevels listed must be in the same policy as this
        ServicePerimeter. Referencing a nonexistent AccessLevel is a
        syntax error. If no AccessLevel names are listed, resources within
        the perimeter can only be accessed via GCP calls with request
        origins within the perimeter. For Service Perimeter Bridge, must
        be empty.

        Format: accessPolicies/{policy_id}/accessLevels/{access_level_name}
        """
        return self._values.get('access_levels')

    @builtins.property
    def resources(self) -> typing.Optional[typing.List[str]]:
        """A list of GCP resources that are inside of the service perimeter.

        Currently only projects are allowed.
        Format: projects/{project_number}
        """
        return self._values.get('resources')

    @builtins.property
    def restricted_services(self) -> typing.Optional[typing.List[str]]:
        """GCP services that are subject to the Service Perimeter restrictions.

        Must contain a list of services. For example, if
        'storage.googleapis.com' is specified, access to the storage
        buckets inside the perimeter must meet the perimeter's access
        restrictions.
        """
        return self._values.get('restricted_services')

    @builtins.property
    def vpc_accessible_services(self) -> typing.Optional[typing.List["AccessContextManagerServicePerimeterSpecVpcAccessibleServices"]]:
        """vpc_accessible_services block."""
        return self._values.get('vpc_accessible_services')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerServicePerimeterSpec(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerServicePerimeterSpecVpcAccessibleServices", jsii_struct_bases=[], name_mapping={'allowed_services': 'allowedServices', 'enable_restriction': 'enableRestriction'})
class AccessContextManagerServicePerimeterSpecVpcAccessibleServices():
    def __init__(self, *, allowed_services: typing.Optional[typing.List[str]]=None, enable_restriction: typing.Optional[bool]=None) -> None:
        """
        :param allowed_services: The list of APIs usable within the Service Perimeter. Must be empty unless 'enableRestriction' is True.
        :param enable_restriction: Whether to restrict API calls within the Service Perimeter to the list of APIs specified in 'allowedServices'.
        """
        self._values = {
        }
        if allowed_services is not None: self._values["allowed_services"] = allowed_services
        if enable_restriction is not None: self._values["enable_restriction"] = enable_restriction

    @builtins.property
    def allowed_services(self) -> typing.Optional[typing.List[str]]:
        """The list of APIs usable within the Service Perimeter.

        Must be empty unless 'enableRestriction' is True.
        """
        return self._values.get('allowed_services')

    @builtins.property
    def enable_restriction(self) -> typing.Optional[bool]:
        """Whether to restrict API calls within the Service Perimeter to the list of APIs specified in 'allowedServices'."""
        return self._values.get('enable_restriction')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerServicePerimeterSpecVpcAccessibleServices(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerServicePerimeterStatus", jsii_struct_bases=[], name_mapping={'access_levels': 'accessLevels', 'resources': 'resources', 'restricted_services': 'restrictedServices', 'vpc_accessible_services': 'vpcAccessibleServices'})
class AccessContextManagerServicePerimeterStatus():
    def __init__(self, *, access_levels: typing.Optional[typing.List[str]]=None, resources: typing.Optional[typing.List[str]]=None, restricted_services: typing.Optional[typing.List[str]]=None, vpc_accessible_services: typing.Optional[typing.List["AccessContextManagerServicePerimeterStatusVpcAccessibleServices"]]=None) -> None:
        """
        :param access_levels: A list of AccessLevel resource names that allow resources within the ServicePerimeter to be accessed from the internet. AccessLevels listed must be in the same policy as this ServicePerimeter. Referencing a nonexistent AccessLevel is a syntax error. If no AccessLevel names are listed, resources within the perimeter can only be accessed via GCP calls with request origins within the perimeter. For Service Perimeter Bridge, must be empty. Format: accessPolicies/{policy_id}/accessLevels/{access_level_name}
        :param resources: A list of GCP resources that are inside of the service perimeter. Currently only projects are allowed. Format: projects/{project_number}
        :param restricted_services: GCP services that are subject to the Service Perimeter restrictions. Must contain a list of services. For example, if 'storage.googleapis.com' is specified, access to the storage buckets inside the perimeter must meet the perimeter's access restrictions.
        :param vpc_accessible_services: vpc_accessible_services block.
        """
        self._values = {
        }
        if access_levels is not None: self._values["access_levels"] = access_levels
        if resources is not None: self._values["resources"] = resources
        if restricted_services is not None: self._values["restricted_services"] = restricted_services
        if vpc_accessible_services is not None: self._values["vpc_accessible_services"] = vpc_accessible_services

    @builtins.property
    def access_levels(self) -> typing.Optional[typing.List[str]]:
        """A list of AccessLevel resource names that allow resources within the ServicePerimeter to be accessed from the internet.

        AccessLevels listed must be in the same policy as this
        ServicePerimeter. Referencing a nonexistent AccessLevel is a
        syntax error. If no AccessLevel names are listed, resources within
        the perimeter can only be accessed via GCP calls with request
        origins within the perimeter. For Service Perimeter Bridge, must
        be empty.

        Format: accessPolicies/{policy_id}/accessLevels/{access_level_name}
        """
        return self._values.get('access_levels')

    @builtins.property
    def resources(self) -> typing.Optional[typing.List[str]]:
        """A list of GCP resources that are inside of the service perimeter.

        Currently only projects are allowed.
        Format: projects/{project_number}
        """
        return self._values.get('resources')

    @builtins.property
    def restricted_services(self) -> typing.Optional[typing.List[str]]:
        """GCP services that are subject to the Service Perimeter restrictions.

        Must contain a list of services. For example, if
        'storage.googleapis.com' is specified, access to the storage
        buckets inside the perimeter must meet the perimeter's access
        restrictions.
        """
        return self._values.get('restricted_services')

    @builtins.property
    def vpc_accessible_services(self) -> typing.Optional[typing.List["AccessContextManagerServicePerimeterStatusVpcAccessibleServices"]]:
        """vpc_accessible_services block."""
        return self._values.get('vpc_accessible_services')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerServicePerimeterStatus(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerServicePerimeterStatusVpcAccessibleServices", jsii_struct_bases=[], name_mapping={'allowed_services': 'allowedServices', 'enable_restriction': 'enableRestriction'})
class AccessContextManagerServicePerimeterStatusVpcAccessibleServices():
    def __init__(self, *, allowed_services: typing.Optional[typing.List[str]]=None, enable_restriction: typing.Optional[bool]=None) -> None:
        """
        :param allowed_services: The list of APIs usable within the Service Perimeter. Must be empty unless 'enableRestriction' is True.
        :param enable_restriction: Whether to restrict API calls within the Service Perimeter to the list of APIs specified in 'allowedServices'.
        """
        self._values = {
        }
        if allowed_services is not None: self._values["allowed_services"] = allowed_services
        if enable_restriction is not None: self._values["enable_restriction"] = enable_restriction

    @builtins.property
    def allowed_services(self) -> typing.Optional[typing.List[str]]:
        """The list of APIs usable within the Service Perimeter.

        Must be empty unless 'enableRestriction' is True.
        """
        return self._values.get('allowed_services')

    @builtins.property
    def enable_restriction(self) -> typing.Optional[bool]:
        """Whether to restrict API calls within the Service Perimeter to the list of APIs specified in 'allowedServices'."""
        return self._values.get('enable_restriction')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerServicePerimeterStatusVpcAccessibleServices(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AccessContextManagerServicePerimeterTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class AccessContextManagerServicePerimeterTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AccessContextManagerServicePerimeterTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ActiveDirectoryDomain(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ActiveDirectoryDomain"):
    def __init__(self, scope: constructs.Construct, id: str, *, domain_name: str, locations: typing.List[str], reserved_ip_range: str, admin: typing.Optional[str]=None, authorized_networks: typing.Optional[typing.List[str]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ActiveDirectoryDomainTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param domain_name: The fully qualified domain name. e.g. mydomain.myorganization.com, with the restrictions, https://cloud.google.com/managed-microsoft-ad/reference/rest/v1/projects.locations.global.domains.
        :param locations: Locations where domain needs to be provisioned. [regions][compute/docs/regions-zones/] e.g. us-west1 or us-east4 Service supports up to 4 locations at once. Each location will use a /26 block.
        :param reserved_ip_range: The CIDR range of internal addresses that are reserved for this domain. Reserved networks must be /24 or larger. Ranges must be unique and non-overlapping with existing subnets in authorizedNetworks
        :param admin: The name of delegated administrator account used to perform Active Directory operations. If not specified, setupadmin will be used.
        :param authorized_networks: The full names of the Google Compute Engine networks the domain instance is connected to. The domain is only available on networks listed in authorizedNetworks. If CIDR subnets overlap between networks, domain creation will fail.
        :param labels: Resource labels that can contain user-provided metadata.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ActiveDirectoryDomainConfig(domain_name=domain_name, locations=locations, reserved_ip_range=reserved_ip_range, admin=admin, authorized_networks=authorized_networks, labels=labels, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ActiveDirectoryDomain, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> str:
        return jsii.get(self, "fqdn")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="domainName")
    def domain_name(self) -> str:
        return jsii.get(self, "domainName")

    @domain_name.setter
    def domain_name(self, value: str) -> None:
        jsii.set(self, "domainName", value)

    @builtins.property
    @jsii.member(jsii_name="locations")
    def locations(self) -> typing.List[str]:
        return jsii.get(self, "locations")

    @locations.setter
    def locations(self, value: typing.List[str]) -> None:
        jsii.set(self, "locations", value)

    @builtins.property
    @jsii.member(jsii_name="reservedIpRange")
    def reserved_ip_range(self) -> str:
        return jsii.get(self, "reservedIpRange")

    @reserved_ip_range.setter
    def reserved_ip_range(self, value: str) -> None:
        jsii.set(self, "reservedIpRange", value)

    @builtins.property
    @jsii.member(jsii_name="admin")
    def admin(self) -> typing.Optional[str]:
        return jsii.get(self, "admin")

    @admin.setter
    def admin(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "admin", value)

    @builtins.property
    @jsii.member(jsii_name="authorizedNetworks")
    def authorized_networks(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "authorizedNetworks")

    @authorized_networks.setter
    def authorized_networks(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "authorizedNetworks", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ActiveDirectoryDomainTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ActiveDirectoryDomainTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ActiveDirectoryDomainConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'domain_name': 'domainName', 'locations': 'locations', 'reserved_ip_range': 'reservedIpRange', 'admin': 'admin', 'authorized_networks': 'authorizedNetworks', 'labels': 'labels', 'project': 'project', 'timeouts': 'timeouts'})
class ActiveDirectoryDomainConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, domain_name: str, locations: typing.List[str], reserved_ip_range: str, admin: typing.Optional[str]=None, authorized_networks: typing.Optional[typing.List[str]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ActiveDirectoryDomainTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param domain_name: The fully qualified domain name. e.g. mydomain.myorganization.com, with the restrictions, https://cloud.google.com/managed-microsoft-ad/reference/rest/v1/projects.locations.global.domains.
        :param locations: Locations where domain needs to be provisioned. [regions][compute/docs/regions-zones/] e.g. us-west1 or us-east4 Service supports up to 4 locations at once. Each location will use a /26 block.
        :param reserved_ip_range: The CIDR range of internal addresses that are reserved for this domain. Reserved networks must be /24 or larger. Ranges must be unique and non-overlapping with existing subnets in authorizedNetworks
        :param admin: The name of delegated administrator account used to perform Active Directory operations. If not specified, setupadmin will be used.
        :param authorized_networks: The full names of the Google Compute Engine networks the domain instance is connected to. The domain is only available on networks listed in authorizedNetworks. If CIDR subnets overlap between networks, domain creation will fail.
        :param labels: Resource labels that can contain user-provided metadata.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ActiveDirectoryDomainTimeouts(**timeouts)
        self._values = {
            'domain_name': domain_name,
            'locations': locations,
            'reserved_ip_range': reserved_ip_range,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if admin is not None: self._values["admin"] = admin
        if authorized_networks is not None: self._values["authorized_networks"] = authorized_networks
        if labels is not None: self._values["labels"] = labels
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def domain_name(self) -> str:
        """The fully qualified domain name.

        e.g. mydomain.myorganization.com, with the restrictions,
        https://cloud.google.com/managed-microsoft-ad/reference/rest/v1/projects.locations.global.domains.
        """
        return self._values.get('domain_name')

    @builtins.property
    def locations(self) -> typing.List[str]:
        """Locations where domain needs to be provisioned.

        [regions][compute/docs/regions-zones/]
        e.g. us-west1 or us-east4 Service supports up to 4 locations at once. Each location will use a /26 block.
        """
        return self._values.get('locations')

    @builtins.property
    def reserved_ip_range(self) -> str:
        """The CIDR range of internal addresses that are reserved for this domain.

        Reserved networks must be /24 or larger.
        Ranges must be unique and non-overlapping with existing subnets in authorizedNetworks
        """
        return self._values.get('reserved_ip_range')

    @builtins.property
    def admin(self) -> typing.Optional[str]:
        """The name of delegated administrator account used to perform Active Directory operations.

        If not specified, setupadmin will be used.
        """
        return self._values.get('admin')

    @builtins.property
    def authorized_networks(self) -> typing.Optional[typing.List[str]]:
        """The full names of the Google Compute Engine networks the domain instance is connected to.

        The domain is only available on networks listed in authorizedNetworks.
        If CIDR subnets overlap between networks, domain creation will fail.
        """
        return self._values.get('authorized_networks')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Resource labels that can contain user-provided metadata."""
        return self._values.get('labels')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ActiveDirectoryDomainTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ActiveDirectoryDomainConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ActiveDirectoryDomainTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ActiveDirectoryDomainTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ActiveDirectoryDomainTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class AppEngineApplication(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AppEngineApplication"):
    def __init__(self, scope: constructs.Construct, id: str, *, location_id: str, auth_domain: typing.Optional[str]=None, database_type: typing.Optional[str]=None, feature_settings: typing.Optional[typing.List["AppEngineApplicationFeatureSettings"]]=None, iap: typing.Optional[typing.List["AppEngineApplicationIap"]]=None, project: typing.Optional[str]=None, serving_status: typing.Optional[str]=None, timeouts: typing.Optional["AppEngineApplicationTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param location_id: The location to serve the app from.
        :param auth_domain: The domain to authenticate users with when using App Engine's User API.
        :param database_type: 
        :param feature_settings: feature_settings block.
        :param iap: iap block.
        :param project: The project ID to create the application under.
        :param serving_status: The serving status of the app.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppEngineApplicationConfig(location_id=location_id, auth_domain=auth_domain, database_type=database_type, feature_settings=feature_settings, iap=iap, project=project, serving_status=serving_status, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(AppEngineApplication, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="urlDispatchRule")
    def url_dispatch_rule(self, index: str) -> "AppEngineApplicationUrlDispatchRule":
        """
        :param index: -
        """
        return jsii.invoke(self, "urlDispatchRule", [index])

    @builtins.property
    @jsii.member(jsii_name="appId")
    def app_id(self) -> str:
        return jsii.get(self, "appId")

    @builtins.property
    @jsii.member(jsii_name="codeBucket")
    def code_bucket(self) -> str:
        return jsii.get(self, "codeBucket")

    @builtins.property
    @jsii.member(jsii_name="defaultBucket")
    def default_bucket(self) -> str:
        return jsii.get(self, "defaultBucket")

    @builtins.property
    @jsii.member(jsii_name="defaultHostname")
    def default_hostname(self) -> str:
        return jsii.get(self, "defaultHostname")

    @builtins.property
    @jsii.member(jsii_name="gcrDomain")
    def gcr_domain(self) -> str:
        return jsii.get(self, "gcrDomain")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="locationId")
    def location_id(self) -> str:
        return jsii.get(self, "locationId")

    @location_id.setter
    def location_id(self, value: str) -> None:
        jsii.set(self, "locationId", value)

    @builtins.property
    @jsii.member(jsii_name="authDomain")
    def auth_domain(self) -> typing.Optional[str]:
        return jsii.get(self, "authDomain")

    @auth_domain.setter
    def auth_domain(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "authDomain", value)

    @builtins.property
    @jsii.member(jsii_name="databaseType")
    def database_type(self) -> typing.Optional[str]:
        return jsii.get(self, "databaseType")

    @database_type.setter
    def database_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "databaseType", value)

    @builtins.property
    @jsii.member(jsii_name="featureSettings")
    def feature_settings(self) -> typing.Optional[typing.List["AppEngineApplicationFeatureSettings"]]:
        return jsii.get(self, "featureSettings")

    @feature_settings.setter
    def feature_settings(self, value: typing.Optional[typing.List["AppEngineApplicationFeatureSettings"]]) -> None:
        jsii.set(self, "featureSettings", value)

    @builtins.property
    @jsii.member(jsii_name="iap")
    def iap(self) -> typing.Optional[typing.List["AppEngineApplicationIap"]]:
        return jsii.get(self, "iap")

    @iap.setter
    def iap(self, value: typing.Optional[typing.List["AppEngineApplicationIap"]]) -> None:
        jsii.set(self, "iap", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="servingStatus")
    def serving_status(self) -> typing.Optional[str]:
        return jsii.get(self, "servingStatus")

    @serving_status.setter
    def serving_status(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "servingStatus", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["AppEngineApplicationTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["AppEngineApplicationTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineApplicationConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'location_id': 'locationId', 'auth_domain': 'authDomain', 'database_type': 'databaseType', 'feature_settings': 'featureSettings', 'iap': 'iap', 'project': 'project', 'serving_status': 'servingStatus', 'timeouts': 'timeouts'})
class AppEngineApplicationConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, location_id: str, auth_domain: typing.Optional[str]=None, database_type: typing.Optional[str]=None, feature_settings: typing.Optional[typing.List["AppEngineApplicationFeatureSettings"]]=None, iap: typing.Optional[typing.List["AppEngineApplicationIap"]]=None, project: typing.Optional[str]=None, serving_status: typing.Optional[str]=None, timeouts: typing.Optional["AppEngineApplicationTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location_id: The location to serve the app from.
        :param auth_domain: The domain to authenticate users with when using App Engine's User API.
        :param database_type: 
        :param feature_settings: feature_settings block.
        :param iap: iap block.
        :param project: The project ID to create the application under.
        :param serving_status: The serving status of the app.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = AppEngineApplicationTimeouts(**timeouts)
        self._values = {
            'location_id': location_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if auth_domain is not None: self._values["auth_domain"] = auth_domain
        if database_type is not None: self._values["database_type"] = database_type
        if feature_settings is not None: self._values["feature_settings"] = feature_settings
        if iap is not None: self._values["iap"] = iap
        if project is not None: self._values["project"] = project
        if serving_status is not None: self._values["serving_status"] = serving_status
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def location_id(self) -> str:
        """The location to serve the app from."""
        return self._values.get('location_id')

    @builtins.property
    def auth_domain(self) -> typing.Optional[str]:
        """The domain to authenticate users with when using App Engine's User API."""
        return self._values.get('auth_domain')

    @builtins.property
    def database_type(self) -> typing.Optional[str]:
        return self._values.get('database_type')

    @builtins.property
    def feature_settings(self) -> typing.Optional[typing.List["AppEngineApplicationFeatureSettings"]]:
        """feature_settings block."""
        return self._values.get('feature_settings')

    @builtins.property
    def iap(self) -> typing.Optional[typing.List["AppEngineApplicationIap"]]:
        """iap block."""
        return self._values.get('iap')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The project ID to create the application under."""
        return self._values.get('project')

    @builtins.property
    def serving_status(self) -> typing.Optional[str]:
        """The serving status of the app."""
        return self._values.get('serving_status')

    @builtins.property
    def timeouts(self) -> typing.Optional["AppEngineApplicationTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineApplicationConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineApplicationFeatureSettings", jsii_struct_bases=[], name_mapping={'split_health_checks': 'splitHealthChecks'})
class AppEngineApplicationFeatureSettings():
    def __init__(self, *, split_health_checks: bool) -> None:
        """
        :param split_health_checks: 
        """
        self._values = {
            'split_health_checks': split_health_checks,
        }

    @builtins.property
    def split_health_checks(self) -> bool:
        return self._values.get('split_health_checks')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineApplicationFeatureSettings(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineApplicationIap", jsii_struct_bases=[], name_mapping={'oauth2_client_id': 'oauth2ClientId', 'oauth2_client_secret': 'oauth2ClientSecret', 'enabled': 'enabled'})
class AppEngineApplicationIap():
    def __init__(self, *, oauth2_client_id: str, oauth2_client_secret: str, enabled: typing.Optional[bool]=None) -> None:
        """
        :param oauth2_client_id: OAuth2 client ID to use for the authentication flow.
        :param oauth2_client_secret: OAuth2 client secret to use for the authentication flow. The SHA-256 hash of the value is returned in the oauth2ClientSecretSha256 field.
        :param enabled: Adapted for use with the app.
        """
        self._values = {
            'oauth2_client_id': oauth2_client_id,
            'oauth2_client_secret': oauth2_client_secret,
        }
        if enabled is not None: self._values["enabled"] = enabled

    @builtins.property
    def oauth2_client_id(self) -> str:
        """OAuth2 client ID to use for the authentication flow."""
        return self._values.get('oauth2_client_id')

    @builtins.property
    def oauth2_client_secret(self) -> str:
        """OAuth2 client secret to use for the authentication flow.

        The SHA-256 hash of the value is returned in the oauth2ClientSecretSha256 field.
        """
        return self._values.get('oauth2_client_secret')

    @builtins.property
    def enabled(self) -> typing.Optional[bool]:
        """Adapted for use with the app."""
        return self._values.get('enabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineApplicationIap(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineApplicationTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'update': 'update'})
class AppEngineApplicationTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineApplicationTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class AppEngineApplicationUrlDispatchRule(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AppEngineApplicationUrlDispatchRule"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(AppEngineApplicationUrlDispatchRule, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="domain")
    def domain(self) -> str:
        return jsii.get(self, "domain")

    @builtins.property
    @jsii.member(jsii_name="path")
    def path(self) -> str:
        return jsii.get(self, "path")

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")


class AppEngineApplicationUrlDispatchRules(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AppEngineApplicationUrlDispatchRules"):
    def __init__(self, scope: constructs.Construct, id: str, *, dispatch_rules: typing.List["AppEngineApplicationUrlDispatchRulesDispatchRules"], project: typing.Optional[str]=None, timeouts: typing.Optional["AppEngineApplicationUrlDispatchRulesTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dispatch_rules: dispatch_rules block.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppEngineApplicationUrlDispatchRulesConfig(dispatch_rules=dispatch_rules, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(AppEngineApplicationUrlDispatchRules, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="dispatchRules")
    def dispatch_rules(self) -> typing.List["AppEngineApplicationUrlDispatchRulesDispatchRules"]:
        return jsii.get(self, "dispatchRules")

    @dispatch_rules.setter
    def dispatch_rules(self, value: typing.List["AppEngineApplicationUrlDispatchRulesDispatchRules"]) -> None:
        jsii.set(self, "dispatchRules", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["AppEngineApplicationUrlDispatchRulesTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["AppEngineApplicationUrlDispatchRulesTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineApplicationUrlDispatchRulesConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dispatch_rules': 'dispatchRules', 'project': 'project', 'timeouts': 'timeouts'})
class AppEngineApplicationUrlDispatchRulesConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dispatch_rules: typing.List["AppEngineApplicationUrlDispatchRulesDispatchRules"], project: typing.Optional[str]=None, timeouts: typing.Optional["AppEngineApplicationUrlDispatchRulesTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dispatch_rules: dispatch_rules block.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = AppEngineApplicationUrlDispatchRulesTimeouts(**timeouts)
        self._values = {
            'dispatch_rules': dispatch_rules,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dispatch_rules(self) -> typing.List["AppEngineApplicationUrlDispatchRulesDispatchRules"]:
        """dispatch_rules block."""
        return self._values.get('dispatch_rules')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["AppEngineApplicationUrlDispatchRulesTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineApplicationUrlDispatchRulesConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineApplicationUrlDispatchRulesDispatchRules", jsii_struct_bases=[], name_mapping={'path': 'path', 'service': 'service', 'domain': 'domain'})
class AppEngineApplicationUrlDispatchRulesDispatchRules():
    def __init__(self, *, path: str, service: str, domain: typing.Optional[str]=None) -> None:
        """
        :param path: Pathname within the host. Must start with a "/". A single "*" can be included at the end of the path. The sum of the lengths of the domain and path may not exceed 100 characters.
        :param service: Pathname within the host. Must start with a "/". A single "*" can be included at the end of the path. The sum of the lengths of the domain and path may not exceed 100 characters.
        :param domain: Domain name to match against. The wildcard "*" is supported if specified before a period: "*.". Defaults to matching all domains: "*".
        """
        self._values = {
            'path': path,
            'service': service,
        }
        if domain is not None: self._values["domain"] = domain

    @builtins.property
    def path(self) -> str:
        """Pathname within the host.

        Must start with a "/". A single "*" can be included at the end of the path.
        The sum of the lengths of the domain and path may not exceed 100 characters.
        """
        return self._values.get('path')

    @builtins.property
    def service(self) -> str:
        """Pathname within the host.

        Must start with a "/". A single "*" can be included at the end of the path.
        The sum of the lengths of the domain and path may not exceed 100 characters.
        """
        return self._values.get('service')

    @builtins.property
    def domain(self) -> typing.Optional[str]:
        """Domain name to match against.

        The wildcard "*" is supported if specified before a period: "*.".
        Defaults to matching all domains: "*".
        """
        return self._values.get('domain')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineApplicationUrlDispatchRulesDispatchRules(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineApplicationUrlDispatchRulesTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class AppEngineApplicationUrlDispatchRulesTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineApplicationUrlDispatchRulesTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class AppEngineDomainMapping(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AppEngineDomainMapping"):
    def __init__(self, scope: constructs.Construct, id: str, *, domain_name: str, override_strategy: typing.Optional[str]=None, project: typing.Optional[str]=None, ssl_settings: typing.Optional[typing.List["AppEngineDomainMappingSslSettings"]]=None, timeouts: typing.Optional["AppEngineDomainMappingTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param domain_name: Relative name of the domain serving the application. Example: example.com.
        :param override_strategy: Whether the domain creation should override any existing mappings for this domain. By default, overrides are rejected. Default value: "STRICT" Possible values: ["STRICT", "OVERRIDE"]
        :param project: 
        :param ssl_settings: ssl_settings block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppEngineDomainMappingConfig(domain_name=domain_name, override_strategy=override_strategy, project=project, ssl_settings=ssl_settings, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(AppEngineDomainMapping, self, [scope, id, config])

    @jsii.member(jsii_name="resourceRecords")
    def resource_records(self, index: str) -> "AppEngineDomainMappingResourceRecords":
        """
        :param index: -
        """
        return jsii.invoke(self, "resourceRecords", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="domainName")
    def domain_name(self) -> str:
        return jsii.get(self, "domainName")

    @domain_name.setter
    def domain_name(self, value: str) -> None:
        jsii.set(self, "domainName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="overrideStrategy")
    def override_strategy(self) -> typing.Optional[str]:
        return jsii.get(self, "overrideStrategy")

    @override_strategy.setter
    def override_strategy(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "overrideStrategy", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="sslSettings")
    def ssl_settings(self) -> typing.Optional[typing.List["AppEngineDomainMappingSslSettings"]]:
        return jsii.get(self, "sslSettings")

    @ssl_settings.setter
    def ssl_settings(self, value: typing.Optional[typing.List["AppEngineDomainMappingSslSettings"]]) -> None:
        jsii.set(self, "sslSettings", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["AppEngineDomainMappingTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["AppEngineDomainMappingTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineDomainMappingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'domain_name': 'domainName', 'override_strategy': 'overrideStrategy', 'project': 'project', 'ssl_settings': 'sslSettings', 'timeouts': 'timeouts'})
class AppEngineDomainMappingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, domain_name: str, override_strategy: typing.Optional[str]=None, project: typing.Optional[str]=None, ssl_settings: typing.Optional[typing.List["AppEngineDomainMappingSslSettings"]]=None, timeouts: typing.Optional["AppEngineDomainMappingTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param domain_name: Relative name of the domain serving the application. Example: example.com.
        :param override_strategy: Whether the domain creation should override any existing mappings for this domain. By default, overrides are rejected. Default value: "STRICT" Possible values: ["STRICT", "OVERRIDE"]
        :param project: 
        :param ssl_settings: ssl_settings block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = AppEngineDomainMappingTimeouts(**timeouts)
        self._values = {
            'domain_name': domain_name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if override_strategy is not None: self._values["override_strategy"] = override_strategy
        if project is not None: self._values["project"] = project
        if ssl_settings is not None: self._values["ssl_settings"] = ssl_settings
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def domain_name(self) -> str:
        """Relative name of the domain serving the application.

        Example: example.com.
        """
        return self._values.get('domain_name')

    @builtins.property
    def override_strategy(self) -> typing.Optional[str]:
        """Whether the domain creation should override any existing mappings for this domain.

        By default, overrides are rejected. Default value: "STRICT" Possible values: ["STRICT", "OVERRIDE"]
        """
        return self._values.get('override_strategy')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def ssl_settings(self) -> typing.Optional[typing.List["AppEngineDomainMappingSslSettings"]]:
        """ssl_settings block."""
        return self._values.get('ssl_settings')

    @builtins.property
    def timeouts(self) -> typing.Optional["AppEngineDomainMappingTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineDomainMappingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class AppEngineDomainMappingResourceRecords(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AppEngineDomainMappingResourceRecords"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(AppEngineDomainMappingResourceRecords, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="rrdata")
    def rrdata(self) -> str:
        return jsii.get(self, "rrdata")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineDomainMappingSslSettings", jsii_struct_bases=[], name_mapping={'ssl_management_type': 'sslManagementType', 'certificate_id': 'certificateId'})
class AppEngineDomainMappingSslSettings():
    def __init__(self, *, ssl_management_type: str, certificate_id: typing.Optional[str]=None) -> None:
        """
        :param ssl_management_type: SSL management type for this domain. If 'AUTOMATIC', a managed certificate is automatically provisioned. If 'MANUAL', 'certificateId' must be manually specified in order to configure SSL for this domain. Possible values: ["AUTOMATIC", "MANUAL"]
        :param certificate_id: ID of the AuthorizedCertificate resource configuring SSL for the application. Clearing this field will remove SSL support. By default, a managed certificate is automatically created for every domain mapping. To omit SSL support or to configure SSL manually, specify 'SslManagementType.MANUAL' on a 'CREATE' or 'UPDATE' request. You must be authorized to administer the 'AuthorizedCertificate' resource to manually map it to a DomainMapping resource. Example: 12345.
        """
        self._values = {
            'ssl_management_type': ssl_management_type,
        }
        if certificate_id is not None: self._values["certificate_id"] = certificate_id

    @builtins.property
    def ssl_management_type(self) -> str:
        """SSL management type for this domain.

        If 'AUTOMATIC', a managed certificate is automatically provisioned.
        If 'MANUAL', 'certificateId' must be manually specified in order to configure SSL for this domain. Possible values: ["AUTOMATIC", "MANUAL"]
        """
        return self._values.get('ssl_management_type')

    @builtins.property
    def certificate_id(self) -> typing.Optional[str]:
        """ID of the AuthorizedCertificate resource configuring SSL for the application.

        Clearing this field will
        remove SSL support.
        By default, a managed certificate is automatically created for every domain mapping. To omit SSL support
        or to configure SSL manually, specify 'SslManagementType.MANUAL' on a 'CREATE' or 'UPDATE' request. You must be
        authorized to administer the 'AuthorizedCertificate' resource to manually map it to a DomainMapping resource.
        Example: 12345.
        """
        return self._values.get('certificate_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineDomainMappingSslSettings(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineDomainMappingTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class AppEngineDomainMappingTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineDomainMappingTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class AppEngineFirewallRule(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AppEngineFirewallRule"):
    def __init__(self, scope: constructs.Construct, id: str, *, action: str, source_range: str, description: typing.Optional[str]=None, priority: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["AppEngineFirewallRuleTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param action: The action to take if this rule matches. Possible values: ["UNSPECIFIED_ACTION", "ALLOW", "DENY"]
        :param source_range: IP address or range, defined using CIDR notation, of requests that this rule applies to.
        :param description: An optional string description of this rule.
        :param priority: A positive integer that defines the order of rule evaluation. Rules with the lowest priority are evaluated first. A default rule at priority Int32.MaxValue matches all IPv4 and IPv6 traffic when no previous rule matches. Only the action of this rule can be modified by the user.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppEngineFirewallRuleConfig(action=action, source_range=source_range, description=description, priority=priority, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(AppEngineFirewallRule, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="action")
    def action(self) -> str:
        return jsii.get(self, "action")

    @action.setter
    def action(self, value: str) -> None:
        jsii.set(self, "action", value)

    @builtins.property
    @jsii.member(jsii_name="sourceRange")
    def source_range(self) -> str:
        return jsii.get(self, "sourceRange")

    @source_range.setter
    def source_range(self, value: str) -> None:
        jsii.set(self, "sourceRange", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="priority")
    def priority(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "priority")

    @priority.setter
    def priority(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "priority", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["AppEngineFirewallRuleTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["AppEngineFirewallRuleTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFirewallRuleConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'action': 'action', 'source_range': 'sourceRange', 'description': 'description', 'priority': 'priority', 'project': 'project', 'timeouts': 'timeouts'})
class AppEngineFirewallRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, action: str, source_range: str, description: typing.Optional[str]=None, priority: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["AppEngineFirewallRuleTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param action: The action to take if this rule matches. Possible values: ["UNSPECIFIED_ACTION", "ALLOW", "DENY"]
        :param source_range: IP address or range, defined using CIDR notation, of requests that this rule applies to.
        :param description: An optional string description of this rule.
        :param priority: A positive integer that defines the order of rule evaluation. Rules with the lowest priority are evaluated first. A default rule at priority Int32.MaxValue matches all IPv4 and IPv6 traffic when no previous rule matches. Only the action of this rule can be modified by the user.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = AppEngineFirewallRuleTimeouts(**timeouts)
        self._values = {
            'action': action,
            'source_range': source_range,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if priority is not None: self._values["priority"] = priority
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def action(self) -> str:
        """The action to take if this rule matches.

        Possible values: ["UNSPECIFIED_ACTION", "ALLOW", "DENY"]
        """
        return self._values.get('action')

    @builtins.property
    def source_range(self) -> str:
        """IP address or range, defined using CIDR notation, of requests that this rule applies to."""
        return self._values.get('source_range')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional string description of this rule."""
        return self._values.get('description')

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        """A positive integer that defines the order of rule evaluation. Rules with the lowest priority are evaluated first.

        A default rule at priority Int32.MaxValue matches all IPv4 and
        IPv6 traffic when no previous rule matches. Only the action of
        this rule can be modified by the user.
        """
        return self._values.get('priority')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["AppEngineFirewallRuleTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFirewallRuleConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFirewallRuleTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class AppEngineFirewallRuleTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFirewallRuleTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class AppEngineFlexibleAppVersion(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersion"):
    def __init__(self, scope: constructs.Construct, id: str, *, liveness_check: typing.List["AppEngineFlexibleAppVersionLivenessCheck"], readiness_check: typing.List["AppEngineFlexibleAppVersionReadinessCheck"], runtime: str, service: str, api_config: typing.Optional[typing.List["AppEngineFlexibleAppVersionApiConfig"]]=None, automatic_scaling: typing.Optional[typing.List["AppEngineFlexibleAppVersionAutomaticScaling"]]=None, beta_settings: typing.Optional[typing.Mapping[str, str]]=None, default_expiration: typing.Optional[str]=None, delete_service_on_destroy: typing.Optional[bool]=None, deployment: typing.Optional[typing.List["AppEngineFlexibleAppVersionDeployment"]]=None, endpoints_api_service: typing.Optional[typing.List["AppEngineFlexibleAppVersionEndpointsApiService"]]=None, entrypoint: typing.Optional[typing.List["AppEngineFlexibleAppVersionEntrypoint"]]=None, env_variables: typing.Optional[typing.Mapping[str, str]]=None, handlers: typing.Optional[typing.List["AppEngineFlexibleAppVersionHandlers"]]=None, inbound_services: typing.Optional[typing.List[str]]=None, instance_class: typing.Optional[str]=None, manual_scaling: typing.Optional[typing.List["AppEngineFlexibleAppVersionManualScaling"]]=None, network: typing.Optional[typing.List["AppEngineFlexibleAppVersionNetwork"]]=None, nobuild_files_regex: typing.Optional[str]=None, noop_on_destroy: typing.Optional[bool]=None, project: typing.Optional[str]=None, resources: typing.Optional[typing.List["AppEngineFlexibleAppVersionResources"]]=None, runtime_api_version: typing.Optional[str]=None, runtime_channel: typing.Optional[str]=None, runtime_main_executable_path: typing.Optional[str]=None, serving_status: typing.Optional[str]=None, timeouts: typing.Optional["AppEngineFlexibleAppVersionTimeouts"]=None, version_id: typing.Optional[str]=None, vpc_access_connector: typing.Optional[typing.List["AppEngineFlexibleAppVersionVpcAccessConnector"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param liveness_check: liveness_check block.
        :param readiness_check: readiness_check block.
        :param runtime: Desired runtime. Example python27.
        :param service: AppEngine service resource.
        :param api_config: api_config block.
        :param automatic_scaling: automatic_scaling block.
        :param beta_settings: Metadata settings that are supplied to this version to enable beta runtime features.
        :param default_expiration: Duration that static files should be cached by web proxies and browsers. Only applicable if the corresponding StaticFilesHandler does not specify its own expiration time.
        :param delete_service_on_destroy: 
        :param deployment: deployment block.
        :param endpoints_api_service: endpoints_api_service block.
        :param entrypoint: entrypoint block.
        :param env_variables: Environment variables available to the application. As these are not returned in the API request, Terraform will not detect any changes made outside of the Terraform config.
        :param handlers: handlers block.
        :param inbound_services: A list of the types of messages that this application is able to receive. Possible values: ["INBOUND_SERVICE_MAIL", "INBOUND_SERVICE_MAIL_BOUNCE", "INBOUND_SERVICE_XMPP_ERROR", "INBOUND_SERVICE_XMPP_MESSAGE", "INBOUND_SERVICE_XMPP_SUBSCRIBE", "INBOUND_SERVICE_XMPP_PRESENCE", "INBOUND_SERVICE_CHANNEL_PRESENCE", "INBOUND_SERVICE_WARMUP"]
        :param instance_class: Instance class that is used to run this version. Valid values are AutomaticScaling: F1, F2, F4, F4_1G ManualScaling: B1, B2, B4, B8, B4_1G Defaults to F1 for AutomaticScaling and B1 for ManualScaling.
        :param manual_scaling: manual_scaling block.
        :param network: network block.
        :param nobuild_files_regex: Files that match this pattern will not be built into this version. Only applicable for Go runtimes.
        :param noop_on_destroy: 
        :param project: 
        :param resources: resources block.
        :param runtime_api_version: The version of the API in the given runtime environment. Please see the app.yaml reference for valid values at https://cloud.google.com/appengine/docs/standard//config/appref
        :param runtime_channel: The channel of the runtime to use. Only available for some runtimes.
        :param runtime_main_executable_path: The path or name of the app's main executable.
        :param serving_status: Current serving status of this version. Only the versions with a SERVING status create instances and can be billed. Default value: "SERVING" Possible values: ["SERVING", "STOPPED"]
        :param timeouts: timeouts block.
        :param version_id: Relative name of the version within the service. For example, 'v1'. Version names can contain only lowercase letters, numbers, or hyphens. Reserved names,"default", "latest", and any name with the prefix "ah-".
        :param vpc_access_connector: vpc_access_connector block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppEngineFlexibleAppVersionConfig(liveness_check=liveness_check, readiness_check=readiness_check, runtime=runtime, service=service, api_config=api_config, automatic_scaling=automatic_scaling, beta_settings=beta_settings, default_expiration=default_expiration, delete_service_on_destroy=delete_service_on_destroy, deployment=deployment, endpoints_api_service=endpoints_api_service, entrypoint=entrypoint, env_variables=env_variables, handlers=handlers, inbound_services=inbound_services, instance_class=instance_class, manual_scaling=manual_scaling, network=network, nobuild_files_regex=nobuild_files_regex, noop_on_destroy=noop_on_destroy, project=project, resources=resources, runtime_api_version=runtime_api_version, runtime_channel=runtime_channel, runtime_main_executable_path=runtime_main_executable_path, serving_status=serving_status, timeouts=timeouts, version_id=version_id, vpc_access_connector=vpc_access_connector, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(AppEngineFlexibleAppVersion, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="livenessCheck")
    def liveness_check(self) -> typing.List["AppEngineFlexibleAppVersionLivenessCheck"]:
        return jsii.get(self, "livenessCheck")

    @liveness_check.setter
    def liveness_check(self, value: typing.List["AppEngineFlexibleAppVersionLivenessCheck"]) -> None:
        jsii.set(self, "livenessCheck", value)

    @builtins.property
    @jsii.member(jsii_name="readinessCheck")
    def readiness_check(self) -> typing.List["AppEngineFlexibleAppVersionReadinessCheck"]:
        return jsii.get(self, "readinessCheck")

    @readiness_check.setter
    def readiness_check(self, value: typing.List["AppEngineFlexibleAppVersionReadinessCheck"]) -> None:
        jsii.set(self, "readinessCheck", value)

    @builtins.property
    @jsii.member(jsii_name="runtime")
    def runtime(self) -> str:
        return jsii.get(self, "runtime")

    @runtime.setter
    def runtime(self, value: str) -> None:
        jsii.set(self, "runtime", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="apiConfig")
    def api_config(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionApiConfig"]]:
        return jsii.get(self, "apiConfig")

    @api_config.setter
    def api_config(self, value: typing.Optional[typing.List["AppEngineFlexibleAppVersionApiConfig"]]) -> None:
        jsii.set(self, "apiConfig", value)

    @builtins.property
    @jsii.member(jsii_name="automaticScaling")
    def automatic_scaling(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionAutomaticScaling"]]:
        return jsii.get(self, "automaticScaling")

    @automatic_scaling.setter
    def automatic_scaling(self, value: typing.Optional[typing.List["AppEngineFlexibleAppVersionAutomaticScaling"]]) -> None:
        jsii.set(self, "automaticScaling", value)

    @builtins.property
    @jsii.member(jsii_name="betaSettings")
    def beta_settings(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "betaSettings")

    @beta_settings.setter
    def beta_settings(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "betaSettings", value)

    @builtins.property
    @jsii.member(jsii_name="defaultExpiration")
    def default_expiration(self) -> typing.Optional[str]:
        return jsii.get(self, "defaultExpiration")

    @default_expiration.setter
    def default_expiration(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "defaultExpiration", value)

    @builtins.property
    @jsii.member(jsii_name="deleteServiceOnDestroy")
    def delete_service_on_destroy(self) -> typing.Optional[bool]:
        return jsii.get(self, "deleteServiceOnDestroy")

    @delete_service_on_destroy.setter
    def delete_service_on_destroy(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "deleteServiceOnDestroy", value)

    @builtins.property
    @jsii.member(jsii_name="deployment")
    def deployment(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionDeployment"]]:
        return jsii.get(self, "deployment")

    @deployment.setter
    def deployment(self, value: typing.Optional[typing.List["AppEngineFlexibleAppVersionDeployment"]]) -> None:
        jsii.set(self, "deployment", value)

    @builtins.property
    @jsii.member(jsii_name="endpointsApiService")
    def endpoints_api_service(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionEndpointsApiService"]]:
        return jsii.get(self, "endpointsApiService")

    @endpoints_api_service.setter
    def endpoints_api_service(self, value: typing.Optional[typing.List["AppEngineFlexibleAppVersionEndpointsApiService"]]) -> None:
        jsii.set(self, "endpointsApiService", value)

    @builtins.property
    @jsii.member(jsii_name="entrypoint")
    def entrypoint(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionEntrypoint"]]:
        return jsii.get(self, "entrypoint")

    @entrypoint.setter
    def entrypoint(self, value: typing.Optional[typing.List["AppEngineFlexibleAppVersionEntrypoint"]]) -> None:
        jsii.set(self, "entrypoint", value)

    @builtins.property
    @jsii.member(jsii_name="envVariables")
    def env_variables(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "envVariables")

    @env_variables.setter
    def env_variables(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "envVariables", value)

    @builtins.property
    @jsii.member(jsii_name="handlers")
    def handlers(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionHandlers"]]:
        return jsii.get(self, "handlers")

    @handlers.setter
    def handlers(self, value: typing.Optional[typing.List["AppEngineFlexibleAppVersionHandlers"]]) -> None:
        jsii.set(self, "handlers", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="inboundServices")
    def inbound_services(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "inboundServices")

    @inbound_services.setter
    def inbound_services(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "inboundServices", value)

    @builtins.property
    @jsii.member(jsii_name="instanceClass")
    def instance_class(self) -> typing.Optional[str]:
        return jsii.get(self, "instanceClass")

    @instance_class.setter
    def instance_class(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "instanceClass", value)

    @builtins.property
    @jsii.member(jsii_name="manualScaling")
    def manual_scaling(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionManualScaling"]]:
        return jsii.get(self, "manualScaling")

    @manual_scaling.setter
    def manual_scaling(self, value: typing.Optional[typing.List["AppEngineFlexibleAppVersionManualScaling"]]) -> None:
        jsii.set(self, "manualScaling", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionNetwork"]]:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: typing.Optional[typing.List["AppEngineFlexibleAppVersionNetwork"]]) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="nobuildFilesRegex")
    def nobuild_files_regex(self) -> typing.Optional[str]:
        return jsii.get(self, "nobuildFilesRegex")

    @nobuild_files_regex.setter
    def nobuild_files_regex(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "nobuildFilesRegex", value)

    @builtins.property
    @jsii.member(jsii_name="noopOnDestroy")
    def noop_on_destroy(self) -> typing.Optional[bool]:
        return jsii.get(self, "noopOnDestroy")

    @noop_on_destroy.setter
    def noop_on_destroy(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "noopOnDestroy", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="resources")
    def resources(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionResources"]]:
        return jsii.get(self, "resources")

    @resources.setter
    def resources(self, value: typing.Optional[typing.List["AppEngineFlexibleAppVersionResources"]]) -> None:
        jsii.set(self, "resources", value)

    @builtins.property
    @jsii.member(jsii_name="runtimeApiVersion")
    def runtime_api_version(self) -> typing.Optional[str]:
        return jsii.get(self, "runtimeApiVersion")

    @runtime_api_version.setter
    def runtime_api_version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "runtimeApiVersion", value)

    @builtins.property
    @jsii.member(jsii_name="runtimeChannel")
    def runtime_channel(self) -> typing.Optional[str]:
        return jsii.get(self, "runtimeChannel")

    @runtime_channel.setter
    def runtime_channel(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "runtimeChannel", value)

    @builtins.property
    @jsii.member(jsii_name="runtimeMainExecutablePath")
    def runtime_main_executable_path(self) -> typing.Optional[str]:
        return jsii.get(self, "runtimeMainExecutablePath")

    @runtime_main_executable_path.setter
    def runtime_main_executable_path(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "runtimeMainExecutablePath", value)

    @builtins.property
    @jsii.member(jsii_name="servingStatus")
    def serving_status(self) -> typing.Optional[str]:
        return jsii.get(self, "servingStatus")

    @serving_status.setter
    def serving_status(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "servingStatus", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["AppEngineFlexibleAppVersionTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["AppEngineFlexibleAppVersionTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="versionId")
    def version_id(self) -> typing.Optional[str]:
        return jsii.get(self, "versionId")

    @version_id.setter
    def version_id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "versionId", value)

    @builtins.property
    @jsii.member(jsii_name="vpcAccessConnector")
    def vpc_access_connector(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionVpcAccessConnector"]]:
        return jsii.get(self, "vpcAccessConnector")

    @vpc_access_connector.setter
    def vpc_access_connector(self, value: typing.Optional[typing.List["AppEngineFlexibleAppVersionVpcAccessConnector"]]) -> None:
        jsii.set(self, "vpcAccessConnector", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionApiConfig", jsii_struct_bases=[], name_mapping={'script': 'script', 'auth_fail_action': 'authFailAction', 'login': 'login', 'security_level': 'securityLevel', 'url': 'url'})
class AppEngineFlexibleAppVersionApiConfig():
    def __init__(self, *, script: str, auth_fail_action: typing.Optional[str]=None, login: typing.Optional[str]=None, security_level: typing.Optional[str]=None, url: typing.Optional[str]=None) -> None:
        """
        :param script: Path to the script from the application root directory.
        :param auth_fail_action: Action to take when users access resources that require authentication. Default value: "AUTH_FAIL_ACTION_REDIRECT" Possible values: ["AUTH_FAIL_ACTION_REDIRECT", "AUTH_FAIL_ACTION_UNAUTHORIZED"]
        :param login: Level of login required to access this resource. Default value: "LOGIN_OPTIONAL" Possible values: ["LOGIN_OPTIONAL", "LOGIN_ADMIN", "LOGIN_REQUIRED"]
        :param security_level: Security (HTTPS) enforcement for this URL. Possible values: ["SECURE_DEFAULT", "SECURE_NEVER", "SECURE_OPTIONAL", "SECURE_ALWAYS"]
        :param url: URL to serve the endpoint at.
        """
        self._values = {
            'script': script,
        }
        if auth_fail_action is not None: self._values["auth_fail_action"] = auth_fail_action
        if login is not None: self._values["login"] = login
        if security_level is not None: self._values["security_level"] = security_level
        if url is not None: self._values["url"] = url

    @builtins.property
    def script(self) -> str:
        """Path to the script from the application root directory."""
        return self._values.get('script')

    @builtins.property
    def auth_fail_action(self) -> typing.Optional[str]:
        """Action to take when users access resources that require authentication.

        Default value: "AUTH_FAIL_ACTION_REDIRECT" Possible values: ["AUTH_FAIL_ACTION_REDIRECT", "AUTH_FAIL_ACTION_UNAUTHORIZED"]
        """
        return self._values.get('auth_fail_action')

    @builtins.property
    def login(self) -> typing.Optional[str]:
        """Level of login required to access this resource.

        Default value: "LOGIN_OPTIONAL" Possible values: ["LOGIN_OPTIONAL", "LOGIN_ADMIN", "LOGIN_REQUIRED"]
        """
        return self._values.get('login')

    @builtins.property
    def security_level(self) -> typing.Optional[str]:
        """Security (HTTPS) enforcement for this URL.

        Possible values: ["SECURE_DEFAULT", "SECURE_NEVER", "SECURE_OPTIONAL", "SECURE_ALWAYS"]
        """
        return self._values.get('security_level')

    @builtins.property
    def url(self) -> typing.Optional[str]:
        """URL to serve the endpoint at."""
        return self._values.get('url')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionApiConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionAutomaticScaling", jsii_struct_bases=[], name_mapping={'cpu_utilization': 'cpuUtilization', 'cool_down_period': 'coolDownPeriod', 'disk_utilization': 'diskUtilization', 'max_concurrent_requests': 'maxConcurrentRequests', 'max_idle_instances': 'maxIdleInstances', 'max_pending_latency': 'maxPendingLatency', 'max_total_instances': 'maxTotalInstances', 'min_idle_instances': 'minIdleInstances', 'min_pending_latency': 'minPendingLatency', 'min_total_instances': 'minTotalInstances', 'network_utilization': 'networkUtilization', 'request_utilization': 'requestUtilization'})
class AppEngineFlexibleAppVersionAutomaticScaling():
    def __init__(self, *, cpu_utilization: typing.List["AppEngineFlexibleAppVersionAutomaticScalingCpuUtilization"], cool_down_period: typing.Optional[str]=None, disk_utilization: typing.Optional[typing.List["AppEngineFlexibleAppVersionAutomaticScalingDiskUtilization"]]=None, max_concurrent_requests: typing.Optional[jsii.Number]=None, max_idle_instances: typing.Optional[jsii.Number]=None, max_pending_latency: typing.Optional[str]=None, max_total_instances: typing.Optional[jsii.Number]=None, min_idle_instances: typing.Optional[jsii.Number]=None, min_pending_latency: typing.Optional[str]=None, min_total_instances: typing.Optional[jsii.Number]=None, network_utilization: typing.Optional[typing.List["AppEngineFlexibleAppVersionAutomaticScalingNetworkUtilization"]]=None, request_utilization: typing.Optional[typing.List["AppEngineFlexibleAppVersionAutomaticScalingRequestUtilization"]]=None) -> None:
        """
        :param cpu_utilization: cpu_utilization block.
        :param cool_down_period: The time period that the Autoscaler should wait before it starts collecting information from a new instance. This prevents the autoscaler from collecting information when the instance is initializing, during which the collected usage would not be reliable. Default: 120s
        :param disk_utilization: disk_utilization block.
        :param max_concurrent_requests: Number of concurrent requests an automatic scaling instance can accept before the scheduler spawns a new instance. Defaults to a runtime-specific value.
        :param max_idle_instances: Maximum number of idle instances that should be maintained for this version.
        :param max_pending_latency: Maximum amount of time that a request should wait in the pending queue before starting a new instance to handle it.
        :param max_total_instances: Maximum number of instances that should be started to handle requests for this version. Default: 20
        :param min_idle_instances: Minimum number of idle instances that should be maintained for this version. Only applicable for the default version of a service.
        :param min_pending_latency: Minimum amount of time a request should wait in the pending queue before starting a new instance to handle it.
        :param min_total_instances: Minimum number of running instances that should be maintained for this version. Default: 2
        :param network_utilization: network_utilization block.
        :param request_utilization: request_utilization block.
        """
        self._values = {
            'cpu_utilization': cpu_utilization,
        }
        if cool_down_period is not None: self._values["cool_down_period"] = cool_down_period
        if disk_utilization is not None: self._values["disk_utilization"] = disk_utilization
        if max_concurrent_requests is not None: self._values["max_concurrent_requests"] = max_concurrent_requests
        if max_idle_instances is not None: self._values["max_idle_instances"] = max_idle_instances
        if max_pending_latency is not None: self._values["max_pending_latency"] = max_pending_latency
        if max_total_instances is not None: self._values["max_total_instances"] = max_total_instances
        if min_idle_instances is not None: self._values["min_idle_instances"] = min_idle_instances
        if min_pending_latency is not None: self._values["min_pending_latency"] = min_pending_latency
        if min_total_instances is not None: self._values["min_total_instances"] = min_total_instances
        if network_utilization is not None: self._values["network_utilization"] = network_utilization
        if request_utilization is not None: self._values["request_utilization"] = request_utilization

    @builtins.property
    def cpu_utilization(self) -> typing.List["AppEngineFlexibleAppVersionAutomaticScalingCpuUtilization"]:
        """cpu_utilization block."""
        return self._values.get('cpu_utilization')

    @builtins.property
    def cool_down_period(self) -> typing.Optional[str]:
        """The time period that the Autoscaler should wait before it starts collecting information from a new instance.

        This prevents the autoscaler from collecting information when the instance is initializing,
        during which the collected usage would not be reliable. Default: 120s
        """
        return self._values.get('cool_down_period')

    @builtins.property
    def disk_utilization(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionAutomaticScalingDiskUtilization"]]:
        """disk_utilization block."""
        return self._values.get('disk_utilization')

    @builtins.property
    def max_concurrent_requests(self) -> typing.Optional[jsii.Number]:
        """Number of concurrent requests an automatic scaling instance can accept before the scheduler spawns a new instance.

        Defaults to a runtime-specific value.
        """
        return self._values.get('max_concurrent_requests')

    @builtins.property
    def max_idle_instances(self) -> typing.Optional[jsii.Number]:
        """Maximum number of idle instances that should be maintained for this version."""
        return self._values.get('max_idle_instances')

    @builtins.property
    def max_pending_latency(self) -> typing.Optional[str]:
        """Maximum amount of time that a request should wait in the pending queue before starting a new instance to handle it."""
        return self._values.get('max_pending_latency')

    @builtins.property
    def max_total_instances(self) -> typing.Optional[jsii.Number]:
        """Maximum number of instances that should be started to handle requests for this version.

        Default: 20
        """
        return self._values.get('max_total_instances')

    @builtins.property
    def min_idle_instances(self) -> typing.Optional[jsii.Number]:
        """Minimum number of idle instances that should be maintained for this version.

        Only applicable for the default version of a service.
        """
        return self._values.get('min_idle_instances')

    @builtins.property
    def min_pending_latency(self) -> typing.Optional[str]:
        """Minimum amount of time a request should wait in the pending queue before starting a new instance to handle it."""
        return self._values.get('min_pending_latency')

    @builtins.property
    def min_total_instances(self) -> typing.Optional[jsii.Number]:
        """Minimum number of running instances that should be maintained for this version.

        Default: 2
        """
        return self._values.get('min_total_instances')

    @builtins.property
    def network_utilization(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionAutomaticScalingNetworkUtilization"]]:
        """network_utilization block."""
        return self._values.get('network_utilization')

    @builtins.property
    def request_utilization(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionAutomaticScalingRequestUtilization"]]:
        """request_utilization block."""
        return self._values.get('request_utilization')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionAutomaticScaling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionAutomaticScalingCpuUtilization", jsii_struct_bases=[], name_mapping={'target_utilization': 'targetUtilization', 'aggregation_window_length': 'aggregationWindowLength'})
class AppEngineFlexibleAppVersionAutomaticScalingCpuUtilization():
    def __init__(self, *, target_utilization: jsii.Number, aggregation_window_length: typing.Optional[str]=None) -> None:
        """
        :param target_utilization: Target CPU utilization ratio to maintain when scaling. Must be between 0 and 1.
        :param aggregation_window_length: Period of time over which CPU utilization is calculated.
        """
        self._values = {
            'target_utilization': target_utilization,
        }
        if aggregation_window_length is not None: self._values["aggregation_window_length"] = aggregation_window_length

    @builtins.property
    def target_utilization(self) -> jsii.Number:
        """Target CPU utilization ratio to maintain when scaling.

        Must be between 0 and 1.
        """
        return self._values.get('target_utilization')

    @builtins.property
    def aggregation_window_length(self) -> typing.Optional[str]:
        """Period of time over which CPU utilization is calculated."""
        return self._values.get('aggregation_window_length')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionAutomaticScalingCpuUtilization(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionAutomaticScalingDiskUtilization", jsii_struct_bases=[], name_mapping={'target_read_bytes_per_second': 'targetReadBytesPerSecond', 'target_read_ops_per_second': 'targetReadOpsPerSecond', 'target_write_bytes_per_second': 'targetWriteBytesPerSecond', 'target_write_ops_per_second': 'targetWriteOpsPerSecond'})
class AppEngineFlexibleAppVersionAutomaticScalingDiskUtilization():
    def __init__(self, *, target_read_bytes_per_second: typing.Optional[jsii.Number]=None, target_read_ops_per_second: typing.Optional[jsii.Number]=None, target_write_bytes_per_second: typing.Optional[jsii.Number]=None, target_write_ops_per_second: typing.Optional[jsii.Number]=None) -> None:
        """
        :param target_read_bytes_per_second: Target bytes read per second.
        :param target_read_ops_per_second: Target ops read per seconds.
        :param target_write_bytes_per_second: Target bytes written per second.
        :param target_write_ops_per_second: Target ops written per second.
        """
        self._values = {
        }
        if target_read_bytes_per_second is not None: self._values["target_read_bytes_per_second"] = target_read_bytes_per_second
        if target_read_ops_per_second is not None: self._values["target_read_ops_per_second"] = target_read_ops_per_second
        if target_write_bytes_per_second is not None: self._values["target_write_bytes_per_second"] = target_write_bytes_per_second
        if target_write_ops_per_second is not None: self._values["target_write_ops_per_second"] = target_write_ops_per_second

    @builtins.property
    def target_read_bytes_per_second(self) -> typing.Optional[jsii.Number]:
        """Target bytes read per second."""
        return self._values.get('target_read_bytes_per_second')

    @builtins.property
    def target_read_ops_per_second(self) -> typing.Optional[jsii.Number]:
        """Target ops read per seconds."""
        return self._values.get('target_read_ops_per_second')

    @builtins.property
    def target_write_bytes_per_second(self) -> typing.Optional[jsii.Number]:
        """Target bytes written per second."""
        return self._values.get('target_write_bytes_per_second')

    @builtins.property
    def target_write_ops_per_second(self) -> typing.Optional[jsii.Number]:
        """Target ops written per second."""
        return self._values.get('target_write_ops_per_second')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionAutomaticScalingDiskUtilization(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionAutomaticScalingNetworkUtilization", jsii_struct_bases=[], name_mapping={'target_received_bytes_per_second': 'targetReceivedBytesPerSecond', 'target_received_packets_per_second': 'targetReceivedPacketsPerSecond', 'target_sent_bytes_per_second': 'targetSentBytesPerSecond', 'target_sent_packets_per_second': 'targetSentPacketsPerSecond'})
class AppEngineFlexibleAppVersionAutomaticScalingNetworkUtilization():
    def __init__(self, *, target_received_bytes_per_second: typing.Optional[jsii.Number]=None, target_received_packets_per_second: typing.Optional[jsii.Number]=None, target_sent_bytes_per_second: typing.Optional[jsii.Number]=None, target_sent_packets_per_second: typing.Optional[jsii.Number]=None) -> None:
        """
        :param target_received_bytes_per_second: Target bytes received per second.
        :param target_received_packets_per_second: Target packets received per second.
        :param target_sent_bytes_per_second: Target bytes sent per second.
        :param target_sent_packets_per_second: Target packets sent per second.
        """
        self._values = {
        }
        if target_received_bytes_per_second is not None: self._values["target_received_bytes_per_second"] = target_received_bytes_per_second
        if target_received_packets_per_second is not None: self._values["target_received_packets_per_second"] = target_received_packets_per_second
        if target_sent_bytes_per_second is not None: self._values["target_sent_bytes_per_second"] = target_sent_bytes_per_second
        if target_sent_packets_per_second is not None: self._values["target_sent_packets_per_second"] = target_sent_packets_per_second

    @builtins.property
    def target_received_bytes_per_second(self) -> typing.Optional[jsii.Number]:
        """Target bytes received per second."""
        return self._values.get('target_received_bytes_per_second')

    @builtins.property
    def target_received_packets_per_second(self) -> typing.Optional[jsii.Number]:
        """Target packets received per second."""
        return self._values.get('target_received_packets_per_second')

    @builtins.property
    def target_sent_bytes_per_second(self) -> typing.Optional[jsii.Number]:
        """Target bytes sent per second."""
        return self._values.get('target_sent_bytes_per_second')

    @builtins.property
    def target_sent_packets_per_second(self) -> typing.Optional[jsii.Number]:
        """Target packets sent per second."""
        return self._values.get('target_sent_packets_per_second')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionAutomaticScalingNetworkUtilization(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionAutomaticScalingRequestUtilization", jsii_struct_bases=[], name_mapping={'target_concurrent_requests': 'targetConcurrentRequests', 'target_request_count_per_second': 'targetRequestCountPerSecond'})
class AppEngineFlexibleAppVersionAutomaticScalingRequestUtilization():
    def __init__(self, *, target_concurrent_requests: typing.Optional[jsii.Number]=None, target_request_count_per_second: typing.Optional[str]=None) -> None:
        """
        :param target_concurrent_requests: Target number of concurrent requests.
        :param target_request_count_per_second: Target requests per second.
        """
        self._values = {
        }
        if target_concurrent_requests is not None: self._values["target_concurrent_requests"] = target_concurrent_requests
        if target_request_count_per_second is not None: self._values["target_request_count_per_second"] = target_request_count_per_second

    @builtins.property
    def target_concurrent_requests(self) -> typing.Optional[jsii.Number]:
        """Target number of concurrent requests."""
        return self._values.get('target_concurrent_requests')

    @builtins.property
    def target_request_count_per_second(self) -> typing.Optional[str]:
        """Target requests per second."""
        return self._values.get('target_request_count_per_second')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionAutomaticScalingRequestUtilization(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'liveness_check': 'livenessCheck', 'readiness_check': 'readinessCheck', 'runtime': 'runtime', 'service': 'service', 'api_config': 'apiConfig', 'automatic_scaling': 'automaticScaling', 'beta_settings': 'betaSettings', 'default_expiration': 'defaultExpiration', 'delete_service_on_destroy': 'deleteServiceOnDestroy', 'deployment': 'deployment', 'endpoints_api_service': 'endpointsApiService', 'entrypoint': 'entrypoint', 'env_variables': 'envVariables', 'handlers': 'handlers', 'inbound_services': 'inboundServices', 'instance_class': 'instanceClass', 'manual_scaling': 'manualScaling', 'network': 'network', 'nobuild_files_regex': 'nobuildFilesRegex', 'noop_on_destroy': 'noopOnDestroy', 'project': 'project', 'resources': 'resources', 'runtime_api_version': 'runtimeApiVersion', 'runtime_channel': 'runtimeChannel', 'runtime_main_executable_path': 'runtimeMainExecutablePath', 'serving_status': 'servingStatus', 'timeouts': 'timeouts', 'version_id': 'versionId', 'vpc_access_connector': 'vpcAccessConnector'})
class AppEngineFlexibleAppVersionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, liveness_check: typing.List["AppEngineFlexibleAppVersionLivenessCheck"], readiness_check: typing.List["AppEngineFlexibleAppVersionReadinessCheck"], runtime: str, service: str, api_config: typing.Optional[typing.List["AppEngineFlexibleAppVersionApiConfig"]]=None, automatic_scaling: typing.Optional[typing.List["AppEngineFlexibleAppVersionAutomaticScaling"]]=None, beta_settings: typing.Optional[typing.Mapping[str, str]]=None, default_expiration: typing.Optional[str]=None, delete_service_on_destroy: typing.Optional[bool]=None, deployment: typing.Optional[typing.List["AppEngineFlexibleAppVersionDeployment"]]=None, endpoints_api_service: typing.Optional[typing.List["AppEngineFlexibleAppVersionEndpointsApiService"]]=None, entrypoint: typing.Optional[typing.List["AppEngineFlexibleAppVersionEntrypoint"]]=None, env_variables: typing.Optional[typing.Mapping[str, str]]=None, handlers: typing.Optional[typing.List["AppEngineFlexibleAppVersionHandlers"]]=None, inbound_services: typing.Optional[typing.List[str]]=None, instance_class: typing.Optional[str]=None, manual_scaling: typing.Optional[typing.List["AppEngineFlexibleAppVersionManualScaling"]]=None, network: typing.Optional[typing.List["AppEngineFlexibleAppVersionNetwork"]]=None, nobuild_files_regex: typing.Optional[str]=None, noop_on_destroy: typing.Optional[bool]=None, project: typing.Optional[str]=None, resources: typing.Optional[typing.List["AppEngineFlexibleAppVersionResources"]]=None, runtime_api_version: typing.Optional[str]=None, runtime_channel: typing.Optional[str]=None, runtime_main_executable_path: typing.Optional[str]=None, serving_status: typing.Optional[str]=None, timeouts: typing.Optional["AppEngineFlexibleAppVersionTimeouts"]=None, version_id: typing.Optional[str]=None, vpc_access_connector: typing.Optional[typing.List["AppEngineFlexibleAppVersionVpcAccessConnector"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param liveness_check: liveness_check block.
        :param readiness_check: readiness_check block.
        :param runtime: Desired runtime. Example python27.
        :param service: AppEngine service resource.
        :param api_config: api_config block.
        :param automatic_scaling: automatic_scaling block.
        :param beta_settings: Metadata settings that are supplied to this version to enable beta runtime features.
        :param default_expiration: Duration that static files should be cached by web proxies and browsers. Only applicable if the corresponding StaticFilesHandler does not specify its own expiration time.
        :param delete_service_on_destroy: 
        :param deployment: deployment block.
        :param endpoints_api_service: endpoints_api_service block.
        :param entrypoint: entrypoint block.
        :param env_variables: Environment variables available to the application. As these are not returned in the API request, Terraform will not detect any changes made outside of the Terraform config.
        :param handlers: handlers block.
        :param inbound_services: A list of the types of messages that this application is able to receive. Possible values: ["INBOUND_SERVICE_MAIL", "INBOUND_SERVICE_MAIL_BOUNCE", "INBOUND_SERVICE_XMPP_ERROR", "INBOUND_SERVICE_XMPP_MESSAGE", "INBOUND_SERVICE_XMPP_SUBSCRIBE", "INBOUND_SERVICE_XMPP_PRESENCE", "INBOUND_SERVICE_CHANNEL_PRESENCE", "INBOUND_SERVICE_WARMUP"]
        :param instance_class: Instance class that is used to run this version. Valid values are AutomaticScaling: F1, F2, F4, F4_1G ManualScaling: B1, B2, B4, B8, B4_1G Defaults to F1 for AutomaticScaling and B1 for ManualScaling.
        :param manual_scaling: manual_scaling block.
        :param network: network block.
        :param nobuild_files_regex: Files that match this pattern will not be built into this version. Only applicable for Go runtimes.
        :param noop_on_destroy: 
        :param project: 
        :param resources: resources block.
        :param runtime_api_version: The version of the API in the given runtime environment. Please see the app.yaml reference for valid values at https://cloud.google.com/appengine/docs/standard//config/appref
        :param runtime_channel: The channel of the runtime to use. Only available for some runtimes.
        :param runtime_main_executable_path: The path or name of the app's main executable.
        :param serving_status: Current serving status of this version. Only the versions with a SERVING status create instances and can be billed. Default value: "SERVING" Possible values: ["SERVING", "STOPPED"]
        :param timeouts: timeouts block.
        :param version_id: Relative name of the version within the service. For example, 'v1'. Version names can contain only lowercase letters, numbers, or hyphens. Reserved names,"default", "latest", and any name with the prefix "ah-".
        :param vpc_access_connector: vpc_access_connector block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = AppEngineFlexibleAppVersionTimeouts(**timeouts)
        self._values = {
            'liveness_check': liveness_check,
            'readiness_check': readiness_check,
            'runtime': runtime,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if api_config is not None: self._values["api_config"] = api_config
        if automatic_scaling is not None: self._values["automatic_scaling"] = automatic_scaling
        if beta_settings is not None: self._values["beta_settings"] = beta_settings
        if default_expiration is not None: self._values["default_expiration"] = default_expiration
        if delete_service_on_destroy is not None: self._values["delete_service_on_destroy"] = delete_service_on_destroy
        if deployment is not None: self._values["deployment"] = deployment
        if endpoints_api_service is not None: self._values["endpoints_api_service"] = endpoints_api_service
        if entrypoint is not None: self._values["entrypoint"] = entrypoint
        if env_variables is not None: self._values["env_variables"] = env_variables
        if handlers is not None: self._values["handlers"] = handlers
        if inbound_services is not None: self._values["inbound_services"] = inbound_services
        if instance_class is not None: self._values["instance_class"] = instance_class
        if manual_scaling is not None: self._values["manual_scaling"] = manual_scaling
        if network is not None: self._values["network"] = network
        if nobuild_files_regex is not None: self._values["nobuild_files_regex"] = nobuild_files_regex
        if noop_on_destroy is not None: self._values["noop_on_destroy"] = noop_on_destroy
        if project is not None: self._values["project"] = project
        if resources is not None: self._values["resources"] = resources
        if runtime_api_version is not None: self._values["runtime_api_version"] = runtime_api_version
        if runtime_channel is not None: self._values["runtime_channel"] = runtime_channel
        if runtime_main_executable_path is not None: self._values["runtime_main_executable_path"] = runtime_main_executable_path
        if serving_status is not None: self._values["serving_status"] = serving_status
        if timeouts is not None: self._values["timeouts"] = timeouts
        if version_id is not None: self._values["version_id"] = version_id
        if vpc_access_connector is not None: self._values["vpc_access_connector"] = vpc_access_connector

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def liveness_check(self) -> typing.List["AppEngineFlexibleAppVersionLivenessCheck"]:
        """liveness_check block."""
        return self._values.get('liveness_check')

    @builtins.property
    def readiness_check(self) -> typing.List["AppEngineFlexibleAppVersionReadinessCheck"]:
        """readiness_check block."""
        return self._values.get('readiness_check')

    @builtins.property
    def runtime(self) -> str:
        """Desired runtime.

        Example python27.
        """
        return self._values.get('runtime')

    @builtins.property
    def service(self) -> str:
        """AppEngine service resource."""
        return self._values.get('service')

    @builtins.property
    def api_config(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionApiConfig"]]:
        """api_config block."""
        return self._values.get('api_config')

    @builtins.property
    def automatic_scaling(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionAutomaticScaling"]]:
        """automatic_scaling block."""
        return self._values.get('automatic_scaling')

    @builtins.property
    def beta_settings(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Metadata settings that are supplied to this version to enable beta runtime features."""
        return self._values.get('beta_settings')

    @builtins.property
    def default_expiration(self) -> typing.Optional[str]:
        """Duration that static files should be cached by web proxies and browsers.

        Only applicable if the corresponding StaticFilesHandler does not specify its own expiration time.
        """
        return self._values.get('default_expiration')

    @builtins.property
    def delete_service_on_destroy(self) -> typing.Optional[bool]:
        return self._values.get('delete_service_on_destroy')

    @builtins.property
    def deployment(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionDeployment"]]:
        """deployment block."""
        return self._values.get('deployment')

    @builtins.property
    def endpoints_api_service(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionEndpointsApiService"]]:
        """endpoints_api_service block."""
        return self._values.get('endpoints_api_service')

    @builtins.property
    def entrypoint(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionEntrypoint"]]:
        """entrypoint block."""
        return self._values.get('entrypoint')

    @builtins.property
    def env_variables(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Environment variables available to the application.

        As these are not returned in the API request, Terraform will not detect any changes made outside of the Terraform config.
        """
        return self._values.get('env_variables')

    @builtins.property
    def handlers(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionHandlers"]]:
        """handlers block."""
        return self._values.get('handlers')

    @builtins.property
    def inbound_services(self) -> typing.Optional[typing.List[str]]:
        """A list of the types of messages that this application is able to receive.

        Possible values: ["INBOUND_SERVICE_MAIL", "INBOUND_SERVICE_MAIL_BOUNCE", "INBOUND_SERVICE_XMPP_ERROR", "INBOUND_SERVICE_XMPP_MESSAGE", "INBOUND_SERVICE_XMPP_SUBSCRIBE", "INBOUND_SERVICE_XMPP_PRESENCE", "INBOUND_SERVICE_CHANNEL_PRESENCE", "INBOUND_SERVICE_WARMUP"]
        """
        return self._values.get('inbound_services')

    @builtins.property
    def instance_class(self) -> typing.Optional[str]:
        """Instance class that is used to run this version.

        Valid values are
        AutomaticScaling: F1, F2, F4, F4_1G
        ManualScaling: B1, B2, B4, B8, B4_1G
        Defaults to F1 for AutomaticScaling and B1 for ManualScaling.
        """
        return self._values.get('instance_class')

    @builtins.property
    def manual_scaling(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionManualScaling"]]:
        """manual_scaling block."""
        return self._values.get('manual_scaling')

    @builtins.property
    def network(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionNetwork"]]:
        """network block."""
        return self._values.get('network')

    @builtins.property
    def nobuild_files_regex(self) -> typing.Optional[str]:
        """Files that match this pattern will not be built into this version.

        Only applicable for Go runtimes.
        """
        return self._values.get('nobuild_files_regex')

    @builtins.property
    def noop_on_destroy(self) -> typing.Optional[bool]:
        return self._values.get('noop_on_destroy')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def resources(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionResources"]]:
        """resources block."""
        return self._values.get('resources')

    @builtins.property
    def runtime_api_version(self) -> typing.Optional[str]:
        """The version of the API in the given runtime environment.

        Please see the app.yaml reference for valid values at https://cloud.google.com/appengine/docs/standard//config/appref
        """
        return self._values.get('runtime_api_version')

    @builtins.property
    def runtime_channel(self) -> typing.Optional[str]:
        """The channel of the runtime to use.

        Only available for some runtimes.
        """
        return self._values.get('runtime_channel')

    @builtins.property
    def runtime_main_executable_path(self) -> typing.Optional[str]:
        """The path or name of the app's main executable."""
        return self._values.get('runtime_main_executable_path')

    @builtins.property
    def serving_status(self) -> typing.Optional[str]:
        """Current serving status of this version.

        Only the versions with a SERVING status create instances and can be billed. Default value: "SERVING" Possible values: ["SERVING", "STOPPED"]
        """
        return self._values.get('serving_status')

    @builtins.property
    def timeouts(self) -> typing.Optional["AppEngineFlexibleAppVersionTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def version_id(self) -> typing.Optional[str]:
        """Relative name of the version within the service.

        For example, 'v1'. Version names can contain only lowercase letters, numbers, or hyphens.
        Reserved names,"default", "latest", and any name with the prefix "ah-".
        """
        return self._values.get('version_id')

    @builtins.property
    def vpc_access_connector(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionVpcAccessConnector"]]:
        """vpc_access_connector block."""
        return self._values.get('vpc_access_connector')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionDeployment", jsii_struct_bases=[], name_mapping={'cloud_build_options': 'cloudBuildOptions', 'container': 'container', 'files': 'files', 'zip': 'zip'})
class AppEngineFlexibleAppVersionDeployment():
    def __init__(self, *, cloud_build_options: typing.Optional[typing.List["AppEngineFlexibleAppVersionDeploymentCloudBuildOptions"]]=None, container: typing.Optional[typing.List["AppEngineFlexibleAppVersionDeploymentContainer"]]=None, files: typing.Optional[typing.List["AppEngineFlexibleAppVersionDeploymentFiles"]]=None, zip: typing.Optional[typing.List["AppEngineFlexibleAppVersionDeploymentZip"]]=None) -> None:
        """
        :param cloud_build_options: cloud_build_options block.
        :param container: container block.
        :param files: files block.
        :param zip: zip block.
        """
        self._values = {
        }
        if cloud_build_options is not None: self._values["cloud_build_options"] = cloud_build_options
        if container is not None: self._values["container"] = container
        if files is not None: self._values["files"] = files
        if zip is not None: self._values["zip"] = zip

    @builtins.property
    def cloud_build_options(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionDeploymentCloudBuildOptions"]]:
        """cloud_build_options block."""
        return self._values.get('cloud_build_options')

    @builtins.property
    def container(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionDeploymentContainer"]]:
        """container block."""
        return self._values.get('container')

    @builtins.property
    def files(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionDeploymentFiles"]]:
        """files block."""
        return self._values.get('files')

    @builtins.property
    def zip(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionDeploymentZip"]]:
        """zip block."""
        return self._values.get('zip')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionDeployment(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionDeploymentCloudBuildOptions", jsii_struct_bases=[], name_mapping={'app_yaml_path': 'appYamlPath', 'cloud_build_timeout': 'cloudBuildTimeout'})
class AppEngineFlexibleAppVersionDeploymentCloudBuildOptions():
    def __init__(self, *, app_yaml_path: str, cloud_build_timeout: typing.Optional[str]=None) -> None:
        """
        :param app_yaml_path: Path to the yaml file used in deployment, used to determine runtime configuration details.
        :param cloud_build_timeout: The Cloud Build timeout used as part of any dependent builds performed by version creation. Defaults to 10 minutes. A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s".
        """
        self._values = {
            'app_yaml_path': app_yaml_path,
        }
        if cloud_build_timeout is not None: self._values["cloud_build_timeout"] = cloud_build_timeout

    @builtins.property
    def app_yaml_path(self) -> str:
        """Path to the yaml file used in deployment, used to determine runtime configuration details."""
        return self._values.get('app_yaml_path')

    @builtins.property
    def cloud_build_timeout(self) -> typing.Optional[str]:
        """The Cloud Build timeout used as part of any dependent builds performed by version creation. Defaults to 10 minutes.

        A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s".
        """
        return self._values.get('cloud_build_timeout')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionDeploymentCloudBuildOptions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionDeploymentContainer", jsii_struct_bases=[], name_mapping={'image': 'image'})
class AppEngineFlexibleAppVersionDeploymentContainer():
    def __init__(self, *, image: str) -> None:
        """
        :param image: URI to the hosted container image in Google Container Registry. The URI must be fully qualified and include a tag or digest. Examples: "gcr.io/my-project/image:tag" or "gcr.io/my-project/image@digest"
        """
        self._values = {
            'image': image,
        }

    @builtins.property
    def image(self) -> str:
        """URI to the hosted container image in Google Container Registry.

        The URI must be fully qualified and include a tag or digest.
        Examples: "gcr.io/my-project/image:tag" or "gcr.io/my-project/image@digest"
        """
        return self._values.get('image')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionDeploymentContainer(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionDeploymentFiles", jsii_struct_bases=[], name_mapping={'name': 'name', 'source_url': 'sourceUrl', 'sha1_sum': 'sha1Sum'})
class AppEngineFlexibleAppVersionDeploymentFiles():
    def __init__(self, *, name: str, source_url: str, sha1_sum: typing.Optional[str]=None) -> None:
        """
        :param name: 
        :param source_url: Source URL.
        :param sha1_sum: SHA1 checksum of the file.
        """
        self._values = {
            'name': name,
            'source_url': source_url,
        }
        if sha1_sum is not None: self._values["sha1_sum"] = sha1_sum

    @builtins.property
    def name(self) -> str:
        return self._values.get('name')

    @builtins.property
    def source_url(self) -> str:
        """Source URL."""
        return self._values.get('source_url')

    @builtins.property
    def sha1_sum(self) -> typing.Optional[str]:
        """SHA1 checksum of the file."""
        return self._values.get('sha1_sum')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionDeploymentFiles(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionDeploymentZip", jsii_struct_bases=[], name_mapping={'source_url': 'sourceUrl', 'files_count': 'filesCount'})
class AppEngineFlexibleAppVersionDeploymentZip():
    def __init__(self, *, source_url: str, files_count: typing.Optional[jsii.Number]=None) -> None:
        """
        :param source_url: Source URL.
        :param files_count: files count.
        """
        self._values = {
            'source_url': source_url,
        }
        if files_count is not None: self._values["files_count"] = files_count

    @builtins.property
    def source_url(self) -> str:
        """Source URL."""
        return self._values.get('source_url')

    @builtins.property
    def files_count(self) -> typing.Optional[jsii.Number]:
        """files count."""
        return self._values.get('files_count')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionDeploymentZip(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionEndpointsApiService", jsii_struct_bases=[], name_mapping={'name': 'name', 'config_id': 'configId', 'disable_trace_sampling': 'disableTraceSampling', 'rollout_strategy': 'rolloutStrategy'})
class AppEngineFlexibleAppVersionEndpointsApiService():
    def __init__(self, *, name: str, config_id: typing.Optional[str]=None, disable_trace_sampling: typing.Optional[bool]=None, rollout_strategy: typing.Optional[str]=None) -> None:
        """
        :param name: Endpoints service name which is the name of the "service" resource in the Service Management API. For example "myapi.endpoints.myproject.cloud.goog"
        :param config_id: Endpoints service configuration ID as specified by the Service Management API. For example "2016-09-19r1". By default, the rollout strategy for Endpoints is "FIXED". This means that Endpoints starts up with a particular configuration ID. When a new configuration is rolled out, Endpoints must be given the new configuration ID. The configId field is used to give the configuration ID and is required in this case. Endpoints also has a rollout strategy called "MANAGED". When using this, Endpoints fetches the latest configuration and does not need the configuration ID. In this case, configId must be omitted.
        :param disable_trace_sampling: Enable or disable trace sampling. By default, this is set to false for enabled.
        :param rollout_strategy: Endpoints rollout strategy. If FIXED, configId must be specified. If MANAGED, configId must be omitted. Default value: "FIXED" Possible values: ["FIXED", "MANAGED"]
        """
        self._values = {
            'name': name,
        }
        if config_id is not None: self._values["config_id"] = config_id
        if disable_trace_sampling is not None: self._values["disable_trace_sampling"] = disable_trace_sampling
        if rollout_strategy is not None: self._values["rollout_strategy"] = rollout_strategy

    @builtins.property
    def name(self) -> str:
        """Endpoints service name which is the name of the "service" resource in the Service Management API.

        For example "myapi.endpoints.myproject.cloud.goog"
        """
        return self._values.get('name')

    @builtins.property
    def config_id(self) -> typing.Optional[str]:
        """Endpoints service configuration ID as specified by the Service Management API. For example "2016-09-19r1".

        By default, the rollout strategy for Endpoints is "FIXED". This means that Endpoints starts up with a particular configuration ID.
        When a new configuration is rolled out, Endpoints must be given the new configuration ID. The configId field is used to give the configuration ID
        and is required in this case.

        Endpoints also has a rollout strategy called "MANAGED". When using this, Endpoints fetches the latest configuration and does not need
        the configuration ID. In this case, configId must be omitted.
        """
        return self._values.get('config_id')

    @builtins.property
    def disable_trace_sampling(self) -> typing.Optional[bool]:
        """Enable or disable trace sampling.

        By default, this is set to false for enabled.
        """
        return self._values.get('disable_trace_sampling')

    @builtins.property
    def rollout_strategy(self) -> typing.Optional[str]:
        """Endpoints rollout strategy.

        If FIXED, configId must be specified. If MANAGED, configId must be omitted. Default value: "FIXED" Possible values: ["FIXED", "MANAGED"]
        """
        return self._values.get('rollout_strategy')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionEndpointsApiService(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionEntrypoint", jsii_struct_bases=[], name_mapping={'shell': 'shell'})
class AppEngineFlexibleAppVersionEntrypoint():
    def __init__(self, *, shell: str) -> None:
        """
        :param shell: The format should be a shell command that can be fed to bash -c.
        """
        self._values = {
            'shell': shell,
        }

    @builtins.property
    def shell(self) -> str:
        """The format should be a shell command that can be fed to bash -c."""
        return self._values.get('shell')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionEntrypoint(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionHandlers", jsii_struct_bases=[], name_mapping={'auth_fail_action': 'authFailAction', 'login': 'login', 'redirect_http_response_code': 'redirectHttpResponseCode', 'script': 'script', 'security_level': 'securityLevel', 'static_files': 'staticFiles', 'url_regex': 'urlRegex'})
class AppEngineFlexibleAppVersionHandlers():
    def __init__(self, *, auth_fail_action: typing.Optional[str]=None, login: typing.Optional[str]=None, redirect_http_response_code: typing.Optional[str]=None, script: typing.Optional[typing.List["AppEngineFlexibleAppVersionHandlersScript"]]=None, security_level: typing.Optional[str]=None, static_files: typing.Optional[typing.List["AppEngineFlexibleAppVersionHandlersStaticFiles"]]=None, url_regex: typing.Optional[str]=None) -> None:
        """
        :param auth_fail_action: Actions to take when the user is not logged in. Possible values: ["AUTH_FAIL_ACTION_REDIRECT", "AUTH_FAIL_ACTION_UNAUTHORIZED"]
        :param login: Methods to restrict access to a URL based on login status. Possible values: ["LOGIN_OPTIONAL", "LOGIN_ADMIN", "LOGIN_REQUIRED"]
        :param redirect_http_response_code: 30x code to use when performing redirects for the secure field. Possible values: ["REDIRECT_HTTP_RESPONSE_CODE_301", "REDIRECT_HTTP_RESPONSE_CODE_302", "REDIRECT_HTTP_RESPONSE_CODE_303", "REDIRECT_HTTP_RESPONSE_CODE_307"]
        :param script: script block.
        :param security_level: Security (HTTPS) enforcement for this URL. Possible values: ["SECURE_DEFAULT", "SECURE_NEVER", "SECURE_OPTIONAL", "SECURE_ALWAYS"]
        :param static_files: static_files block.
        :param url_regex: URL prefix. Uses regular expression syntax, which means regexp special characters must be escaped, but should not contain groupings. All URLs that begin with this prefix are handled by this handler, using the portion of the URL after the prefix as part of the file path.
        """
        self._values = {
        }
        if auth_fail_action is not None: self._values["auth_fail_action"] = auth_fail_action
        if login is not None: self._values["login"] = login
        if redirect_http_response_code is not None: self._values["redirect_http_response_code"] = redirect_http_response_code
        if script is not None: self._values["script"] = script
        if security_level is not None: self._values["security_level"] = security_level
        if static_files is not None: self._values["static_files"] = static_files
        if url_regex is not None: self._values["url_regex"] = url_regex

    @builtins.property
    def auth_fail_action(self) -> typing.Optional[str]:
        """Actions to take when the user is not logged in.

        Possible values: ["AUTH_FAIL_ACTION_REDIRECT", "AUTH_FAIL_ACTION_UNAUTHORIZED"]
        """
        return self._values.get('auth_fail_action')

    @builtins.property
    def login(self) -> typing.Optional[str]:
        """Methods to restrict access to a URL based on login status.

        Possible values: ["LOGIN_OPTIONAL", "LOGIN_ADMIN", "LOGIN_REQUIRED"]
        """
        return self._values.get('login')

    @builtins.property
    def redirect_http_response_code(self) -> typing.Optional[str]:
        """30x code to use when performing redirects for the secure field.

        Possible values: ["REDIRECT_HTTP_RESPONSE_CODE_301", "REDIRECT_HTTP_RESPONSE_CODE_302", "REDIRECT_HTTP_RESPONSE_CODE_303", "REDIRECT_HTTP_RESPONSE_CODE_307"]
        """
        return self._values.get('redirect_http_response_code')

    @builtins.property
    def script(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionHandlersScript"]]:
        """script block."""
        return self._values.get('script')

    @builtins.property
    def security_level(self) -> typing.Optional[str]:
        """Security (HTTPS) enforcement for this URL.

        Possible values: ["SECURE_DEFAULT", "SECURE_NEVER", "SECURE_OPTIONAL", "SECURE_ALWAYS"]
        """
        return self._values.get('security_level')

    @builtins.property
    def static_files(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionHandlersStaticFiles"]]:
        """static_files block."""
        return self._values.get('static_files')

    @builtins.property
    def url_regex(self) -> typing.Optional[str]:
        """URL prefix.

        Uses regular expression syntax, which means regexp special characters must be escaped, but should not contain groupings.
        All URLs that begin with this prefix are handled by this handler, using the portion of the URL after the prefix as part of the file path.
        """
        return self._values.get('url_regex')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionHandlers(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionHandlersScript", jsii_struct_bases=[], name_mapping={'script_path': 'scriptPath'})
class AppEngineFlexibleAppVersionHandlersScript():
    def __init__(self, *, script_path: str) -> None:
        """
        :param script_path: Path to the script from the application root directory.
        """
        self._values = {
            'script_path': script_path,
        }

    @builtins.property
    def script_path(self) -> str:
        """Path to the script from the application root directory."""
        return self._values.get('script_path')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionHandlersScript(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionHandlersStaticFiles", jsii_struct_bases=[], name_mapping={'application_readable': 'applicationReadable', 'expiration': 'expiration', 'http_headers': 'httpHeaders', 'mime_type': 'mimeType', 'path': 'path', 'require_matching_file': 'requireMatchingFile', 'upload_path_regex': 'uploadPathRegex'})
class AppEngineFlexibleAppVersionHandlersStaticFiles():
    def __init__(self, *, application_readable: typing.Optional[bool]=None, expiration: typing.Optional[str]=None, http_headers: typing.Optional[typing.Mapping[str, str]]=None, mime_type: typing.Optional[str]=None, path: typing.Optional[str]=None, require_matching_file: typing.Optional[bool]=None, upload_path_regex: typing.Optional[str]=None) -> None:
        """
        :param application_readable: Whether files should also be uploaded as code data. By default, files declared in static file handlers are uploaded as static data and are only served to end users; they cannot be read by the application. If enabled, uploads are charged against both your code and static data storage resource quotas.
        :param expiration: Time a static file served by this handler should be cached by web proxies and browsers. A duration in seconds with up to nine fractional digits, terminated by 's'. Example "3.5s". Default is '0s'
        :param http_headers: HTTP headers to use for all responses from these URLs. An object containing a list of "key:value" value pairs.".
        :param mime_type: MIME type used to serve all files served by this handler. Defaults to file-specific MIME types, which are derived from each file's filename extension.
        :param path: Path to the static files matched by the URL pattern, from the application root directory. The path can refer to text matched in groupings in the URL pattern.
        :param require_matching_file: Whether this handler should match the request if the file referenced by the handler does not exist.
        :param upload_path_regex: Regular expression that matches the file paths for all files that should be referenced by this handler.
        """
        self._values = {
        }
        if application_readable is not None: self._values["application_readable"] = application_readable
        if expiration is not None: self._values["expiration"] = expiration
        if http_headers is not None: self._values["http_headers"] = http_headers
        if mime_type is not None: self._values["mime_type"] = mime_type
        if path is not None: self._values["path"] = path
        if require_matching_file is not None: self._values["require_matching_file"] = require_matching_file
        if upload_path_regex is not None: self._values["upload_path_regex"] = upload_path_regex

    @builtins.property
    def application_readable(self) -> typing.Optional[bool]:
        """Whether files should also be uploaded as code data.

        By default, files declared in static file handlers are
        uploaded as static data and are only served to end users; they cannot be read by the application. If enabled,
        uploads are charged against both your code and static data storage resource quotas.
        """
        return self._values.get('application_readable')

    @builtins.property
    def expiration(self) -> typing.Optional[str]:
        """Time a static file served by this handler should be cached by web proxies and browsers.

        A duration in seconds with up to nine fractional digits, terminated by 's'. Example "3.5s".
        Default is '0s'
        """
        return self._values.get('expiration')

    @builtins.property
    def http_headers(self) -> typing.Optional[typing.Mapping[str, str]]:
        """HTTP headers to use for all responses from these URLs.

        An object containing a list of "key:value" value pairs.".
        """
        return self._values.get('http_headers')

    @builtins.property
    def mime_type(self) -> typing.Optional[str]:
        """MIME type used to serve all files served by this handler.

        Defaults to file-specific MIME types, which are derived from each file's filename extension.
        """
        return self._values.get('mime_type')

    @builtins.property
    def path(self) -> typing.Optional[str]:
        """Path to the static files matched by the URL pattern, from the application root directory.

        The path can refer to text matched in groupings in the URL pattern.
        """
        return self._values.get('path')

    @builtins.property
    def require_matching_file(self) -> typing.Optional[bool]:
        """Whether this handler should match the request if the file referenced by the handler does not exist."""
        return self._values.get('require_matching_file')

    @builtins.property
    def upload_path_regex(self) -> typing.Optional[str]:
        """Regular expression that matches the file paths for all files that should be referenced by this handler."""
        return self._values.get('upload_path_regex')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionHandlersStaticFiles(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionLivenessCheck", jsii_struct_bases=[], name_mapping={'path': 'path', 'check_interval': 'checkInterval', 'failure_threshold': 'failureThreshold', 'host': 'host', 'initial_delay': 'initialDelay', 'success_threshold': 'successThreshold', 'timeout': 'timeout'})
class AppEngineFlexibleAppVersionLivenessCheck():
    def __init__(self, *, path: str, check_interval: typing.Optional[str]=None, failure_threshold: typing.Optional[jsii.Number]=None, host: typing.Optional[str]=None, initial_delay: typing.Optional[str]=None, success_threshold: typing.Optional[jsii.Number]=None, timeout: typing.Optional[str]=None) -> None:
        """
        :param path: The request path.
        :param check_interval: Interval between health checks.
        :param failure_threshold: Number of consecutive failed checks required before considering the VM unhealthy. Default: 4.
        :param host: Host header to send when performing a HTTP Readiness check. Example: "myapp.appspot.com"
        :param initial_delay: The initial delay before starting to execute the checks. Default: "300s"
        :param success_threshold: Number of consecutive successful checks required before considering the VM healthy. Default: 2.
        :param timeout: Time before the check is considered failed. Default: "4s"
        """
        self._values = {
            'path': path,
        }
        if check_interval is not None: self._values["check_interval"] = check_interval
        if failure_threshold is not None: self._values["failure_threshold"] = failure_threshold
        if host is not None: self._values["host"] = host
        if initial_delay is not None: self._values["initial_delay"] = initial_delay
        if success_threshold is not None: self._values["success_threshold"] = success_threshold
        if timeout is not None: self._values["timeout"] = timeout

    @builtins.property
    def path(self) -> str:
        """The request path."""
        return self._values.get('path')

    @builtins.property
    def check_interval(self) -> typing.Optional[str]:
        """Interval between health checks."""
        return self._values.get('check_interval')

    @builtins.property
    def failure_threshold(self) -> typing.Optional[jsii.Number]:
        """Number of consecutive failed checks required before considering the VM unhealthy.

        Default: 4.
        """
        return self._values.get('failure_threshold')

    @builtins.property
    def host(self) -> typing.Optional[str]:
        """Host header to send when performing a HTTP Readiness check.

        Example: "myapp.appspot.com"
        """
        return self._values.get('host')

    @builtins.property
    def initial_delay(self) -> typing.Optional[str]:
        """The initial delay before starting to execute the checks.

        Default: "300s"
        """
        return self._values.get('initial_delay')

    @builtins.property
    def success_threshold(self) -> typing.Optional[jsii.Number]:
        """Number of consecutive successful checks required before considering the VM healthy.

        Default: 2.
        """
        return self._values.get('success_threshold')

    @builtins.property
    def timeout(self) -> typing.Optional[str]:
        """Time before the check is considered failed.

        Default: "4s"
        """
        return self._values.get('timeout')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionLivenessCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionManualScaling", jsii_struct_bases=[], name_mapping={'instances': 'instances'})
class AppEngineFlexibleAppVersionManualScaling():
    def __init__(self, *, instances: jsii.Number) -> None:
        """
        :param instances: Number of instances to assign to the service at the start. *Note:** When managing the number of instances at runtime through the App Engine Admin API or the (now deprecated) Python 2 Modules API set_num_instances() you must use 'lifecycle.ignore_changes = ["manual_scaling"[0].instances]' to prevent drift detection.
        """
        self._values = {
            'instances': instances,
        }

    @builtins.property
    def instances(self) -> jsii.Number:
        """Number of instances to assign to the service at the start.

        *Note:** When managing the number of instances at runtime through the App Engine Admin API or the (now deprecated) Python 2
        Modules API set_num_instances() you must use 'lifecycle.ignore_changes = ["manual_scaling"[0].instances]' to prevent drift detection.
        """
        return self._values.get('instances')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionManualScaling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionNetwork", jsii_struct_bases=[], name_mapping={'name': 'name', 'forwarded_ports': 'forwardedPorts', 'instance_tag': 'instanceTag', 'session_affinity': 'sessionAffinity', 'subnetwork': 'subnetwork'})
class AppEngineFlexibleAppVersionNetwork():
    def __init__(self, *, name: str, forwarded_ports: typing.Optional[typing.List[str]]=None, instance_tag: typing.Optional[str]=None, session_affinity: typing.Optional[bool]=None, subnetwork: typing.Optional[str]=None) -> None:
        """
        :param name: Google Compute Engine network where the virtual machines are created. Specify the short name, not the resource path.
        :param forwarded_ports: List of ports, or port pairs, to forward from the virtual machine to the application container.
        :param instance_tag: Tag to apply to the instance during creation.
        :param session_affinity: Enable session affinity.
        :param subnetwork: Google Cloud Platform sub-network where the virtual machines are created. Specify the short name, not the resource path. If the network that the instance is being created in is a Legacy network, then the IP address is allocated from the IPv4Range. If the network that the instance is being created in is an auto Subnet Mode Network, then only network name should be specified (not the subnetworkName) and the IP address is created from the IPCidrRange of the subnetwork that exists in that zone for that network. If the network that the instance is being created in is a custom Subnet Mode Network, then the subnetworkName must be specified and the IP address is created from the IPCidrRange of the subnetwork. If specified, the subnetwork must exist in the same region as the App Engine flexible environment application.
        """
        self._values = {
            'name': name,
        }
        if forwarded_ports is not None: self._values["forwarded_ports"] = forwarded_ports
        if instance_tag is not None: self._values["instance_tag"] = instance_tag
        if session_affinity is not None: self._values["session_affinity"] = session_affinity
        if subnetwork is not None: self._values["subnetwork"] = subnetwork

    @builtins.property
    def name(self) -> str:
        """Google Compute Engine network where the virtual machines are created.

        Specify the short name, not the resource path.
        """
        return self._values.get('name')

    @builtins.property
    def forwarded_ports(self) -> typing.Optional[typing.List[str]]:
        """List of ports, or port pairs, to forward from the virtual machine to the application container."""
        return self._values.get('forwarded_ports')

    @builtins.property
    def instance_tag(self) -> typing.Optional[str]:
        """Tag to apply to the instance during creation."""
        return self._values.get('instance_tag')

    @builtins.property
    def session_affinity(self) -> typing.Optional[bool]:
        """Enable session affinity."""
        return self._values.get('session_affinity')

    @builtins.property
    def subnetwork(self) -> typing.Optional[str]:
        """Google Cloud Platform sub-network where the virtual machines are created. Specify the short name, not the resource path.

        If the network that the instance is being created in is a Legacy network, then the IP address is allocated from the IPv4Range.
        If the network that the instance is being created in is an auto Subnet Mode Network, then only network name should be specified (not the subnetworkName) and the IP address is created from the IPCidrRange of the subnetwork that exists in that zone for that network.
        If the network that the instance is being created in is a custom Subnet Mode Network, then the subnetworkName must be specified and the IP address is created from the IPCidrRange of the subnetwork.
        If specified, the subnetwork must exist in the same region as the App Engine flexible environment application.
        """
        return self._values.get('subnetwork')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionNetwork(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionReadinessCheck", jsii_struct_bases=[], name_mapping={'path': 'path', 'app_start_timeout': 'appStartTimeout', 'check_interval': 'checkInterval', 'failure_threshold': 'failureThreshold', 'host': 'host', 'success_threshold': 'successThreshold', 'timeout': 'timeout'})
class AppEngineFlexibleAppVersionReadinessCheck():
    def __init__(self, *, path: str, app_start_timeout: typing.Optional[str]=None, check_interval: typing.Optional[str]=None, failure_threshold: typing.Optional[jsii.Number]=None, host: typing.Optional[str]=None, success_threshold: typing.Optional[jsii.Number]=None, timeout: typing.Optional[str]=None) -> None:
        """
        :param path: The request path.
        :param app_start_timeout: A maximum time limit on application initialization, measured from moment the application successfully replies to a healthcheck until it is ready to serve traffic. Default: "300s"
        :param check_interval: Interval between health checks. Default: "5s".
        :param failure_threshold: Number of consecutive failed checks required before removing traffic. Default: 2.
        :param host: Host header to send when performing a HTTP Readiness check. Example: "myapp.appspot.com"
        :param success_threshold: Number of consecutive successful checks required before receiving traffic. Default: 2.
        :param timeout: Time before the check is considered failed. Default: "4s"
        """
        self._values = {
            'path': path,
        }
        if app_start_timeout is not None: self._values["app_start_timeout"] = app_start_timeout
        if check_interval is not None: self._values["check_interval"] = check_interval
        if failure_threshold is not None: self._values["failure_threshold"] = failure_threshold
        if host is not None: self._values["host"] = host
        if success_threshold is not None: self._values["success_threshold"] = success_threshold
        if timeout is not None: self._values["timeout"] = timeout

    @builtins.property
    def path(self) -> str:
        """The request path."""
        return self._values.get('path')

    @builtins.property
    def app_start_timeout(self) -> typing.Optional[str]:
        """A maximum time limit on application initialization, measured from moment the application successfully replies to a healthcheck until it is ready to serve traffic.

        Default: "300s"
        """
        return self._values.get('app_start_timeout')

    @builtins.property
    def check_interval(self) -> typing.Optional[str]:
        """Interval between health checks.

        Default: "5s".
        """
        return self._values.get('check_interval')

    @builtins.property
    def failure_threshold(self) -> typing.Optional[jsii.Number]:
        """Number of consecutive failed checks required before removing traffic.

        Default: 2.
        """
        return self._values.get('failure_threshold')

    @builtins.property
    def host(self) -> typing.Optional[str]:
        """Host header to send when performing a HTTP Readiness check.

        Example: "myapp.appspot.com"
        """
        return self._values.get('host')

    @builtins.property
    def success_threshold(self) -> typing.Optional[jsii.Number]:
        """Number of consecutive successful checks required before receiving traffic.

        Default: 2.
        """
        return self._values.get('success_threshold')

    @builtins.property
    def timeout(self) -> typing.Optional[str]:
        """Time before the check is considered failed.

        Default: "4s"
        """
        return self._values.get('timeout')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionReadinessCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionResources", jsii_struct_bases=[], name_mapping={'cpu': 'cpu', 'disk_gb': 'diskGb', 'memory_gb': 'memoryGb', 'volumes': 'volumes'})
class AppEngineFlexibleAppVersionResources():
    def __init__(self, *, cpu: typing.Optional[jsii.Number]=None, disk_gb: typing.Optional[jsii.Number]=None, memory_gb: typing.Optional[jsii.Number]=None, volumes: typing.Optional[typing.List["AppEngineFlexibleAppVersionResourcesVolumes"]]=None) -> None:
        """
        :param cpu: Number of CPU cores needed.
        :param disk_gb: Disk size (GB) needed.
        :param memory_gb: Memory (GB) needed.
        :param volumes: volumes block.
        """
        self._values = {
        }
        if cpu is not None: self._values["cpu"] = cpu
        if disk_gb is not None: self._values["disk_gb"] = disk_gb
        if memory_gb is not None: self._values["memory_gb"] = memory_gb
        if volumes is not None: self._values["volumes"] = volumes

    @builtins.property
    def cpu(self) -> typing.Optional[jsii.Number]:
        """Number of CPU cores needed."""
        return self._values.get('cpu')

    @builtins.property
    def disk_gb(self) -> typing.Optional[jsii.Number]:
        """Disk size (GB) needed."""
        return self._values.get('disk_gb')

    @builtins.property
    def memory_gb(self) -> typing.Optional[jsii.Number]:
        """Memory (GB) needed."""
        return self._values.get('memory_gb')

    @builtins.property
    def volumes(self) -> typing.Optional[typing.List["AppEngineFlexibleAppVersionResourcesVolumes"]]:
        """volumes block."""
        return self._values.get('volumes')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionResources(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionResourcesVolumes", jsii_struct_bases=[], name_mapping={'name': 'name', 'size_gb': 'sizeGb', 'volume_type': 'volumeType'})
class AppEngineFlexibleAppVersionResourcesVolumes():
    def __init__(self, *, name: str, size_gb: jsii.Number, volume_type: str) -> None:
        """
        :param name: Unique name for the volume.
        :param size_gb: Volume size in gigabytes.
        :param volume_type: Underlying volume type, e.g. 'tmpfs'.
        """
        self._values = {
            'name': name,
            'size_gb': size_gb,
            'volume_type': volume_type,
        }

    @builtins.property
    def name(self) -> str:
        """Unique name for the volume."""
        return self._values.get('name')

    @builtins.property
    def size_gb(self) -> jsii.Number:
        """Volume size in gigabytes."""
        return self._values.get('size_gb')

    @builtins.property
    def volume_type(self) -> str:
        """Underlying volume type, e.g. 'tmpfs'."""
        return self._values.get('volume_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionResourcesVolumes(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class AppEngineFlexibleAppVersionTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineFlexibleAppVersionVpcAccessConnector", jsii_struct_bases=[], name_mapping={'name': 'name'})
class AppEngineFlexibleAppVersionVpcAccessConnector():
    def __init__(self, *, name: str) -> None:
        """
        :param name: Full Serverless VPC Access Connector name e.g. /projects/my-project/locations/us-central1/connectors/c1.
        """
        self._values = {
            'name': name,
        }

    @builtins.property
    def name(self) -> str:
        """Full Serverless VPC Access Connector name e.g. /projects/my-project/locations/us-central1/connectors/c1."""
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineFlexibleAppVersionVpcAccessConnector(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class AppEngineServiceSplitTraffic(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AppEngineServiceSplitTraffic"):
    def __init__(self, scope: constructs.Construct, id: str, *, service: str, split: typing.List["AppEngineServiceSplitTrafficSplit"], migrate_traffic: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["AppEngineServiceSplitTrafficTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param service: The name of the service these settings apply to.
        :param split: split block.
        :param migrate_traffic: If set to true traffic will be migrated to this version.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppEngineServiceSplitTrafficConfig(service=service, split=split, migrate_traffic=migrate_traffic, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(AppEngineServiceSplitTraffic, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="split")
    def split(self) -> typing.List["AppEngineServiceSplitTrafficSplit"]:
        return jsii.get(self, "split")

    @split.setter
    def split(self, value: typing.List["AppEngineServiceSplitTrafficSplit"]) -> None:
        jsii.set(self, "split", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="migrateTraffic")
    def migrate_traffic(self) -> typing.Optional[bool]:
        return jsii.get(self, "migrateTraffic")

    @migrate_traffic.setter
    def migrate_traffic(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "migrateTraffic", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["AppEngineServiceSplitTrafficTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["AppEngineServiceSplitTrafficTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineServiceSplitTrafficConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'service': 'service', 'split': 'split', 'migrate_traffic': 'migrateTraffic', 'project': 'project', 'timeouts': 'timeouts'})
class AppEngineServiceSplitTrafficConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, service: str, split: typing.List["AppEngineServiceSplitTrafficSplit"], migrate_traffic: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["AppEngineServiceSplitTrafficTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param service: The name of the service these settings apply to.
        :param split: split block.
        :param migrate_traffic: If set to true traffic will be migrated to this version.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = AppEngineServiceSplitTrafficTimeouts(**timeouts)
        self._values = {
            'service': service,
            'split': split,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if migrate_traffic is not None: self._values["migrate_traffic"] = migrate_traffic
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def service(self) -> str:
        """The name of the service these settings apply to."""
        return self._values.get('service')

    @builtins.property
    def split(self) -> typing.List["AppEngineServiceSplitTrafficSplit"]:
        """split block."""
        return self._values.get('split')

    @builtins.property
    def migrate_traffic(self) -> typing.Optional[bool]:
        """If set to true traffic will be migrated to this version."""
        return self._values.get('migrate_traffic')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["AppEngineServiceSplitTrafficTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineServiceSplitTrafficConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineServiceSplitTrafficSplit", jsii_struct_bases=[], name_mapping={'allocations': 'allocations', 'shard_by': 'shardBy'})
class AppEngineServiceSplitTrafficSplit():
    def __init__(self, *, allocations: typing.Mapping[str, str], shard_by: typing.Optional[str]=None) -> None:
        """
        :param allocations: Mapping from version IDs within the service to fractional (0.000, 1] allocations of traffic for that version. Each version can be specified only once, but some versions in the service may not have any traffic allocation. Services that have traffic allocated cannot be deleted until either the service is deleted or their traffic allocation is removed. Allocations must sum to 1. Up to two decimal place precision is supported for IP-based splits and up to three decimal places is supported for cookie-based splits.
        :param shard_by: Mechanism used to determine which version a request is sent to. The traffic selection algorithm will be stable for either type until allocations are changed. Possible values: ["UNSPECIFIED", "COOKIE", "IP", "RANDOM"]
        """
        self._values = {
            'allocations': allocations,
        }
        if shard_by is not None: self._values["shard_by"] = shard_by

    @builtins.property
    def allocations(self) -> typing.Mapping[str, str]:
        """Mapping from version IDs within the service to fractional (0.000, 1] allocations of traffic for that version. Each version can be specified only once, but some versions in the service may not have any traffic allocation. Services that have traffic allocated cannot be deleted until either the service is deleted or their traffic allocation is removed. Allocations must sum to 1. Up to two decimal place precision is supported for IP-based splits and up to three decimal places is supported for cookie-based splits."""
        return self._values.get('allocations')

    @builtins.property
    def shard_by(self) -> typing.Optional[str]:
        """Mechanism used to determine which version a request is sent to.

        The traffic selection algorithm will be stable for either type until allocations are changed. Possible values: ["UNSPECIFIED", "COOKIE", "IP", "RANDOM"]
        """
        return self._values.get('shard_by')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineServiceSplitTrafficSplit(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineServiceSplitTrafficTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class AppEngineServiceSplitTrafficTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineServiceSplitTrafficTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class AppEngineStandardAppVersion(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.AppEngineStandardAppVersion"):
    def __init__(self, scope: constructs.Construct, id: str, *, deployment: typing.List["AppEngineStandardAppVersionDeployment"], runtime: str, service: str, automatic_scaling: typing.Optional[typing.List["AppEngineStandardAppVersionAutomaticScaling"]]=None, basic_scaling: typing.Optional[typing.List["AppEngineStandardAppVersionBasicScaling"]]=None, delete_service_on_destroy: typing.Optional[bool]=None, entrypoint: typing.Optional[typing.List["AppEngineStandardAppVersionEntrypoint"]]=None, env_variables: typing.Optional[typing.Mapping[str, str]]=None, handlers: typing.Optional[typing.List["AppEngineStandardAppVersionHandlers"]]=None, inbound_services: typing.Optional[typing.List[str]]=None, instance_class: typing.Optional[str]=None, libraries: typing.Optional[typing.List["AppEngineStandardAppVersionLibraries"]]=None, manual_scaling: typing.Optional[typing.List["AppEngineStandardAppVersionManualScaling"]]=None, noop_on_destroy: typing.Optional[bool]=None, project: typing.Optional[str]=None, runtime_api_version: typing.Optional[str]=None, threadsafe: typing.Optional[bool]=None, timeouts: typing.Optional["AppEngineStandardAppVersionTimeouts"]=None, version_id: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param deployment: deployment block.
        :param runtime: Desired runtime. Example python27.
        :param service: AppEngine service resource.
        :param automatic_scaling: automatic_scaling block.
        :param basic_scaling: basic_scaling block.
        :param delete_service_on_destroy: 
        :param entrypoint: entrypoint block.
        :param env_variables: Environment variables available to the application.
        :param handlers: handlers block.
        :param inbound_services: A list of the types of messages that this application is able to receive. Possible values: ["INBOUND_SERVICE_MAIL", "INBOUND_SERVICE_MAIL_BOUNCE", "INBOUND_SERVICE_XMPP_ERROR", "INBOUND_SERVICE_XMPP_MESSAGE", "INBOUND_SERVICE_XMPP_SUBSCRIBE", "INBOUND_SERVICE_XMPP_PRESENCE", "INBOUND_SERVICE_CHANNEL_PRESENCE", "INBOUND_SERVICE_WARMUP"]
        :param instance_class: Instance class that is used to run this version. Valid values are AutomaticScaling: F1, F2, F4, F4_1G BasicScaling or ManualScaling: B1, B2, B4, B4_1G, B8 Defaults to F1 for AutomaticScaling and B2 for ManualScaling and BasicScaling. If no scaling is specified, AutomaticScaling is chosen.
        :param libraries: libraries block.
        :param manual_scaling: manual_scaling block.
        :param noop_on_destroy: 
        :param project: 
        :param runtime_api_version: The version of the API in the given runtime environment. Please see the app.yaml reference for valid values at https://cloud.google.com/appengine/docs/standard//config/appref
        :param threadsafe: Whether multiple requests can be dispatched to this version at once.
        :param timeouts: timeouts block.
        :param version_id: Relative name of the version within the service. For example, 'v1'. Version names can contain only lowercase letters, numbers, or hyphens. Reserved names,"default", "latest", and any name with the prefix "ah-".
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = AppEngineStandardAppVersionConfig(deployment=deployment, runtime=runtime, service=service, automatic_scaling=automatic_scaling, basic_scaling=basic_scaling, delete_service_on_destroy=delete_service_on_destroy, entrypoint=entrypoint, env_variables=env_variables, handlers=handlers, inbound_services=inbound_services, instance_class=instance_class, libraries=libraries, manual_scaling=manual_scaling, noop_on_destroy=noop_on_destroy, project=project, runtime_api_version=runtime_api_version, threadsafe=threadsafe, timeouts=timeouts, version_id=version_id, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(AppEngineStandardAppVersion, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="deployment")
    def deployment(self) -> typing.List["AppEngineStandardAppVersionDeployment"]:
        return jsii.get(self, "deployment")

    @deployment.setter
    def deployment(self, value: typing.List["AppEngineStandardAppVersionDeployment"]) -> None:
        jsii.set(self, "deployment", value)

    @builtins.property
    @jsii.member(jsii_name="runtime")
    def runtime(self) -> str:
        return jsii.get(self, "runtime")

    @runtime.setter
    def runtime(self, value: str) -> None:
        jsii.set(self, "runtime", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="automaticScaling")
    def automatic_scaling(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionAutomaticScaling"]]:
        return jsii.get(self, "automaticScaling")

    @automatic_scaling.setter
    def automatic_scaling(self, value: typing.Optional[typing.List["AppEngineStandardAppVersionAutomaticScaling"]]) -> None:
        jsii.set(self, "automaticScaling", value)

    @builtins.property
    @jsii.member(jsii_name="basicScaling")
    def basic_scaling(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionBasicScaling"]]:
        return jsii.get(self, "basicScaling")

    @basic_scaling.setter
    def basic_scaling(self, value: typing.Optional[typing.List["AppEngineStandardAppVersionBasicScaling"]]) -> None:
        jsii.set(self, "basicScaling", value)

    @builtins.property
    @jsii.member(jsii_name="deleteServiceOnDestroy")
    def delete_service_on_destroy(self) -> typing.Optional[bool]:
        return jsii.get(self, "deleteServiceOnDestroy")

    @delete_service_on_destroy.setter
    def delete_service_on_destroy(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "deleteServiceOnDestroy", value)

    @builtins.property
    @jsii.member(jsii_name="entrypoint")
    def entrypoint(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionEntrypoint"]]:
        return jsii.get(self, "entrypoint")

    @entrypoint.setter
    def entrypoint(self, value: typing.Optional[typing.List["AppEngineStandardAppVersionEntrypoint"]]) -> None:
        jsii.set(self, "entrypoint", value)

    @builtins.property
    @jsii.member(jsii_name="envVariables")
    def env_variables(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "envVariables")

    @env_variables.setter
    def env_variables(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "envVariables", value)

    @builtins.property
    @jsii.member(jsii_name="handlers")
    def handlers(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionHandlers"]]:
        return jsii.get(self, "handlers")

    @handlers.setter
    def handlers(self, value: typing.Optional[typing.List["AppEngineStandardAppVersionHandlers"]]) -> None:
        jsii.set(self, "handlers", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="inboundServices")
    def inbound_services(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "inboundServices")

    @inbound_services.setter
    def inbound_services(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "inboundServices", value)

    @builtins.property
    @jsii.member(jsii_name="instanceClass")
    def instance_class(self) -> typing.Optional[str]:
        return jsii.get(self, "instanceClass")

    @instance_class.setter
    def instance_class(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "instanceClass", value)

    @builtins.property
    @jsii.member(jsii_name="libraries")
    def libraries(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionLibraries"]]:
        return jsii.get(self, "libraries")

    @libraries.setter
    def libraries(self, value: typing.Optional[typing.List["AppEngineStandardAppVersionLibraries"]]) -> None:
        jsii.set(self, "libraries", value)

    @builtins.property
    @jsii.member(jsii_name="manualScaling")
    def manual_scaling(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionManualScaling"]]:
        return jsii.get(self, "manualScaling")

    @manual_scaling.setter
    def manual_scaling(self, value: typing.Optional[typing.List["AppEngineStandardAppVersionManualScaling"]]) -> None:
        jsii.set(self, "manualScaling", value)

    @builtins.property
    @jsii.member(jsii_name="noopOnDestroy")
    def noop_on_destroy(self) -> typing.Optional[bool]:
        return jsii.get(self, "noopOnDestroy")

    @noop_on_destroy.setter
    def noop_on_destroy(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "noopOnDestroy", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="runtimeApiVersion")
    def runtime_api_version(self) -> typing.Optional[str]:
        return jsii.get(self, "runtimeApiVersion")

    @runtime_api_version.setter
    def runtime_api_version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "runtimeApiVersion", value)

    @builtins.property
    @jsii.member(jsii_name="threadsafe")
    def threadsafe(self) -> typing.Optional[bool]:
        return jsii.get(self, "threadsafe")

    @threadsafe.setter
    def threadsafe(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "threadsafe", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["AppEngineStandardAppVersionTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["AppEngineStandardAppVersionTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="versionId")
    def version_id(self) -> typing.Optional[str]:
        return jsii.get(self, "versionId")

    @version_id.setter
    def version_id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "versionId", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionAutomaticScaling", jsii_struct_bases=[], name_mapping={'max_concurrent_requests': 'maxConcurrentRequests', 'max_idle_instances': 'maxIdleInstances', 'max_pending_latency': 'maxPendingLatency', 'min_idle_instances': 'minIdleInstances', 'min_pending_latency': 'minPendingLatency', 'standard_scheduler_settings': 'standardSchedulerSettings'})
class AppEngineStandardAppVersionAutomaticScaling():
    def __init__(self, *, max_concurrent_requests: typing.Optional[jsii.Number]=None, max_idle_instances: typing.Optional[jsii.Number]=None, max_pending_latency: typing.Optional[str]=None, min_idle_instances: typing.Optional[jsii.Number]=None, min_pending_latency: typing.Optional[str]=None, standard_scheduler_settings: typing.Optional[typing.List["AppEngineStandardAppVersionAutomaticScalingStandardSchedulerSettings"]]=None) -> None:
        """
        :param max_concurrent_requests: Number of concurrent requests an automatic scaling instance can accept before the scheduler spawns a new instance. Defaults to a runtime-specific value.
        :param max_idle_instances: Maximum number of idle instances that should be maintained for this version.
        :param max_pending_latency: Maximum amount of time that a request should wait in the pending queue before starting a new instance to handle it. A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s".
        :param min_idle_instances: Minimum number of idle instances that should be maintained for this version. Only applicable for the default version of a service.
        :param min_pending_latency: Minimum amount of time a request should wait in the pending queue before starting a new instance to handle it. A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s".
        :param standard_scheduler_settings: standard_scheduler_settings block.
        """
        self._values = {
        }
        if max_concurrent_requests is not None: self._values["max_concurrent_requests"] = max_concurrent_requests
        if max_idle_instances is not None: self._values["max_idle_instances"] = max_idle_instances
        if max_pending_latency is not None: self._values["max_pending_latency"] = max_pending_latency
        if min_idle_instances is not None: self._values["min_idle_instances"] = min_idle_instances
        if min_pending_latency is not None: self._values["min_pending_latency"] = min_pending_latency
        if standard_scheduler_settings is not None: self._values["standard_scheduler_settings"] = standard_scheduler_settings

    @builtins.property
    def max_concurrent_requests(self) -> typing.Optional[jsii.Number]:
        """Number of concurrent requests an automatic scaling instance can accept before the scheduler spawns a new instance.

        Defaults to a runtime-specific value.
        """
        return self._values.get('max_concurrent_requests')

    @builtins.property
    def max_idle_instances(self) -> typing.Optional[jsii.Number]:
        """Maximum number of idle instances that should be maintained for this version."""
        return self._values.get('max_idle_instances')

    @builtins.property
    def max_pending_latency(self) -> typing.Optional[str]:
        """Maximum amount of time that a request should wait in the pending queue before starting a new instance to handle it.

        A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s".
        """
        return self._values.get('max_pending_latency')

    @builtins.property
    def min_idle_instances(self) -> typing.Optional[jsii.Number]:
        """Minimum number of idle instances that should be maintained for this version.

        Only applicable for the default version of a service.
        """
        return self._values.get('min_idle_instances')

    @builtins.property
    def min_pending_latency(self) -> typing.Optional[str]:
        """Minimum amount of time a request should wait in the pending queue before starting a new instance to handle it.

        A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s".
        """
        return self._values.get('min_pending_latency')

    @builtins.property
    def standard_scheduler_settings(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionAutomaticScalingStandardSchedulerSettings"]]:
        """standard_scheduler_settings block."""
        return self._values.get('standard_scheduler_settings')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionAutomaticScaling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionAutomaticScalingStandardSchedulerSettings", jsii_struct_bases=[], name_mapping={'max_instances': 'maxInstances', 'min_instances': 'minInstances', 'target_cpu_utilization': 'targetCpuUtilization', 'target_throughput_utilization': 'targetThroughputUtilization'})
class AppEngineStandardAppVersionAutomaticScalingStandardSchedulerSettings():
    def __init__(self, *, max_instances: typing.Optional[jsii.Number]=None, min_instances: typing.Optional[jsii.Number]=None, target_cpu_utilization: typing.Optional[jsii.Number]=None, target_throughput_utilization: typing.Optional[jsii.Number]=None) -> None:
        """
        :param max_instances: Maximum number of instances to run for this version. Set to zero to disable maxInstances configuration.
        :param min_instances: Minimum number of instances to run for this version. Set to zero to disable minInstances configuration.
        :param target_cpu_utilization: Target CPU utilization ratio to maintain when scaling. Should be a value in the range [0.50, 0.95], zero, or a negative value.
        :param target_throughput_utilization: Target throughput utilization ratio to maintain when scaling. Should be a value in the range [0.50, 0.95], zero, or a negative value.
        """
        self._values = {
        }
        if max_instances is not None: self._values["max_instances"] = max_instances
        if min_instances is not None: self._values["min_instances"] = min_instances
        if target_cpu_utilization is not None: self._values["target_cpu_utilization"] = target_cpu_utilization
        if target_throughput_utilization is not None: self._values["target_throughput_utilization"] = target_throughput_utilization

    @builtins.property
    def max_instances(self) -> typing.Optional[jsii.Number]:
        """Maximum number of instances to run for this version.

        Set to zero to disable maxInstances configuration.
        """
        return self._values.get('max_instances')

    @builtins.property
    def min_instances(self) -> typing.Optional[jsii.Number]:
        """Minimum number of instances to run for this version.

        Set to zero to disable minInstances configuration.
        """
        return self._values.get('min_instances')

    @builtins.property
    def target_cpu_utilization(self) -> typing.Optional[jsii.Number]:
        """Target CPU utilization ratio to maintain when scaling.

        Should be a value in the range [0.50, 0.95], zero, or a negative value.
        """
        return self._values.get('target_cpu_utilization')

    @builtins.property
    def target_throughput_utilization(self) -> typing.Optional[jsii.Number]:
        """Target throughput utilization ratio to maintain when scaling.

        Should be a value in the range [0.50, 0.95], zero, or a negative value.
        """
        return self._values.get('target_throughput_utilization')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionAutomaticScalingStandardSchedulerSettings(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionBasicScaling", jsii_struct_bases=[], name_mapping={'max_instances': 'maxInstances', 'idle_timeout': 'idleTimeout'})
class AppEngineStandardAppVersionBasicScaling():
    def __init__(self, *, max_instances: jsii.Number, idle_timeout: typing.Optional[str]=None) -> None:
        """
        :param max_instances: Maximum number of instances to create for this version. Must be in the range [1.0, 200.0].
        :param idle_timeout: Duration of time after the last request that an instance must wait before the instance is shut down. A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s". Defaults to 900s.
        """
        self._values = {
            'max_instances': max_instances,
        }
        if idle_timeout is not None: self._values["idle_timeout"] = idle_timeout

    @builtins.property
    def max_instances(self) -> jsii.Number:
        """Maximum number of instances to create for this version.

        Must be in the range [1.0, 200.0].
        """
        return self._values.get('max_instances')

    @builtins.property
    def idle_timeout(self) -> typing.Optional[str]:
        """Duration of time after the last request that an instance must wait before the instance is shut down.

        A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s". Defaults to 900s.
        """
        return self._values.get('idle_timeout')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionBasicScaling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'deployment': 'deployment', 'runtime': 'runtime', 'service': 'service', 'automatic_scaling': 'automaticScaling', 'basic_scaling': 'basicScaling', 'delete_service_on_destroy': 'deleteServiceOnDestroy', 'entrypoint': 'entrypoint', 'env_variables': 'envVariables', 'handlers': 'handlers', 'inbound_services': 'inboundServices', 'instance_class': 'instanceClass', 'libraries': 'libraries', 'manual_scaling': 'manualScaling', 'noop_on_destroy': 'noopOnDestroy', 'project': 'project', 'runtime_api_version': 'runtimeApiVersion', 'threadsafe': 'threadsafe', 'timeouts': 'timeouts', 'version_id': 'versionId'})
class AppEngineStandardAppVersionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, deployment: typing.List["AppEngineStandardAppVersionDeployment"], runtime: str, service: str, automatic_scaling: typing.Optional[typing.List["AppEngineStandardAppVersionAutomaticScaling"]]=None, basic_scaling: typing.Optional[typing.List["AppEngineStandardAppVersionBasicScaling"]]=None, delete_service_on_destroy: typing.Optional[bool]=None, entrypoint: typing.Optional[typing.List["AppEngineStandardAppVersionEntrypoint"]]=None, env_variables: typing.Optional[typing.Mapping[str, str]]=None, handlers: typing.Optional[typing.List["AppEngineStandardAppVersionHandlers"]]=None, inbound_services: typing.Optional[typing.List[str]]=None, instance_class: typing.Optional[str]=None, libraries: typing.Optional[typing.List["AppEngineStandardAppVersionLibraries"]]=None, manual_scaling: typing.Optional[typing.List["AppEngineStandardAppVersionManualScaling"]]=None, noop_on_destroy: typing.Optional[bool]=None, project: typing.Optional[str]=None, runtime_api_version: typing.Optional[str]=None, threadsafe: typing.Optional[bool]=None, timeouts: typing.Optional["AppEngineStandardAppVersionTimeouts"]=None, version_id: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param deployment: deployment block.
        :param runtime: Desired runtime. Example python27.
        :param service: AppEngine service resource.
        :param automatic_scaling: automatic_scaling block.
        :param basic_scaling: basic_scaling block.
        :param delete_service_on_destroy: 
        :param entrypoint: entrypoint block.
        :param env_variables: Environment variables available to the application.
        :param handlers: handlers block.
        :param inbound_services: A list of the types of messages that this application is able to receive. Possible values: ["INBOUND_SERVICE_MAIL", "INBOUND_SERVICE_MAIL_BOUNCE", "INBOUND_SERVICE_XMPP_ERROR", "INBOUND_SERVICE_XMPP_MESSAGE", "INBOUND_SERVICE_XMPP_SUBSCRIBE", "INBOUND_SERVICE_XMPP_PRESENCE", "INBOUND_SERVICE_CHANNEL_PRESENCE", "INBOUND_SERVICE_WARMUP"]
        :param instance_class: Instance class that is used to run this version. Valid values are AutomaticScaling: F1, F2, F4, F4_1G BasicScaling or ManualScaling: B1, B2, B4, B4_1G, B8 Defaults to F1 for AutomaticScaling and B2 for ManualScaling and BasicScaling. If no scaling is specified, AutomaticScaling is chosen.
        :param libraries: libraries block.
        :param manual_scaling: manual_scaling block.
        :param noop_on_destroy: 
        :param project: 
        :param runtime_api_version: The version of the API in the given runtime environment. Please see the app.yaml reference for valid values at https://cloud.google.com/appengine/docs/standard//config/appref
        :param threadsafe: Whether multiple requests can be dispatched to this version at once.
        :param timeouts: timeouts block.
        :param version_id: Relative name of the version within the service. For example, 'v1'. Version names can contain only lowercase letters, numbers, or hyphens. Reserved names,"default", "latest", and any name with the prefix "ah-".
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = AppEngineStandardAppVersionTimeouts(**timeouts)
        self._values = {
            'deployment': deployment,
            'runtime': runtime,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if automatic_scaling is not None: self._values["automatic_scaling"] = automatic_scaling
        if basic_scaling is not None: self._values["basic_scaling"] = basic_scaling
        if delete_service_on_destroy is not None: self._values["delete_service_on_destroy"] = delete_service_on_destroy
        if entrypoint is not None: self._values["entrypoint"] = entrypoint
        if env_variables is not None: self._values["env_variables"] = env_variables
        if handlers is not None: self._values["handlers"] = handlers
        if inbound_services is not None: self._values["inbound_services"] = inbound_services
        if instance_class is not None: self._values["instance_class"] = instance_class
        if libraries is not None: self._values["libraries"] = libraries
        if manual_scaling is not None: self._values["manual_scaling"] = manual_scaling
        if noop_on_destroy is not None: self._values["noop_on_destroy"] = noop_on_destroy
        if project is not None: self._values["project"] = project
        if runtime_api_version is not None: self._values["runtime_api_version"] = runtime_api_version
        if threadsafe is not None: self._values["threadsafe"] = threadsafe
        if timeouts is not None: self._values["timeouts"] = timeouts
        if version_id is not None: self._values["version_id"] = version_id

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def deployment(self) -> typing.List["AppEngineStandardAppVersionDeployment"]:
        """deployment block."""
        return self._values.get('deployment')

    @builtins.property
    def runtime(self) -> str:
        """Desired runtime.

        Example python27.
        """
        return self._values.get('runtime')

    @builtins.property
    def service(self) -> str:
        """AppEngine service resource."""
        return self._values.get('service')

    @builtins.property
    def automatic_scaling(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionAutomaticScaling"]]:
        """automatic_scaling block."""
        return self._values.get('automatic_scaling')

    @builtins.property
    def basic_scaling(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionBasicScaling"]]:
        """basic_scaling block."""
        return self._values.get('basic_scaling')

    @builtins.property
    def delete_service_on_destroy(self) -> typing.Optional[bool]:
        return self._values.get('delete_service_on_destroy')

    @builtins.property
    def entrypoint(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionEntrypoint"]]:
        """entrypoint block."""
        return self._values.get('entrypoint')

    @builtins.property
    def env_variables(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Environment variables available to the application."""
        return self._values.get('env_variables')

    @builtins.property
    def handlers(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionHandlers"]]:
        """handlers block."""
        return self._values.get('handlers')

    @builtins.property
    def inbound_services(self) -> typing.Optional[typing.List[str]]:
        """A list of the types of messages that this application is able to receive.

        Possible values: ["INBOUND_SERVICE_MAIL", "INBOUND_SERVICE_MAIL_BOUNCE", "INBOUND_SERVICE_XMPP_ERROR", "INBOUND_SERVICE_XMPP_MESSAGE", "INBOUND_SERVICE_XMPP_SUBSCRIBE", "INBOUND_SERVICE_XMPP_PRESENCE", "INBOUND_SERVICE_CHANNEL_PRESENCE", "INBOUND_SERVICE_WARMUP"]
        """
        return self._values.get('inbound_services')

    @builtins.property
    def instance_class(self) -> typing.Optional[str]:
        """Instance class that is used to run this version.

        Valid values are
        AutomaticScaling: F1, F2, F4, F4_1G
        BasicScaling or ManualScaling: B1, B2, B4, B4_1G, B8
        Defaults to F1 for AutomaticScaling and B2 for ManualScaling and BasicScaling. If no scaling is specified, AutomaticScaling is chosen.
        """
        return self._values.get('instance_class')

    @builtins.property
    def libraries(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionLibraries"]]:
        """libraries block."""
        return self._values.get('libraries')

    @builtins.property
    def manual_scaling(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionManualScaling"]]:
        """manual_scaling block."""
        return self._values.get('manual_scaling')

    @builtins.property
    def noop_on_destroy(self) -> typing.Optional[bool]:
        return self._values.get('noop_on_destroy')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def runtime_api_version(self) -> typing.Optional[str]:
        """The version of the API in the given runtime environment.

        Please see the app.yaml reference for valid values at https://cloud.google.com/appengine/docs/standard//config/appref
        """
        return self._values.get('runtime_api_version')

    @builtins.property
    def threadsafe(self) -> typing.Optional[bool]:
        """Whether multiple requests can be dispatched to this version at once."""
        return self._values.get('threadsafe')

    @builtins.property
    def timeouts(self) -> typing.Optional["AppEngineStandardAppVersionTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def version_id(self) -> typing.Optional[str]:
        """Relative name of the version within the service.

        For example, 'v1'. Version names can contain only lowercase letters, numbers, or hyphens. Reserved names,"default", "latest", and any name with the prefix "ah-".
        """
        return self._values.get('version_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionDeployment", jsii_struct_bases=[], name_mapping={'files': 'files', 'zip': 'zip'})
class AppEngineStandardAppVersionDeployment():
    def __init__(self, *, files: typing.Optional[typing.List["AppEngineStandardAppVersionDeploymentFiles"]]=None, zip: typing.Optional[typing.List["AppEngineStandardAppVersionDeploymentZip"]]=None) -> None:
        """
        :param files: files block.
        :param zip: zip block.
        """
        self._values = {
        }
        if files is not None: self._values["files"] = files
        if zip is not None: self._values["zip"] = zip

    @builtins.property
    def files(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionDeploymentFiles"]]:
        """files block."""
        return self._values.get('files')

    @builtins.property
    def zip(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionDeploymentZip"]]:
        """zip block."""
        return self._values.get('zip')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionDeployment(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionDeploymentFiles", jsii_struct_bases=[], name_mapping={'name': 'name', 'source_url': 'sourceUrl', 'sha1_sum': 'sha1Sum'})
class AppEngineStandardAppVersionDeploymentFiles():
    def __init__(self, *, name: str, source_url: str, sha1_sum: typing.Optional[str]=None) -> None:
        """
        :param name: 
        :param source_url: Source URL.
        :param sha1_sum: SHA1 checksum of the file.
        """
        self._values = {
            'name': name,
            'source_url': source_url,
        }
        if sha1_sum is not None: self._values["sha1_sum"] = sha1_sum

    @builtins.property
    def name(self) -> str:
        return self._values.get('name')

    @builtins.property
    def source_url(self) -> str:
        """Source URL."""
        return self._values.get('source_url')

    @builtins.property
    def sha1_sum(self) -> typing.Optional[str]:
        """SHA1 checksum of the file."""
        return self._values.get('sha1_sum')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionDeploymentFiles(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionDeploymentZip", jsii_struct_bases=[], name_mapping={'source_url': 'sourceUrl', 'files_count': 'filesCount'})
class AppEngineStandardAppVersionDeploymentZip():
    def __init__(self, *, source_url: str, files_count: typing.Optional[jsii.Number]=None) -> None:
        """
        :param source_url: Source URL.
        :param files_count: files count.
        """
        self._values = {
            'source_url': source_url,
        }
        if files_count is not None: self._values["files_count"] = files_count

    @builtins.property
    def source_url(self) -> str:
        """Source URL."""
        return self._values.get('source_url')

    @builtins.property
    def files_count(self) -> typing.Optional[jsii.Number]:
        """files count."""
        return self._values.get('files_count')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionDeploymentZip(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionEntrypoint", jsii_struct_bases=[], name_mapping={'shell': 'shell'})
class AppEngineStandardAppVersionEntrypoint():
    def __init__(self, *, shell: str) -> None:
        """
        :param shell: The format should be a shell command that can be fed to bash -c.
        """
        self._values = {
            'shell': shell,
        }

    @builtins.property
    def shell(self) -> str:
        """The format should be a shell command that can be fed to bash -c."""
        return self._values.get('shell')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionEntrypoint(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionHandlers", jsii_struct_bases=[], name_mapping={'auth_fail_action': 'authFailAction', 'login': 'login', 'redirect_http_response_code': 'redirectHttpResponseCode', 'script': 'script', 'security_level': 'securityLevel', 'static_files': 'staticFiles', 'url_regex': 'urlRegex'})
class AppEngineStandardAppVersionHandlers():
    def __init__(self, *, auth_fail_action: typing.Optional[str]=None, login: typing.Optional[str]=None, redirect_http_response_code: typing.Optional[str]=None, script: typing.Optional[typing.List["AppEngineStandardAppVersionHandlersScript"]]=None, security_level: typing.Optional[str]=None, static_files: typing.Optional[typing.List["AppEngineStandardAppVersionHandlersStaticFiles"]]=None, url_regex: typing.Optional[str]=None) -> None:
        """
        :param auth_fail_action: Actions to take when the user is not logged in. Possible values: ["AUTH_FAIL_ACTION_REDIRECT", "AUTH_FAIL_ACTION_UNAUTHORIZED"]
        :param login: Methods to restrict access to a URL based on login status. Possible values: ["LOGIN_OPTIONAL", "LOGIN_ADMIN", "LOGIN_REQUIRED"]
        :param redirect_http_response_code: 30x code to use when performing redirects for the secure field. Possible values: ["REDIRECT_HTTP_RESPONSE_CODE_301", "REDIRECT_HTTP_RESPONSE_CODE_302", "REDIRECT_HTTP_RESPONSE_CODE_303", "REDIRECT_HTTP_RESPONSE_CODE_307"]
        :param script: script block.
        :param security_level: Security (HTTPS) enforcement for this URL. Possible values: ["SECURE_DEFAULT", "SECURE_NEVER", "SECURE_OPTIONAL", "SECURE_ALWAYS"]
        :param static_files: static_files block.
        :param url_regex: URL prefix. Uses regular expression syntax, which means regexp special characters must be escaped, but should not contain groupings. All URLs that begin with this prefix are handled by this handler, using the portion of the URL after the prefix as part of the file path.
        """
        self._values = {
        }
        if auth_fail_action is not None: self._values["auth_fail_action"] = auth_fail_action
        if login is not None: self._values["login"] = login
        if redirect_http_response_code is not None: self._values["redirect_http_response_code"] = redirect_http_response_code
        if script is not None: self._values["script"] = script
        if security_level is not None: self._values["security_level"] = security_level
        if static_files is not None: self._values["static_files"] = static_files
        if url_regex is not None: self._values["url_regex"] = url_regex

    @builtins.property
    def auth_fail_action(self) -> typing.Optional[str]:
        """Actions to take when the user is not logged in.

        Possible values: ["AUTH_FAIL_ACTION_REDIRECT", "AUTH_FAIL_ACTION_UNAUTHORIZED"]
        """
        return self._values.get('auth_fail_action')

    @builtins.property
    def login(self) -> typing.Optional[str]:
        """Methods to restrict access to a URL based on login status.

        Possible values: ["LOGIN_OPTIONAL", "LOGIN_ADMIN", "LOGIN_REQUIRED"]
        """
        return self._values.get('login')

    @builtins.property
    def redirect_http_response_code(self) -> typing.Optional[str]:
        """30x code to use when performing redirects for the secure field.

        Possible values: ["REDIRECT_HTTP_RESPONSE_CODE_301", "REDIRECT_HTTP_RESPONSE_CODE_302", "REDIRECT_HTTP_RESPONSE_CODE_303", "REDIRECT_HTTP_RESPONSE_CODE_307"]
        """
        return self._values.get('redirect_http_response_code')

    @builtins.property
    def script(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionHandlersScript"]]:
        """script block."""
        return self._values.get('script')

    @builtins.property
    def security_level(self) -> typing.Optional[str]:
        """Security (HTTPS) enforcement for this URL.

        Possible values: ["SECURE_DEFAULT", "SECURE_NEVER", "SECURE_OPTIONAL", "SECURE_ALWAYS"]
        """
        return self._values.get('security_level')

    @builtins.property
    def static_files(self) -> typing.Optional[typing.List["AppEngineStandardAppVersionHandlersStaticFiles"]]:
        """static_files block."""
        return self._values.get('static_files')

    @builtins.property
    def url_regex(self) -> typing.Optional[str]:
        """URL prefix.

        Uses regular expression syntax, which means regexp special characters must be escaped, but should not contain groupings.
        All URLs that begin with this prefix are handled by this handler, using the portion of the URL after the prefix as part of the file path.
        """
        return self._values.get('url_regex')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionHandlers(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionHandlersScript", jsii_struct_bases=[], name_mapping={'script_path': 'scriptPath'})
class AppEngineStandardAppVersionHandlersScript():
    def __init__(self, *, script_path: str) -> None:
        """
        :param script_path: Path to the script from the application root directory.
        """
        self._values = {
            'script_path': script_path,
        }

    @builtins.property
    def script_path(self) -> str:
        """Path to the script from the application root directory."""
        return self._values.get('script_path')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionHandlersScript(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionHandlersStaticFiles", jsii_struct_bases=[], name_mapping={'application_readable': 'applicationReadable', 'expiration': 'expiration', 'http_headers': 'httpHeaders', 'mime_type': 'mimeType', 'path': 'path', 'require_matching_file': 'requireMatchingFile', 'upload_path_regex': 'uploadPathRegex'})
class AppEngineStandardAppVersionHandlersStaticFiles():
    def __init__(self, *, application_readable: typing.Optional[bool]=None, expiration: typing.Optional[str]=None, http_headers: typing.Optional[typing.Mapping[str, str]]=None, mime_type: typing.Optional[str]=None, path: typing.Optional[str]=None, require_matching_file: typing.Optional[bool]=None, upload_path_regex: typing.Optional[str]=None) -> None:
        """
        :param application_readable: Whether files should also be uploaded as code data. By default, files declared in static file handlers are uploaded as static data and are only served to end users; they cannot be read by the application. If enabled, uploads are charged against both your code and static data storage resource quotas.
        :param expiration: Time a static file served by this handler should be cached by web proxies and browsers. A duration in seconds with up to nine fractional digits, terminated by 's'. Example "3.5s".
        :param http_headers: HTTP headers to use for all responses from these URLs. An object containing a list of "key:value" value pairs.".
        :param mime_type: MIME type used to serve all files served by this handler. Defaults to file-specific MIME types, which are derived from each file's filename extension.
        :param path: Path to the static files matched by the URL pattern, from the application root directory. The path can refer to text matched in groupings in the URL pattern.
        :param require_matching_file: Whether this handler should match the request if the file referenced by the handler does not exist.
        :param upload_path_regex: Regular expression that matches the file paths for all files that should be referenced by this handler.
        """
        self._values = {
        }
        if application_readable is not None: self._values["application_readable"] = application_readable
        if expiration is not None: self._values["expiration"] = expiration
        if http_headers is not None: self._values["http_headers"] = http_headers
        if mime_type is not None: self._values["mime_type"] = mime_type
        if path is not None: self._values["path"] = path
        if require_matching_file is not None: self._values["require_matching_file"] = require_matching_file
        if upload_path_regex is not None: self._values["upload_path_regex"] = upload_path_regex

    @builtins.property
    def application_readable(self) -> typing.Optional[bool]:
        """Whether files should also be uploaded as code data.

        By default, files declared in static file handlers are uploaded as
        static data and are only served to end users; they cannot be read by the application. If enabled, uploads are charged
        against both your code and static data storage resource quotas.
        """
        return self._values.get('application_readable')

    @builtins.property
    def expiration(self) -> typing.Optional[str]:
        """Time a static file served by this handler should be cached by web proxies and browsers.

        A duration in seconds with up to nine fractional digits, terminated by 's'. Example "3.5s".
        """
        return self._values.get('expiration')

    @builtins.property
    def http_headers(self) -> typing.Optional[typing.Mapping[str, str]]:
        """HTTP headers to use for all responses from these URLs.

        An object containing a list of "key:value" value pairs.".
        """
        return self._values.get('http_headers')

    @builtins.property
    def mime_type(self) -> typing.Optional[str]:
        """MIME type used to serve all files served by this handler.

        Defaults to file-specific MIME types, which are derived from each file's filename extension.
        """
        return self._values.get('mime_type')

    @builtins.property
    def path(self) -> typing.Optional[str]:
        """Path to the static files matched by the URL pattern, from the application root directory.

        The path can refer to text matched in groupings in the URL pattern.
        """
        return self._values.get('path')

    @builtins.property
    def require_matching_file(self) -> typing.Optional[bool]:
        """Whether this handler should match the request if the file referenced by the handler does not exist."""
        return self._values.get('require_matching_file')

    @builtins.property
    def upload_path_regex(self) -> typing.Optional[str]:
        """Regular expression that matches the file paths for all files that should be referenced by this handler."""
        return self._values.get('upload_path_regex')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionHandlersStaticFiles(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionLibraries", jsii_struct_bases=[], name_mapping={'name': 'name', 'version': 'version'})
class AppEngineStandardAppVersionLibraries():
    def __init__(self, *, name: typing.Optional[str]=None, version: typing.Optional[str]=None) -> None:
        """
        :param name: Name of the library. Example "django".
        :param version: Version of the library to select, or "latest".
        """
        self._values = {
        }
        if name is not None: self._values["name"] = name
        if version is not None: self._values["version"] = version

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Name of the library.

        Example "django".
        """
        return self._values.get('name')

    @builtins.property
    def version(self) -> typing.Optional[str]:
        """Version of the library to select, or "latest"."""
        return self._values.get('version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionLibraries(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionManualScaling", jsii_struct_bases=[], name_mapping={'instances': 'instances'})
class AppEngineStandardAppVersionManualScaling():
    def __init__(self, *, instances: jsii.Number) -> None:
        """
        :param instances: Number of instances to assign to the service at the start. *Note:** When managing the number of instances at runtime through the App Engine Admin API or the (now deprecated) Python 2 Modules API set_num_instances() you must use 'lifecycle.ignore_changes = ["manual_scaling"[0].instances]' to prevent drift detection.
        """
        self._values = {
            'instances': instances,
        }

    @builtins.property
    def instances(self) -> jsii.Number:
        """Number of instances to assign to the service at the start.

        *Note:** When managing the number of instances at runtime through the App Engine Admin API or the (now deprecated) Python 2
        Modules API set_num_instances() you must use 'lifecycle.ignore_changes = ["manual_scaling"[0].instances]' to prevent drift detection.
        """
        return self._values.get('instances')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionManualScaling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.AppEngineStandardAppVersionTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class AppEngineStandardAppVersionTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'AppEngineStandardAppVersionTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigqueryDataTransferConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigqueryDataTransferConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, data_source_id: str, destination_dataset_id: str, display_name: str, params: typing.Mapping[str, str], data_refresh_window_days: typing.Optional[jsii.Number]=None, disabled: typing.Optional[bool]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, schedule: typing.Optional[str]=None, service_account_name: typing.Optional[str]=None, timeouts: typing.Optional["BigqueryDataTransferConfigTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param data_source_id: The data source id. Cannot be changed once the transfer config is created.
        :param destination_dataset_id: The BigQuery target dataset id.
        :param display_name: The user specified display name for the transfer config.
        :param params: These parameters are specific to each data source.
        :param data_refresh_window_days: The number of days to look back to automatically refresh the data. For example, if dataRefreshWindowDays = 10, then every day BigQuery reingests data for [today-10, today-1], rather than ingesting data for just [today-1]. Only valid if the data source supports the feature. Set the value to 0 to use the default value.
        :param disabled: When set to true, no runs are scheduled for a given transfer.
        :param location: The geographic location where the transfer config should reside. Examples: US, EU, asia-northeast1. The default value is US.
        :param project: 
        :param schedule: Data transfer schedule. If the data source does not support a custom schedule, this should be empty. If it is empty, the default value for the data source will be used. The specified times are in UTC. Examples of valid format: 1st,3rd monday of month 15:30, every wed,fri of jan, jun 13:15, and first sunday of quarter 00:00. See more explanation about the format here: https://cloud.google.com/appengine/docs/flexible/python/scheduling-jobs-with-cron-yaml#the_schedule_format NOTE: the granularity should be at least 8 hours, or less frequent.
        :param service_account_name: Optional service account name. If this field is set, transfer config will be created with this service account credentials. It requires that requesting user calling this API has permissions to act as this service account.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigqueryDataTransferConfigConfig(data_source_id=data_source_id, destination_dataset_id=destination_dataset_id, display_name=display_name, params=params, data_refresh_window_days=data_refresh_window_days, disabled=disabled, location=location, project=project, schedule=schedule, service_account_name=service_account_name, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigqueryDataTransferConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="dataSourceId")
    def data_source_id(self) -> str:
        return jsii.get(self, "dataSourceId")

    @data_source_id.setter
    def data_source_id(self, value: str) -> None:
        jsii.set(self, "dataSourceId", value)

    @builtins.property
    @jsii.member(jsii_name="destinationDatasetId")
    def destination_dataset_id(self) -> str:
        return jsii.get(self, "destinationDatasetId")

    @destination_dataset_id.setter
    def destination_dataset_id(self, value: str) -> None:
        jsii.set(self, "destinationDatasetId", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="params")
    def params(self) -> typing.Mapping[str, str]:
        return jsii.get(self, "params")

    @params.setter
    def params(self, value: typing.Mapping[str, str]) -> None:
        jsii.set(self, "params", value)

    @builtins.property
    @jsii.member(jsii_name="dataRefreshWindowDays")
    def data_refresh_window_days(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "dataRefreshWindowDays")

    @data_refresh_window_days.setter
    def data_refresh_window_days(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "dataRefreshWindowDays", value)

    @builtins.property
    @jsii.member(jsii_name="disabled")
    def disabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "disabled")

    @disabled.setter
    def disabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "disabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="schedule")
    def schedule(self) -> typing.Optional[str]:
        return jsii.get(self, "schedule")

    @schedule.setter
    def schedule(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "schedule", value)

    @builtins.property
    @jsii.member(jsii_name="serviceAccountName")
    def service_account_name(self) -> typing.Optional[str]:
        return jsii.get(self, "serviceAccountName")

    @service_account_name.setter
    def service_account_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "serviceAccountName", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["BigqueryDataTransferConfigTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["BigqueryDataTransferConfigTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDataTransferConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'data_source_id': 'dataSourceId', 'destination_dataset_id': 'destinationDatasetId', 'display_name': 'displayName', 'params': 'params', 'data_refresh_window_days': 'dataRefreshWindowDays', 'disabled': 'disabled', 'location': 'location', 'project': 'project', 'schedule': 'schedule', 'service_account_name': 'serviceAccountName', 'timeouts': 'timeouts'})
class BigqueryDataTransferConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, data_source_id: str, destination_dataset_id: str, display_name: str, params: typing.Mapping[str, str], data_refresh_window_days: typing.Optional[jsii.Number]=None, disabled: typing.Optional[bool]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, schedule: typing.Optional[str]=None, service_account_name: typing.Optional[str]=None, timeouts: typing.Optional["BigqueryDataTransferConfigTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param data_source_id: The data source id. Cannot be changed once the transfer config is created.
        :param destination_dataset_id: The BigQuery target dataset id.
        :param display_name: The user specified display name for the transfer config.
        :param params: These parameters are specific to each data source.
        :param data_refresh_window_days: The number of days to look back to automatically refresh the data. For example, if dataRefreshWindowDays = 10, then every day BigQuery reingests data for [today-10, today-1], rather than ingesting data for just [today-1]. Only valid if the data source supports the feature. Set the value to 0 to use the default value.
        :param disabled: When set to true, no runs are scheduled for a given transfer.
        :param location: The geographic location where the transfer config should reside. Examples: US, EU, asia-northeast1. The default value is US.
        :param project: 
        :param schedule: Data transfer schedule. If the data source does not support a custom schedule, this should be empty. If it is empty, the default value for the data source will be used. The specified times are in UTC. Examples of valid format: 1st,3rd monday of month 15:30, every wed,fri of jan, jun 13:15, and first sunday of quarter 00:00. See more explanation about the format here: https://cloud.google.com/appengine/docs/flexible/python/scheduling-jobs-with-cron-yaml#the_schedule_format NOTE: the granularity should be at least 8 hours, or less frequent.
        :param service_account_name: Optional service account name. If this field is set, transfer config will be created with this service account credentials. It requires that requesting user calling this API has permissions to act as this service account.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = BigqueryDataTransferConfigTimeouts(**timeouts)
        self._values = {
            'data_source_id': data_source_id,
            'destination_dataset_id': destination_dataset_id,
            'display_name': display_name,
            'params': params,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if data_refresh_window_days is not None: self._values["data_refresh_window_days"] = data_refresh_window_days
        if disabled is not None: self._values["disabled"] = disabled
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project
        if schedule is not None: self._values["schedule"] = schedule
        if service_account_name is not None: self._values["service_account_name"] = service_account_name
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def data_source_id(self) -> str:
        """The data source id.

        Cannot be changed once the transfer config is created.
        """
        return self._values.get('data_source_id')

    @builtins.property
    def destination_dataset_id(self) -> str:
        """The BigQuery target dataset id."""
        return self._values.get('destination_dataset_id')

    @builtins.property
    def display_name(self) -> str:
        """The user specified display name for the transfer config."""
        return self._values.get('display_name')

    @builtins.property
    def params(self) -> typing.Mapping[str, str]:
        """These parameters are specific to each data source."""
        return self._values.get('params')

    @builtins.property
    def data_refresh_window_days(self) -> typing.Optional[jsii.Number]:
        """The number of days to look back to automatically refresh the data.

        For example, if dataRefreshWindowDays = 10, then every day BigQuery
        reingests data for [today-10, today-1], rather than ingesting data for
        just [today-1]. Only valid if the data source supports the feature.
        Set the value to 0 to use the default value.
        """
        return self._values.get('data_refresh_window_days')

    @builtins.property
    def disabled(self) -> typing.Optional[bool]:
        """When set to true, no runs are scheduled for a given transfer."""
        return self._values.get('disabled')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """The geographic location where the transfer config should reside.

        Examples: US, EU, asia-northeast1. The default value is US.
        """
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def schedule(self) -> typing.Optional[str]:
        """Data transfer schedule.

        If the data source does not support a custom
        schedule, this should be empty. If it is empty, the default value for
        the data source will be used. The specified times are in UTC. Examples
        of valid format: 1st,3rd monday of month 15:30, every wed,fri of jan,
        jun 13:15, and first sunday of quarter 00:00. See more explanation
        about the format here:
        https://cloud.google.com/appengine/docs/flexible/python/scheduling-jobs-with-cron-yaml#the_schedule_format
        NOTE: the granularity should be at least 8 hours, or less frequent.
        """
        return self._values.get('schedule')

    @builtins.property
    def service_account_name(self) -> typing.Optional[str]:
        """Optional service account name.

        If this field is set, transfer config will
        be created with this service account credentials. It requires that
        requesting user calling this API has permissions to act as this service account.
        """
        return self._values.get('service_account_name')

    @builtins.property
    def timeouts(self) -> typing.Optional["BigqueryDataTransferConfigTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDataTransferConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDataTransferConfigTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class BigqueryDataTransferConfigTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDataTransferConfigTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigqueryDataset(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigqueryDataset"):
    def __init__(self, scope: constructs.Construct, id: str, *, dataset_id: str, access: typing.Optional[typing.List["BigqueryDatasetAccess"]]=None, default_encryption_configuration: typing.Optional[typing.List["BigqueryDatasetDefaultEncryptionConfiguration"]]=None, default_partition_expiration_ms: typing.Optional[jsii.Number]=None, default_table_expiration_ms: typing.Optional[jsii.Number]=None, delete_contents_on_destroy: typing.Optional[bool]=None, description: typing.Optional[str]=None, friendly_name: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["BigqueryDatasetTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dataset_id: A unique ID for this dataset, without the project name. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
        :param access: access block.
        :param default_encryption_configuration: default_encryption_configuration block.
        :param default_partition_expiration_ms: The default partition expiration for all partitioned tables in the dataset, in milliseconds. Once this property is set, all newly-created partitioned tables in the dataset will have an 'expirationMs' property in the 'timePartitioning' settings set to this value, and changing the value will only affect new tables, not existing ones. The storage in a partition will have an expiration time of its partition time plus this value. Setting this property overrides the use of 'defaultTableExpirationMs' for partitioned tables: only one of 'defaultTableExpirationMs' and 'defaultPartitionExpirationMs' will be used for any new partitioned table. If you provide an explicit 'timePartitioning.expirationMs' when creating or updating a partitioned table, that value takes precedence over the default partition expiration time indicated by this property.
        :param default_table_expiration_ms: The default lifetime of all tables in the dataset, in milliseconds. The minimum value is 3600000 milliseconds (one hour). Once this property is set, all newly-created tables in the dataset will have an 'expirationTime' property set to the creation time plus the value in this property, and changing the value will only affect new tables, not existing ones. When the 'expirationTime' for a given table is reached, that table will be deleted automatically. If a table's 'expirationTime' is modified or removed before the table expires, or if you provide an explicit 'expirationTime' when creating a table, that value takes precedence over the default expiration time indicated by this property.
        :param delete_contents_on_destroy: 
        :param description: A user-friendly description of the dataset.
        :param friendly_name: A descriptive name for the dataset.
        :param labels: The labels associated with this dataset. You can use these to organize and group your datasets
        :param location: The geographic location where the dataset should reside. See `official docs <https://cloud.google.com/bigquery/docs/dataset-locations>`_. There are two types of locations, regional or multi-regional. A regional location is a specific geographic place, such as Tokyo, and a multi-regional location is a large geographic area, such as the United States, that contains at least two geographic places. Possible regional values include: 'asia-east1', 'asia-northeast1', 'asia-southeast1', 'australia-southeast1', 'europe-north1', 'europe-west2' and 'us-east4'. Possible multi-regional values: 'EU' and 'US'. The default value is multi-regional location 'US'. Changing this forces a new resource to be created.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigqueryDatasetConfig(dataset_id=dataset_id, access=access, default_encryption_configuration=default_encryption_configuration, default_partition_expiration_ms=default_partition_expiration_ms, default_table_expiration_ms=default_table_expiration_ms, delete_contents_on_destroy=delete_contents_on_destroy, description=description, friendly_name=friendly_name, labels=labels, location=location, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigqueryDataset, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTime")
    def creation_time(self) -> jsii.Number:
        return jsii.get(self, "creationTime")

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="lastModifiedTime")
    def last_modified_time(self) -> jsii.Number:
        return jsii.get(self, "lastModifiedTime")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="datasetId")
    def dataset_id(self) -> str:
        return jsii.get(self, "datasetId")

    @dataset_id.setter
    def dataset_id(self, value: str) -> None:
        jsii.set(self, "datasetId", value)

    @builtins.property
    @jsii.member(jsii_name="access")
    def access(self) -> typing.Optional[typing.List["BigqueryDatasetAccess"]]:
        return jsii.get(self, "access")

    @access.setter
    def access(self, value: typing.Optional[typing.List["BigqueryDatasetAccess"]]) -> None:
        jsii.set(self, "access", value)

    @builtins.property
    @jsii.member(jsii_name="defaultEncryptionConfiguration")
    def default_encryption_configuration(self) -> typing.Optional[typing.List["BigqueryDatasetDefaultEncryptionConfiguration"]]:
        return jsii.get(self, "defaultEncryptionConfiguration")

    @default_encryption_configuration.setter
    def default_encryption_configuration(self, value: typing.Optional[typing.List["BigqueryDatasetDefaultEncryptionConfiguration"]]) -> None:
        jsii.set(self, "defaultEncryptionConfiguration", value)

    @builtins.property
    @jsii.member(jsii_name="defaultPartitionExpirationMs")
    def default_partition_expiration_ms(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "defaultPartitionExpirationMs")

    @default_partition_expiration_ms.setter
    def default_partition_expiration_ms(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "defaultPartitionExpirationMs", value)

    @builtins.property
    @jsii.member(jsii_name="defaultTableExpirationMs")
    def default_table_expiration_ms(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "defaultTableExpirationMs")

    @default_table_expiration_ms.setter
    def default_table_expiration_ms(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "defaultTableExpirationMs", value)

    @builtins.property
    @jsii.member(jsii_name="deleteContentsOnDestroy")
    def delete_contents_on_destroy(self) -> typing.Optional[bool]:
        return jsii.get(self, "deleteContentsOnDestroy")

    @delete_contents_on_destroy.setter
    def delete_contents_on_destroy(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "deleteContentsOnDestroy", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="friendlyName")
    def friendly_name(self) -> typing.Optional[str]:
        return jsii.get(self, "friendlyName")

    @friendly_name.setter
    def friendly_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "friendlyName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["BigqueryDatasetTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["BigqueryDatasetTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetAccess", jsii_struct_bases=[], name_mapping={'domain': 'domain', 'group_by_email': 'groupByEmail', 'role': 'role', 'special_group': 'specialGroup', 'user_by_email': 'userByEmail', 'view': 'view'})
class BigqueryDatasetAccess():
    def __init__(self, *, domain: typing.Optional[str]=None, group_by_email: typing.Optional[str]=None, role: typing.Optional[str]=None, special_group: typing.Optional[str]=None, user_by_email: typing.Optional[str]=None, view: typing.Optional[typing.List["BigqueryDatasetAccessView"]]=None) -> None:
        """
        :param domain: A domain to grant access to. Any users signed in with the domain specified will be granted the specified access
        :param group_by_email: An email address of a Google Group to grant access to.
        :param role: Describes the rights granted to the user specified by the other member of the access object. Primitive, Predefined and custom roles are supported. Predefined roles that have equivalent primitive roles are swapped by the API to their Primitive counterparts. See `official docs <https://cloud.google.com/bigquery/docs/access-control>`_.
        :param special_group: A special group to grant access to. Possible values include:. 'projectOwners': Owners of the enclosing project. 'projectReaders': Readers of the enclosing project. 'projectWriters': Writers of the enclosing project. 'allAuthenticatedUsers': All authenticated BigQuery users.
        :param user_by_email: An email address of a user to grant access to. For example: fred@example.com
        :param view: view block.
        """
        self._values = {
        }
        if domain is not None: self._values["domain"] = domain
        if group_by_email is not None: self._values["group_by_email"] = group_by_email
        if role is not None: self._values["role"] = role
        if special_group is not None: self._values["special_group"] = special_group
        if user_by_email is not None: self._values["user_by_email"] = user_by_email
        if view is not None: self._values["view"] = view

    @builtins.property
    def domain(self) -> typing.Optional[str]:
        """A domain to grant access to.

        Any users signed in with the
        domain specified will be granted the specified access
        """
        return self._values.get('domain')

    @builtins.property
    def group_by_email(self) -> typing.Optional[str]:
        """An email address of a Google Group to grant access to."""
        return self._values.get('group_by_email')

    @builtins.property
    def role(self) -> typing.Optional[str]:
        """Describes the rights granted to the user specified by the other member of the access object.

        Primitive, Predefined and custom
        roles are supported. Predefined roles that have equivalent
        primitive roles are swapped by the API to their Primitive
        counterparts. See
        `official docs <https://cloud.google.com/bigquery/docs/access-control>`_.
        """
        return self._values.get('role')

    @builtins.property
    def special_group(self) -> typing.Optional[str]:
        """A special group to grant access to. Possible values include:.

        'projectOwners': Owners of the enclosing project.

        'projectReaders': Readers of the enclosing project.

        'projectWriters': Writers of the enclosing project.

        'allAuthenticatedUsers': All authenticated BigQuery users.
        """
        return self._values.get('special_group')

    @builtins.property
    def user_by_email(self) -> typing.Optional[str]:
        """An email address of a user to grant access to.

        For example:
        fred@example.com
        """
        return self._values.get('user_by_email')

    @builtins.property
    def view(self) -> typing.Optional[typing.List["BigqueryDatasetAccessView"]]:
        """view block."""
        return self._values.get('view')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetAccess(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigqueryDatasetAccessA(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigqueryDatasetAccessA"):
    def __init__(self, scope: constructs.Construct, id: str, *, dataset_id: str, domain: typing.Optional[str]=None, group_by_email: typing.Optional[str]=None, iam_member: typing.Optional[str]=None, project: typing.Optional[str]=None, role: typing.Optional[str]=None, special_group: typing.Optional[str]=None, timeouts: typing.Optional["BigqueryDatasetAccessTimeouts"]=None, user_by_email: typing.Optional[str]=None, view: typing.Optional[typing.List["BigqueryDatasetAccessViewA"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dataset_id: A unique ID for this dataset, without the project name. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
        :param domain: A domain to grant access to. Any users signed in with the domain specified will be granted the specified access
        :param group_by_email: An email address of a Google Group to grant access to.
        :param iam_member: Some other type of member that appears in the IAM Policy but isn't a user, group, domain, or special group. For example: 'allUsers'
        :param project: 
        :param role: Describes the rights granted to the user specified by the other member of the access object. Primitive, Predefined and custom roles are supported. Predefined roles that have equivalent primitive roles are swapped by the API to their Primitive counterparts, and will show a diff post-create. See `official docs <https://cloud.google.com/bigquery/docs/access-control>`_.
        :param special_group: A special group to grant access to. Possible values include:. 'projectOwners': Owners of the enclosing project. 'projectReaders': Readers of the enclosing project. 'projectWriters': Writers of the enclosing project. 'allAuthenticatedUsers': All authenticated BigQuery users.
        :param timeouts: timeouts block.
        :param user_by_email: An email address of a user to grant access to. For example: fred@example.com
        :param view: view block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigqueryDatasetAccessAConfig(dataset_id=dataset_id, domain=domain, group_by_email=group_by_email, iam_member=iam_member, project=project, role=role, special_group=special_group, timeouts=timeouts, user_by_email=user_by_email, view=view, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigqueryDatasetAccessA, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="datasetId")
    def dataset_id(self) -> str:
        return jsii.get(self, "datasetId")

    @dataset_id.setter
    def dataset_id(self, value: str) -> None:
        jsii.set(self, "datasetId", value)

    @builtins.property
    @jsii.member(jsii_name="domain")
    def domain(self) -> typing.Optional[str]:
        return jsii.get(self, "domain")

    @domain.setter
    def domain(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "domain", value)

    @builtins.property
    @jsii.member(jsii_name="groupByEmail")
    def group_by_email(self) -> typing.Optional[str]:
        return jsii.get(self, "groupByEmail")

    @group_by_email.setter
    def group_by_email(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "groupByEmail", value)

    @builtins.property
    @jsii.member(jsii_name="iamMember")
    def iam_member(self) -> typing.Optional[str]:
        return jsii.get(self, "iamMember")

    @iam_member.setter
    def iam_member(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "iamMember", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> typing.Optional[str]:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="specialGroup")
    def special_group(self) -> typing.Optional[str]:
        return jsii.get(self, "specialGroup")

    @special_group.setter
    def special_group(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "specialGroup", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["BigqueryDatasetAccessTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["BigqueryDatasetAccessTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="userByEmail")
    def user_by_email(self) -> typing.Optional[str]:
        return jsii.get(self, "userByEmail")

    @user_by_email.setter
    def user_by_email(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "userByEmail", value)

    @builtins.property
    @jsii.member(jsii_name="view")
    def view(self) -> typing.Optional[typing.List["BigqueryDatasetAccessViewA"]]:
        return jsii.get(self, "view")

    @view.setter
    def view(self, value: typing.Optional[typing.List["BigqueryDatasetAccessViewA"]]) -> None:
        jsii.set(self, "view", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetAccessAConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dataset_id': 'datasetId', 'domain': 'domain', 'group_by_email': 'groupByEmail', 'iam_member': 'iamMember', 'project': 'project', 'role': 'role', 'special_group': 'specialGroup', 'timeouts': 'timeouts', 'user_by_email': 'userByEmail', 'view': 'view'})
class BigqueryDatasetAccessAConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dataset_id: str, domain: typing.Optional[str]=None, group_by_email: typing.Optional[str]=None, iam_member: typing.Optional[str]=None, project: typing.Optional[str]=None, role: typing.Optional[str]=None, special_group: typing.Optional[str]=None, timeouts: typing.Optional["BigqueryDatasetAccessTimeouts"]=None, user_by_email: typing.Optional[str]=None, view: typing.Optional[typing.List["BigqueryDatasetAccessViewA"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dataset_id: A unique ID for this dataset, without the project name. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
        :param domain: A domain to grant access to. Any users signed in with the domain specified will be granted the specified access
        :param group_by_email: An email address of a Google Group to grant access to.
        :param iam_member: Some other type of member that appears in the IAM Policy but isn't a user, group, domain, or special group. For example: 'allUsers'
        :param project: 
        :param role: Describes the rights granted to the user specified by the other member of the access object. Primitive, Predefined and custom roles are supported. Predefined roles that have equivalent primitive roles are swapped by the API to their Primitive counterparts, and will show a diff post-create. See `official docs <https://cloud.google.com/bigquery/docs/access-control>`_.
        :param special_group: A special group to grant access to. Possible values include:. 'projectOwners': Owners of the enclosing project. 'projectReaders': Readers of the enclosing project. 'projectWriters': Writers of the enclosing project. 'allAuthenticatedUsers': All authenticated BigQuery users.
        :param timeouts: timeouts block.
        :param user_by_email: An email address of a user to grant access to. For example: fred@example.com
        :param view: view block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = BigqueryDatasetAccessTimeouts(**timeouts)
        self._values = {
            'dataset_id': dataset_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if domain is not None: self._values["domain"] = domain
        if group_by_email is not None: self._values["group_by_email"] = group_by_email
        if iam_member is not None: self._values["iam_member"] = iam_member
        if project is not None: self._values["project"] = project
        if role is not None: self._values["role"] = role
        if special_group is not None: self._values["special_group"] = special_group
        if timeouts is not None: self._values["timeouts"] = timeouts
        if user_by_email is not None: self._values["user_by_email"] = user_by_email
        if view is not None: self._values["view"] = view

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dataset_id(self) -> str:
        """A unique ID for this dataset, without the project name.

        The ID
        must contain only letters (a-z, A-Z), numbers (0-9), or
        underscores (_). The maximum length is 1,024 characters.
        """
        return self._values.get('dataset_id')

    @builtins.property
    def domain(self) -> typing.Optional[str]:
        """A domain to grant access to.

        Any users signed in with the
        domain specified will be granted the specified access
        """
        return self._values.get('domain')

    @builtins.property
    def group_by_email(self) -> typing.Optional[str]:
        """An email address of a Google Group to grant access to."""
        return self._values.get('group_by_email')

    @builtins.property
    def iam_member(self) -> typing.Optional[str]:
        """Some other type of member that appears in the IAM Policy but isn't a user, group, domain, or special group.

        For example: 'allUsers'
        """
        return self._values.get('iam_member')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def role(self) -> typing.Optional[str]:
        """Describes the rights granted to the user specified by the other member of the access object.

        Primitive, Predefined and custom
        roles are supported. Predefined roles that have equivalent
        primitive roles are swapped by the API to their Primitive
        counterparts, and will show a diff post-create. See
        `official docs <https://cloud.google.com/bigquery/docs/access-control>`_.
        """
        return self._values.get('role')

    @builtins.property
    def special_group(self) -> typing.Optional[str]:
        """A special group to grant access to. Possible values include:.

        'projectOwners': Owners of the enclosing project.

        'projectReaders': Readers of the enclosing project.

        'projectWriters': Writers of the enclosing project.

        'allAuthenticatedUsers': All authenticated BigQuery users.
        """
        return self._values.get('special_group')

    @builtins.property
    def timeouts(self) -> typing.Optional["BigqueryDatasetAccessTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def user_by_email(self) -> typing.Optional[str]:
        """An email address of a user to grant access to.

        For example:
        fred@example.com
        """
        return self._values.get('user_by_email')

    @builtins.property
    def view(self) -> typing.Optional[typing.List["BigqueryDatasetAccessViewA"]]:
        """view block."""
        return self._values.get('view')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetAccessAConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetAccessTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class BigqueryDatasetAccessTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetAccessTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetAccessView", jsii_struct_bases=[], name_mapping={'dataset_id': 'datasetId', 'project_id': 'projectId', 'table_id': 'tableId'})
class BigqueryDatasetAccessView():
    def __init__(self, *, dataset_id: str, project_id: str, table_id: str) -> None:
        """
        :param dataset_id: The ID of the dataset containing this table.
        :param project_id: The ID of the project containing this table.
        :param table_id: The ID of the table. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
        """
        self._values = {
            'dataset_id': dataset_id,
            'project_id': project_id,
            'table_id': table_id,
        }

    @builtins.property
    def dataset_id(self) -> str:
        """The ID of the dataset containing this table."""
        return self._values.get('dataset_id')

    @builtins.property
    def project_id(self) -> str:
        """The ID of the project containing this table."""
        return self._values.get('project_id')

    @builtins.property
    def table_id(self) -> str:
        """The ID of the table.

        The ID must contain only letters (a-z,
        A-Z), numbers (0-9), or underscores (_). The maximum length
        is 1,024 characters.
        """
        return self._values.get('table_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetAccessView(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetAccessViewA", jsii_struct_bases=[], name_mapping={'dataset_id': 'datasetId', 'project_id': 'projectId', 'table_id': 'tableId'})
class BigqueryDatasetAccessViewA():
    def __init__(self, *, dataset_id: str, project_id: str, table_id: str) -> None:
        """
        :param dataset_id: The ID of the dataset containing this table.
        :param project_id: The ID of the project containing this table.
        :param table_id: The ID of the table. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
        """
        self._values = {
            'dataset_id': dataset_id,
            'project_id': project_id,
            'table_id': table_id,
        }

    @builtins.property
    def dataset_id(self) -> str:
        """The ID of the dataset containing this table."""
        return self._values.get('dataset_id')

    @builtins.property
    def project_id(self) -> str:
        """The ID of the project containing this table."""
        return self._values.get('project_id')

    @builtins.property
    def table_id(self) -> str:
        """The ID of the table.

        The ID must contain only letters (a-z,
        A-Z), numbers (0-9), or underscores (_). The maximum length
        is 1,024 characters.
        """
        return self._values.get('table_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetAccessViewA(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dataset_id': 'datasetId', 'access': 'access', 'default_encryption_configuration': 'defaultEncryptionConfiguration', 'default_partition_expiration_ms': 'defaultPartitionExpirationMs', 'default_table_expiration_ms': 'defaultTableExpirationMs', 'delete_contents_on_destroy': 'deleteContentsOnDestroy', 'description': 'description', 'friendly_name': 'friendlyName', 'labels': 'labels', 'location': 'location', 'project': 'project', 'timeouts': 'timeouts'})
class BigqueryDatasetConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dataset_id: str, access: typing.Optional[typing.List["BigqueryDatasetAccess"]]=None, default_encryption_configuration: typing.Optional[typing.List["BigqueryDatasetDefaultEncryptionConfiguration"]]=None, default_partition_expiration_ms: typing.Optional[jsii.Number]=None, default_table_expiration_ms: typing.Optional[jsii.Number]=None, delete_contents_on_destroy: typing.Optional[bool]=None, description: typing.Optional[str]=None, friendly_name: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["BigqueryDatasetTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dataset_id: A unique ID for this dataset, without the project name. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
        :param access: access block.
        :param default_encryption_configuration: default_encryption_configuration block.
        :param default_partition_expiration_ms: The default partition expiration for all partitioned tables in the dataset, in milliseconds. Once this property is set, all newly-created partitioned tables in the dataset will have an 'expirationMs' property in the 'timePartitioning' settings set to this value, and changing the value will only affect new tables, not existing ones. The storage in a partition will have an expiration time of its partition time plus this value. Setting this property overrides the use of 'defaultTableExpirationMs' for partitioned tables: only one of 'defaultTableExpirationMs' and 'defaultPartitionExpirationMs' will be used for any new partitioned table. If you provide an explicit 'timePartitioning.expirationMs' when creating or updating a partitioned table, that value takes precedence over the default partition expiration time indicated by this property.
        :param default_table_expiration_ms: The default lifetime of all tables in the dataset, in milliseconds. The minimum value is 3600000 milliseconds (one hour). Once this property is set, all newly-created tables in the dataset will have an 'expirationTime' property set to the creation time plus the value in this property, and changing the value will only affect new tables, not existing ones. When the 'expirationTime' for a given table is reached, that table will be deleted automatically. If a table's 'expirationTime' is modified or removed before the table expires, or if you provide an explicit 'expirationTime' when creating a table, that value takes precedence over the default expiration time indicated by this property.
        :param delete_contents_on_destroy: 
        :param description: A user-friendly description of the dataset.
        :param friendly_name: A descriptive name for the dataset.
        :param labels: The labels associated with this dataset. You can use these to organize and group your datasets
        :param location: The geographic location where the dataset should reside. See `official docs <https://cloud.google.com/bigquery/docs/dataset-locations>`_. There are two types of locations, regional or multi-regional. A regional location is a specific geographic place, such as Tokyo, and a multi-regional location is a large geographic area, such as the United States, that contains at least two geographic places. Possible regional values include: 'asia-east1', 'asia-northeast1', 'asia-southeast1', 'australia-southeast1', 'europe-north1', 'europe-west2' and 'us-east4'. Possible multi-regional values: 'EU' and 'US'. The default value is multi-regional location 'US'. Changing this forces a new resource to be created.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = BigqueryDatasetTimeouts(**timeouts)
        self._values = {
            'dataset_id': dataset_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if access is not None: self._values["access"] = access
        if default_encryption_configuration is not None: self._values["default_encryption_configuration"] = default_encryption_configuration
        if default_partition_expiration_ms is not None: self._values["default_partition_expiration_ms"] = default_partition_expiration_ms
        if default_table_expiration_ms is not None: self._values["default_table_expiration_ms"] = default_table_expiration_ms
        if delete_contents_on_destroy is not None: self._values["delete_contents_on_destroy"] = delete_contents_on_destroy
        if description is not None: self._values["description"] = description
        if friendly_name is not None: self._values["friendly_name"] = friendly_name
        if labels is not None: self._values["labels"] = labels
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dataset_id(self) -> str:
        """A unique ID for this dataset, without the project name.

        The ID
        must contain only letters (a-z, A-Z), numbers (0-9), or
        underscores (_). The maximum length is 1,024 characters.
        """
        return self._values.get('dataset_id')

    @builtins.property
    def access(self) -> typing.Optional[typing.List["BigqueryDatasetAccess"]]:
        """access block."""
        return self._values.get('access')

    @builtins.property
    def default_encryption_configuration(self) -> typing.Optional[typing.List["BigqueryDatasetDefaultEncryptionConfiguration"]]:
        """default_encryption_configuration block."""
        return self._values.get('default_encryption_configuration')

    @builtins.property
    def default_partition_expiration_ms(self) -> typing.Optional[jsii.Number]:
        """The default partition expiration for all partitioned tables in the dataset, in milliseconds.

        Once this property is set, all newly-created partitioned tables in
        the dataset will have an 'expirationMs' property in the 'timePartitioning'
        settings set to this value, and changing the value will only
        affect new tables, not existing ones. The storage in a partition will
        have an expiration time of its partition time plus this value.
        Setting this property overrides the use of 'defaultTableExpirationMs'
        for partitioned tables: only one of 'defaultTableExpirationMs' and
        'defaultPartitionExpirationMs' will be used for any new partitioned
        table. If you provide an explicit 'timePartitioning.expirationMs' when
        creating or updating a partitioned table, that value takes precedence
        over the default partition expiration time indicated by this property.
        """
        return self._values.get('default_partition_expiration_ms')

    @builtins.property
    def default_table_expiration_ms(self) -> typing.Optional[jsii.Number]:
        """The default lifetime of all tables in the dataset, in milliseconds. The minimum value is 3600000 milliseconds (one hour).

        Once this property is set, all newly-created tables in the dataset
        will have an 'expirationTime' property set to the creation time plus
        the value in this property, and changing the value will only affect
        new tables, not existing ones. When the 'expirationTime' for a given
        table is reached, that table will be deleted automatically.
        If a table's 'expirationTime' is modified or removed before the
        table expires, or if you provide an explicit 'expirationTime' when
        creating a table, that value takes precedence over the default
        expiration time indicated by this property.
        """
        return self._values.get('default_table_expiration_ms')

    @builtins.property
    def delete_contents_on_destroy(self) -> typing.Optional[bool]:
        return self._values.get('delete_contents_on_destroy')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A user-friendly description of the dataset."""
        return self._values.get('description')

    @builtins.property
    def friendly_name(self) -> typing.Optional[str]:
        """A descriptive name for the dataset."""
        return self._values.get('friendly_name')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """The labels associated with this dataset.

        You can use these to
        organize and group your datasets
        """
        return self._values.get('labels')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """The geographic location where the dataset should reside. See `official docs <https://cloud.google.com/bigquery/docs/dataset-locations>`_.

        There are two types of locations, regional or multi-regional. A regional
        location is a specific geographic place, such as Tokyo, and a multi-regional
        location is a large geographic area, such as the United States, that
        contains at least two geographic places.

        Possible regional values include: 'asia-east1', 'asia-northeast1',
        'asia-southeast1', 'australia-southeast1', 'europe-north1',
        'europe-west2' and 'us-east4'.

        Possible multi-regional values: 'EU' and 'US'.

        The default value is multi-regional location 'US'.
        Changing this forces a new resource to be created.
        """
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["BigqueryDatasetTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetDefaultEncryptionConfiguration", jsii_struct_bases=[], name_mapping={'kms_key_name': 'kmsKeyName'})
class BigqueryDatasetDefaultEncryptionConfiguration():
    def __init__(self, *, kms_key_name: str) -> None:
        """
        :param kms_key_name: Describes the Cloud KMS encryption key that will be used to protect destination BigQuery table. The BigQuery Service Account associated with your project requires access to this encryption key.
        """
        self._values = {
            'kms_key_name': kms_key_name,
        }

    @builtins.property
    def kms_key_name(self) -> str:
        """Describes the Cloud KMS encryption key that will be used to protect destination BigQuery table.

        The BigQuery Service Account associated with your project requires
        access to this encryption key.
        """
        return self._values.get('kms_key_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetDefaultEncryptionConfiguration(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigqueryDatasetIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigqueryDatasetIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, dataset_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["BigqueryDatasetIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dataset_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigqueryDatasetIamBindingConfig(dataset_id=dataset_id, members=members, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigqueryDatasetIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="datasetId")
    def dataset_id(self) -> str:
        return jsii.get(self, "datasetId")

    @dataset_id.setter
    def dataset_id(self, value: str) -> None:
        jsii.set(self, "datasetId", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["BigqueryDatasetIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["BigqueryDatasetIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class BigqueryDatasetIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dataset_id': 'datasetId', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class BigqueryDatasetIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dataset_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["BigqueryDatasetIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dataset_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'dataset_id': dataset_id,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dataset_id(self) -> str:
        return self._values.get('dataset_id')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["BigqueryDatasetIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigqueryDatasetIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigqueryDatasetIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, dataset_id: str, member: str, role: str, condition: typing.Optional[typing.List["BigqueryDatasetIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dataset_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigqueryDatasetIamMemberConfig(dataset_id=dataset_id, member=member, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigqueryDatasetIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="datasetId")
    def dataset_id(self) -> str:
        return jsii.get(self, "datasetId")

    @dataset_id.setter
    def dataset_id(self, value: str) -> None:
        jsii.set(self, "datasetId", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["BigqueryDatasetIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["BigqueryDatasetIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class BigqueryDatasetIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dataset_id': 'datasetId', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class BigqueryDatasetIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dataset_id: str, member: str, role: str, condition: typing.Optional[typing.List["BigqueryDatasetIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dataset_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'dataset_id': dataset_id,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dataset_id(self) -> str:
        return self._values.get('dataset_id')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["BigqueryDatasetIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigqueryDatasetIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigqueryDatasetIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, dataset_id: str, policy_data: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dataset_id: 
        :param policy_data: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigqueryDatasetIamPolicyConfig(dataset_id=dataset_id, policy_data=policy_data, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigqueryDatasetIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="datasetId")
    def dataset_id(self) -> str:
        return jsii.get(self, "datasetId")

    @dataset_id.setter
    def dataset_id(self, value: str) -> None:
        jsii.set(self, "datasetId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dataset_id': 'datasetId', 'policy_data': 'policyData', 'project': 'project'})
class BigqueryDatasetIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dataset_id: str, policy_data: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dataset_id: 
        :param policy_data: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'dataset_id': dataset_id,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dataset_id(self) -> str:
        return self._values.get('dataset_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryDatasetTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class BigqueryDatasetTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryDatasetTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigqueryJob(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigqueryJob"):
    def __init__(self, scope: constructs.Construct, id: str, *, job_id: str, copy: typing.Optional[typing.List["BigqueryJobCopy"]]=None, extract: typing.Optional[typing.List["BigqueryJobExtract"]]=None, job_timeout_ms: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, load: typing.Optional[typing.List["BigqueryJobLoad"]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, query: typing.Optional[typing.List["BigqueryJobQuery"]]=None, timeouts: typing.Optional["BigqueryJobTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param job_id: The ID of the job. The ID must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), or dashes (-). The maximum length is 1,024 characters.
        :param copy: copy block.
        :param extract: extract block.
        :param job_timeout_ms: Job timeout in milliseconds. If this time limit is exceeded, BigQuery may attempt to terminate the job.
        :param labels: The labels associated with this job. You can use these to organize and group your jobs.
        :param load: load block.
        :param location: The geographic location of the job. The default value is US.
        :param project: 
        :param query: query block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigqueryJobConfig(job_id=job_id, copy=copy, extract=extract, job_timeout_ms=job_timeout_ms, labels=labels, load=load, location=location, project=project, query=query, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigqueryJob, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="jobType")
    def job_type(self) -> str:
        return jsii.get(self, "jobType")

    @builtins.property
    @jsii.member(jsii_name="userEmail")
    def user_email(self) -> str:
        return jsii.get(self, "userEmail")

    @builtins.property
    @jsii.member(jsii_name="jobId")
    def job_id(self) -> str:
        return jsii.get(self, "jobId")

    @job_id.setter
    def job_id(self, value: str) -> None:
        jsii.set(self, "jobId", value)

    @builtins.property
    @jsii.member(jsii_name="copy")
    def copy(self) -> typing.Optional[typing.List["BigqueryJobCopy"]]:
        return jsii.get(self, "copy")

    @copy.setter
    def copy(self, value: typing.Optional[typing.List["BigqueryJobCopy"]]) -> None:
        jsii.set(self, "copy", value)

    @builtins.property
    @jsii.member(jsii_name="extract")
    def extract(self) -> typing.Optional[typing.List["BigqueryJobExtract"]]:
        return jsii.get(self, "extract")

    @extract.setter
    def extract(self, value: typing.Optional[typing.List["BigqueryJobExtract"]]) -> None:
        jsii.set(self, "extract", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="jobTimeoutMs")
    def job_timeout_ms(self) -> typing.Optional[str]:
        return jsii.get(self, "jobTimeoutMs")

    @job_timeout_ms.setter
    def job_timeout_ms(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "jobTimeoutMs", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="load")
    def load(self) -> typing.Optional[typing.List["BigqueryJobLoad"]]:
        return jsii.get(self, "load")

    @load.setter
    def load(self, value: typing.Optional[typing.List["BigqueryJobLoad"]]) -> None:
        jsii.set(self, "load", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="query")
    def query(self) -> typing.Optional[typing.List["BigqueryJobQuery"]]:
        return jsii.get(self, "query")

    @query.setter
    def query(self, value: typing.Optional[typing.List["BigqueryJobQuery"]]) -> None:
        jsii.set(self, "query", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["BigqueryJobTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["BigqueryJobTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'job_id': 'jobId', 'copy': 'copy', 'extract': 'extract', 'job_timeout_ms': 'jobTimeoutMs', 'labels': 'labels', 'load': 'load', 'location': 'location', 'project': 'project', 'query': 'query', 'timeouts': 'timeouts'})
class BigqueryJobConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, job_id: str, copy: typing.Optional[typing.List["BigqueryJobCopy"]]=None, extract: typing.Optional[typing.List["BigqueryJobExtract"]]=None, job_timeout_ms: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, load: typing.Optional[typing.List["BigqueryJobLoad"]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, query: typing.Optional[typing.List["BigqueryJobQuery"]]=None, timeouts: typing.Optional["BigqueryJobTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param job_id: The ID of the job. The ID must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), or dashes (-). The maximum length is 1,024 characters.
        :param copy: copy block.
        :param extract: extract block.
        :param job_timeout_ms: Job timeout in milliseconds. If this time limit is exceeded, BigQuery may attempt to terminate the job.
        :param labels: The labels associated with this job. You can use these to organize and group your jobs.
        :param load: load block.
        :param location: The geographic location of the job. The default value is US.
        :param project: 
        :param query: query block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = BigqueryJobTimeouts(**timeouts)
        self._values = {
            'job_id': job_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if copy is not None: self._values["copy"] = copy
        if extract is not None: self._values["extract"] = extract
        if job_timeout_ms is not None: self._values["job_timeout_ms"] = job_timeout_ms
        if labels is not None: self._values["labels"] = labels
        if load is not None: self._values["load"] = load
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project
        if query is not None: self._values["query"] = query
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def job_id(self) -> str:
        """The ID of the job.

        The ID must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), or dashes (-). The maximum length is 1,024 characters.
        """
        return self._values.get('job_id')

    @builtins.property
    def copy(self) -> typing.Optional[typing.List["BigqueryJobCopy"]]:
        """copy block."""
        return self._values.get('copy')

    @builtins.property
    def extract(self) -> typing.Optional[typing.List["BigqueryJobExtract"]]:
        """extract block."""
        return self._values.get('extract')

    @builtins.property
    def job_timeout_ms(self) -> typing.Optional[str]:
        """Job timeout in milliseconds.

        If this time limit is exceeded, BigQuery may attempt to terminate the job.
        """
        return self._values.get('job_timeout_ms')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """The labels associated with this job.

        You can use these to organize and group your jobs.
        """
        return self._values.get('labels')

    @builtins.property
    def load(self) -> typing.Optional[typing.List["BigqueryJobLoad"]]:
        """load block."""
        return self._values.get('load')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """The geographic location of the job.

        The default value is US.
        """
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def query(self) -> typing.Optional[typing.List["BigqueryJobQuery"]]:
        """query block."""
        return self._values.get('query')

    @builtins.property
    def timeouts(self) -> typing.Optional["BigqueryJobTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobCopy", jsii_struct_bases=[], name_mapping={'source_tables': 'sourceTables', 'create_disposition': 'createDisposition', 'destination_encryption_configuration': 'destinationEncryptionConfiguration', 'destination_table': 'destinationTable', 'write_disposition': 'writeDisposition'})
class BigqueryJobCopy():
    def __init__(self, *, source_tables: typing.List["BigqueryJobCopySourceTables"], create_disposition: typing.Optional[str]=None, destination_encryption_configuration: typing.Optional[typing.List["BigqueryJobCopyDestinationEncryptionConfiguration"]]=None, destination_table: typing.Optional[typing.List["BigqueryJobCopyDestinationTable"]]=None, write_disposition: typing.Optional[str]=None) -> None:
        """
        :param source_tables: source_tables block.
        :param create_disposition: Specifies whether the job is allowed to create new tables. The following values are supported: CREATE_IF_NEEDED: If the table does not exist, BigQuery creates the table. CREATE_NEVER: The table must already exist. If it does not, a 'notFound' error is returned in the job result. Creation, truncation and append actions occur as one atomic update upon job completion Default value: "CREATE_IF_NEEDED" Possible values: ["CREATE_IF_NEEDED", "CREATE_NEVER"]
        :param destination_encryption_configuration: destination_encryption_configuration block.
        :param destination_table: destination_table block.
        :param write_disposition: Specifies the action that occurs if the destination table already exists. The following values are supported: WRITE_TRUNCATE: If the table already exists, BigQuery overwrites the table data and uses the schema from the query result. WRITE_APPEND: If the table already exists, BigQuery appends the data to the table. WRITE_EMPTY: If the table already exists and contains data, a 'duplicate' error is returned in the job result. Each action is atomic and only occurs if BigQuery is able to complete the job successfully. Creation, truncation and append actions occur as one atomic update upon job completion. Default value: "WRITE_EMPTY" Possible values: ["WRITE_TRUNCATE", "WRITE_APPEND", "WRITE_EMPTY"]
        """
        self._values = {
            'source_tables': source_tables,
        }
        if create_disposition is not None: self._values["create_disposition"] = create_disposition
        if destination_encryption_configuration is not None: self._values["destination_encryption_configuration"] = destination_encryption_configuration
        if destination_table is not None: self._values["destination_table"] = destination_table
        if write_disposition is not None: self._values["write_disposition"] = write_disposition

    @builtins.property
    def source_tables(self) -> typing.List["BigqueryJobCopySourceTables"]:
        """source_tables block."""
        return self._values.get('source_tables')

    @builtins.property
    def create_disposition(self) -> typing.Optional[str]:
        """Specifies whether the job is allowed to create new tables.

        The following values are supported:
        CREATE_IF_NEEDED: If the table does not exist, BigQuery creates the table.
        CREATE_NEVER: The table must already exist. If it does not, a 'notFound' error is returned in the job result.
        Creation, truncation and append actions occur as one atomic update upon job completion Default value: "CREATE_IF_NEEDED" Possible values: ["CREATE_IF_NEEDED", "CREATE_NEVER"]
        """
        return self._values.get('create_disposition')

    @builtins.property
    def destination_encryption_configuration(self) -> typing.Optional[typing.List["BigqueryJobCopyDestinationEncryptionConfiguration"]]:
        """destination_encryption_configuration block."""
        return self._values.get('destination_encryption_configuration')

    @builtins.property
    def destination_table(self) -> typing.Optional[typing.List["BigqueryJobCopyDestinationTable"]]:
        """destination_table block."""
        return self._values.get('destination_table')

    @builtins.property
    def write_disposition(self) -> typing.Optional[str]:
        """Specifies the action that occurs if the destination table already exists.

        The following values are supported:
        WRITE_TRUNCATE: If the table already exists, BigQuery overwrites the table data and uses the schema from the query result.
        WRITE_APPEND: If the table already exists, BigQuery appends the data to the table.
        WRITE_EMPTY: If the table already exists and contains data, a 'duplicate' error is returned in the job result.
        Each action is atomic and only occurs if BigQuery is able to complete the job successfully.
        Creation, truncation and append actions occur as one atomic update upon job completion. Default value: "WRITE_EMPTY" Possible values: ["WRITE_TRUNCATE", "WRITE_APPEND", "WRITE_EMPTY"]
        """
        return self._values.get('write_disposition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobCopy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobCopyDestinationEncryptionConfiguration", jsii_struct_bases=[], name_mapping={'kms_key_name': 'kmsKeyName'})
class BigqueryJobCopyDestinationEncryptionConfiguration():
    def __init__(self, *, kms_key_name: str) -> None:
        """
        :param kms_key_name: Describes the Cloud KMS encryption key that will be used to protect destination BigQuery table. The BigQuery Service Account associated with your project requires access to this encryption key.
        """
        self._values = {
            'kms_key_name': kms_key_name,
        }

    @builtins.property
    def kms_key_name(self) -> str:
        """Describes the Cloud KMS encryption key that will be used to protect destination BigQuery table.

        The BigQuery Service Account associated with your project requires access to this encryption key.
        """
        return self._values.get('kms_key_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobCopyDestinationEncryptionConfiguration(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobCopyDestinationTable", jsii_struct_bases=[], name_mapping={'table_id': 'tableId', 'dataset_id': 'datasetId', 'project_id': 'projectId'})
class BigqueryJobCopyDestinationTable():
    def __init__(self, *, table_id: str, dataset_id: typing.Optional[str]=None, project_id: typing.Optional[str]=None) -> None:
        """
        :param table_id: The table. Can be specified '{{table_id}}' if 'project_id' and 'dataset_id' are also set, or of the form 'projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}}' if not.
        :param dataset_id: The ID of the dataset containing this table.
        :param project_id: The ID of the project containing this table.
        """
        self._values = {
            'table_id': table_id,
        }
        if dataset_id is not None: self._values["dataset_id"] = dataset_id
        if project_id is not None: self._values["project_id"] = project_id

    @builtins.property
    def table_id(self) -> str:
        """The table.

        Can be specified '{{table_id}}' if 'project_id' and 'dataset_id' are also set,
        or of the form 'projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}}' if not.
        """
        return self._values.get('table_id')

    @builtins.property
    def dataset_id(self) -> typing.Optional[str]:
        """The ID of the dataset containing this table."""
        return self._values.get('dataset_id')

    @builtins.property
    def project_id(self) -> typing.Optional[str]:
        """The ID of the project containing this table."""
        return self._values.get('project_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobCopyDestinationTable(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobCopySourceTables", jsii_struct_bases=[], name_mapping={'table_id': 'tableId', 'dataset_id': 'datasetId', 'project_id': 'projectId'})
class BigqueryJobCopySourceTables():
    def __init__(self, *, table_id: str, dataset_id: typing.Optional[str]=None, project_id: typing.Optional[str]=None) -> None:
        """
        :param table_id: The table. Can be specified '{{table_id}}' if 'project_id' and 'dataset_id' are also set, or of the form 'projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}}' if not.
        :param dataset_id: The ID of the dataset containing this table.
        :param project_id: The ID of the project containing this table.
        """
        self._values = {
            'table_id': table_id,
        }
        if dataset_id is not None: self._values["dataset_id"] = dataset_id
        if project_id is not None: self._values["project_id"] = project_id

    @builtins.property
    def table_id(self) -> str:
        """The table.

        Can be specified '{{table_id}}' if 'project_id' and 'dataset_id' are also set,
        or of the form 'projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}}' if not.
        """
        return self._values.get('table_id')

    @builtins.property
    def dataset_id(self) -> typing.Optional[str]:
        """The ID of the dataset containing this table."""
        return self._values.get('dataset_id')

    @builtins.property
    def project_id(self) -> typing.Optional[str]:
        """The ID of the project containing this table."""
        return self._values.get('project_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobCopySourceTables(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobExtract", jsii_struct_bases=[], name_mapping={'destination_uris': 'destinationUris', 'compression': 'compression', 'destination_format': 'destinationFormat', 'field_delimiter': 'fieldDelimiter', 'print_header': 'printHeader', 'source_model': 'sourceModel', 'source_table': 'sourceTable', 'use_avro_logical_types': 'useAvroLogicalTypes'})
class BigqueryJobExtract():
    def __init__(self, *, destination_uris: typing.List[str], compression: typing.Optional[str]=None, destination_format: typing.Optional[str]=None, field_delimiter: typing.Optional[str]=None, print_header: typing.Optional[bool]=None, source_model: typing.Optional[typing.List["BigqueryJobExtractSourceModel"]]=None, source_table: typing.Optional[typing.List["BigqueryJobExtractSourceTable"]]=None, use_avro_logical_types: typing.Optional[bool]=None) -> None:
        """
        :param destination_uris: A list of fully-qualified Google Cloud Storage URIs where the extracted table should be written.
        :param compression: The compression type to use for exported files. Possible values include GZIP, DEFLATE, SNAPPY, and NONE. The default value is NONE. DEFLATE and SNAPPY are only supported for Avro.
        :param destination_format: The exported file format. Possible values include CSV, NEWLINE_DELIMITED_JSON and AVRO for tables and SAVED_MODEL for models. The default value for tables is CSV. Tables with nested or repeated fields cannot be exported as CSV. The default value for models is SAVED_MODEL.
        :param field_delimiter: When extracting data in CSV format, this defines the delimiter to use between fields in the exported data. Default is ','
        :param print_header: Whether to print out a header row in the results. Default is true.
        :param source_model: source_model block.
        :param source_table: source_table block.
        :param use_avro_logical_types: Whether to use logical types when extracting to AVRO format.
        """
        self._values = {
            'destination_uris': destination_uris,
        }
        if compression is not None: self._values["compression"] = compression
        if destination_format is not None: self._values["destination_format"] = destination_format
        if field_delimiter is not None: self._values["field_delimiter"] = field_delimiter
        if print_header is not None: self._values["print_header"] = print_header
        if source_model is not None: self._values["source_model"] = source_model
        if source_table is not None: self._values["source_table"] = source_table
        if use_avro_logical_types is not None: self._values["use_avro_logical_types"] = use_avro_logical_types

    @builtins.property
    def destination_uris(self) -> typing.List[str]:
        """A list of fully-qualified Google Cloud Storage URIs where the extracted table should be written."""
        return self._values.get('destination_uris')

    @builtins.property
    def compression(self) -> typing.Optional[str]:
        """The compression type to use for exported files.

        Possible values include GZIP, DEFLATE, SNAPPY, and NONE.
        The default value is NONE. DEFLATE and SNAPPY are only supported for Avro.
        """
        return self._values.get('compression')

    @builtins.property
    def destination_format(self) -> typing.Optional[str]:
        """The exported file format.

        Possible values include CSV, NEWLINE_DELIMITED_JSON and AVRO for tables and SAVED_MODEL for models.
        The default value for tables is CSV. Tables with nested or repeated fields cannot be exported as CSV.
        The default value for models is SAVED_MODEL.
        """
        return self._values.get('destination_format')

    @builtins.property
    def field_delimiter(self) -> typing.Optional[str]:
        """When extracting data in CSV format, this defines the delimiter to use between fields in the exported data.

        Default is ','
        """
        return self._values.get('field_delimiter')

    @builtins.property
    def print_header(self) -> typing.Optional[bool]:
        """Whether to print out a header row in the results.

        Default is true.
        """
        return self._values.get('print_header')

    @builtins.property
    def source_model(self) -> typing.Optional[typing.List["BigqueryJobExtractSourceModel"]]:
        """source_model block."""
        return self._values.get('source_model')

    @builtins.property
    def source_table(self) -> typing.Optional[typing.List["BigqueryJobExtractSourceTable"]]:
        """source_table block."""
        return self._values.get('source_table')

    @builtins.property
    def use_avro_logical_types(self) -> typing.Optional[bool]:
        """Whether to use logical types when extracting to AVRO format."""
        return self._values.get('use_avro_logical_types')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobExtract(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobExtractSourceModel", jsii_struct_bases=[], name_mapping={'dataset_id': 'datasetId', 'model_id': 'modelId', 'project_id': 'projectId'})
class BigqueryJobExtractSourceModel():
    def __init__(self, *, dataset_id: str, model_id: str, project_id: str) -> None:
        """
        :param dataset_id: The ID of the dataset containing this model.
        :param model_id: The ID of the model.
        :param project_id: The ID of the project containing this model.
        """
        self._values = {
            'dataset_id': dataset_id,
            'model_id': model_id,
            'project_id': project_id,
        }

    @builtins.property
    def dataset_id(self) -> str:
        """The ID of the dataset containing this model."""
        return self._values.get('dataset_id')

    @builtins.property
    def model_id(self) -> str:
        """The ID of the model."""
        return self._values.get('model_id')

    @builtins.property
    def project_id(self) -> str:
        """The ID of the project containing this model."""
        return self._values.get('project_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobExtractSourceModel(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobExtractSourceTable", jsii_struct_bases=[], name_mapping={'table_id': 'tableId', 'dataset_id': 'datasetId', 'project_id': 'projectId'})
class BigqueryJobExtractSourceTable():
    def __init__(self, *, table_id: str, dataset_id: typing.Optional[str]=None, project_id: typing.Optional[str]=None) -> None:
        """
        :param table_id: The table. Can be specified '{{table_id}}' if 'project_id' and 'dataset_id' are also set, or of the form 'projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}}' if not.
        :param dataset_id: The ID of the dataset containing this table.
        :param project_id: The ID of the project containing this table.
        """
        self._values = {
            'table_id': table_id,
        }
        if dataset_id is not None: self._values["dataset_id"] = dataset_id
        if project_id is not None: self._values["project_id"] = project_id

    @builtins.property
    def table_id(self) -> str:
        """The table.

        Can be specified '{{table_id}}' if 'project_id' and 'dataset_id' are also set,
        or of the form 'projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}}' if not.
        """
        return self._values.get('table_id')

    @builtins.property
    def dataset_id(self) -> typing.Optional[str]:
        """The ID of the dataset containing this table."""
        return self._values.get('dataset_id')

    @builtins.property
    def project_id(self) -> typing.Optional[str]:
        """The ID of the project containing this table."""
        return self._values.get('project_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobExtractSourceTable(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobLoad", jsii_struct_bases=[], name_mapping={'destination_table': 'destinationTable', 'source_uris': 'sourceUris', 'allow_jagged_rows': 'allowJaggedRows', 'allow_quoted_newlines': 'allowQuotedNewlines', 'autodetect': 'autodetect', 'create_disposition': 'createDisposition', 'destination_encryption_configuration': 'destinationEncryptionConfiguration', 'encoding': 'encoding', 'field_delimiter': 'fieldDelimiter', 'ignore_unknown_values': 'ignoreUnknownValues', 'max_bad_records': 'maxBadRecords', 'null_marker': 'nullMarker', 'projection_fields': 'projectionFields', 'quote': 'quote', 'schema_update_options': 'schemaUpdateOptions', 'skip_leading_rows': 'skipLeadingRows', 'source_format': 'sourceFormat', 'time_partitioning': 'timePartitioning', 'write_disposition': 'writeDisposition'})
class BigqueryJobLoad():
    def __init__(self, *, destination_table: typing.List["BigqueryJobLoadDestinationTable"], source_uris: typing.List[str], allow_jagged_rows: typing.Optional[bool]=None, allow_quoted_newlines: typing.Optional[bool]=None, autodetect: typing.Optional[bool]=None, create_disposition: typing.Optional[str]=None, destination_encryption_configuration: typing.Optional[typing.List["BigqueryJobLoadDestinationEncryptionConfiguration"]]=None, encoding: typing.Optional[str]=None, field_delimiter: typing.Optional[str]=None, ignore_unknown_values: typing.Optional[bool]=None, max_bad_records: typing.Optional[jsii.Number]=None, null_marker: typing.Optional[str]=None, projection_fields: typing.Optional[typing.List[str]]=None, quote: typing.Optional[str]=None, schema_update_options: typing.Optional[typing.List[str]]=None, skip_leading_rows: typing.Optional[jsii.Number]=None, source_format: typing.Optional[str]=None, time_partitioning: typing.Optional[typing.List["BigqueryJobLoadTimePartitioning"]]=None, write_disposition: typing.Optional[str]=None) -> None:
        """
        :param destination_table: destination_table block.
        :param source_uris: The fully-qualified URIs that point to your data in Google Cloud. For Google Cloud Storage URIs: Each URI can contain one '*' wildcard character and it must come after the 'bucket' name. Size limits related to load jobs apply to external data sources. For Google Cloud Bigtable URIs: Exactly one URI can be specified and it has be a fully specified and valid HTTPS URL for a Google Cloud Bigtable table. For Google Cloud Datastore backups: Exactly one URI can be specified. Also, the '*' wildcard character is not allowed.
        :param allow_jagged_rows: Accept rows that are missing trailing optional columns. The missing values are treated as nulls. If false, records with missing trailing columns are treated as bad records, and if there are too many bad records, an invalid error is returned in the job result. The default value is false. Only applicable to CSV, ignored for other formats.
        :param allow_quoted_newlines: Indicates if BigQuery should allow quoted data sections that contain newline characters in a CSV file. The default value is false.
        :param autodetect: Indicates if we should automatically infer the options and schema for CSV and JSON sources.
        :param create_disposition: Specifies whether the job is allowed to create new tables. The following values are supported: CREATE_IF_NEEDED: If the table does not exist, BigQuery creates the table. CREATE_NEVER: The table must already exist. If it does not, a 'notFound' error is returned in the job result. Creation, truncation and append actions occur as one atomic update upon job completion Default value: "CREATE_IF_NEEDED" Possible values: ["CREATE_IF_NEEDED", "CREATE_NEVER"]
        :param destination_encryption_configuration: destination_encryption_configuration block.
        :param encoding: The character encoding of the data. The supported values are UTF-8 or ISO-8859-1. The default value is UTF-8. BigQuery decodes the data after the raw, binary data has been split using the values of the quote and fieldDelimiter properties.
        :param field_delimiter: The separator for fields in a CSV file. The separator can be any ISO-8859-1 single-byte character. To use a character in the range 128-255, you must encode the character as UTF8. BigQuery converts the string to ISO-8859-1 encoding, and then uses the first byte of the encoded string to split the data in its raw, binary state. BigQuery also supports the escape sequence "\t" to specify a tab separator. The default value is a comma (',').
        :param ignore_unknown_values: Indicates if BigQuery should allow extra values that are not represented in the table schema. If true, the extra values are ignored. If false, records with extra columns are treated as bad records, and if there are too many bad records, an invalid error is returned in the job result. The default value is false. The sourceFormat property determines what BigQuery treats as an extra value: CSV: Trailing columns JSON: Named values that don't match any column names
        :param max_bad_records: The maximum number of bad records that BigQuery can ignore when running the job. If the number of bad records exceeds this value, an invalid error is returned in the job result. The default value is 0, which requires that all records are valid.
        :param null_marker: Specifies a string that represents a null value in a CSV file. For example, if you specify "\N", BigQuery interprets "\N" as a null value when loading a CSV file. The default value is the empty string. If you set this property to a custom value, BigQuery throws an error if an empty string is present for all data types except for STRING and BYTE. For STRING and BYTE columns, BigQuery interprets the empty string as an empty value.
        :param projection_fields: If sourceFormat is set to "DATASTORE_BACKUP", indicates which entity properties to load into BigQuery from a Cloud Datastore backup. Property names are case sensitive and must be top-level properties. If no properties are specified, BigQuery loads all properties. If any named property isn't found in the Cloud Datastore backup, an invalid error is returned in the job result.
        :param quote: The value that is used to quote data sections in a CSV file. BigQuery converts the string to ISO-8859-1 encoding, and then uses the first byte of the encoded string to split the data in its raw, binary state. The default value is a double-quote ('"'). If your data does not contain quoted sections, set the property value to an empty string. If your data contains quoted newline characters, you must also set the allowQuotedNewlines property to true.
        :param schema_update_options: Allows the schema of the destination table to be updated as a side effect of the load job if a schema is autodetected or supplied in the job configuration. Schema update options are supported in two cases: when writeDisposition is WRITE_APPEND; when writeDisposition is WRITE_TRUNCATE and the destination table is a partition of a table, specified by partition decorators. For normal tables, WRITE_TRUNCATE will always overwrite the schema. One or more of the following values are specified: ALLOW_FIELD_ADDITION: allow adding a nullable field to the schema. ALLOW_FIELD_RELAXATION: allow relaxing a required field in the original schema to nullable.
        :param skip_leading_rows: The number of rows at the top of a CSV file that BigQuery will skip when loading the data. The default value is 0. This property is useful if you have header rows in the file that should be skipped. When autodetect is on, the behavior is the following: skipLeadingRows unspecified - Autodetect tries to detect headers in the first row. If they are not detected, the row is read as data. Otherwise data is read starting from the second row. skipLeadingRows is 0 - Instructs autodetect that there are no headers and data should be read starting from the first row. skipLeadingRows = N > 0 - Autodetect skips N-1 rows and tries to detect headers in row N. If headers are not detected, row N is just skipped. Otherwise row N is used to extract column names for the detected schema.
        :param source_format: The format of the data files. For CSV files, specify "CSV". For datastore backups, specify "DATASTORE_BACKUP". For newline-delimited JSON, specify "NEWLINE_DELIMITED_JSON". For Avro, specify "AVRO". For parquet, specify "PARQUET". For orc, specify "ORC". The default value is CSV.
        :param time_partitioning: time_partitioning block.
        :param write_disposition: Specifies the action that occurs if the destination table already exists. The following values are supported: WRITE_TRUNCATE: If the table already exists, BigQuery overwrites the table data and uses the schema from the query result. WRITE_APPEND: If the table already exists, BigQuery appends the data to the table. WRITE_EMPTY: If the table already exists and contains data, a 'duplicate' error is returned in the job result. Each action is atomic and only occurs if BigQuery is able to complete the job successfully. Creation, truncation and append actions occur as one atomic update upon job completion. Default value: "WRITE_EMPTY" Possible values: ["WRITE_TRUNCATE", "WRITE_APPEND", "WRITE_EMPTY"]
        """
        self._values = {
            'destination_table': destination_table,
            'source_uris': source_uris,
        }
        if allow_jagged_rows is not None: self._values["allow_jagged_rows"] = allow_jagged_rows
        if allow_quoted_newlines is not None: self._values["allow_quoted_newlines"] = allow_quoted_newlines
        if autodetect is not None: self._values["autodetect"] = autodetect
        if create_disposition is not None: self._values["create_disposition"] = create_disposition
        if destination_encryption_configuration is not None: self._values["destination_encryption_configuration"] = destination_encryption_configuration
        if encoding is not None: self._values["encoding"] = encoding
        if field_delimiter is not None: self._values["field_delimiter"] = field_delimiter
        if ignore_unknown_values is not None: self._values["ignore_unknown_values"] = ignore_unknown_values
        if max_bad_records is not None: self._values["max_bad_records"] = max_bad_records
        if null_marker is not None: self._values["null_marker"] = null_marker
        if projection_fields is not None: self._values["projection_fields"] = projection_fields
        if quote is not None: self._values["quote"] = quote
        if schema_update_options is not None: self._values["schema_update_options"] = schema_update_options
        if skip_leading_rows is not None: self._values["skip_leading_rows"] = skip_leading_rows
        if source_format is not None: self._values["source_format"] = source_format
        if time_partitioning is not None: self._values["time_partitioning"] = time_partitioning
        if write_disposition is not None: self._values["write_disposition"] = write_disposition

    @builtins.property
    def destination_table(self) -> typing.List["BigqueryJobLoadDestinationTable"]:
        """destination_table block."""
        return self._values.get('destination_table')

    @builtins.property
    def source_uris(self) -> typing.List[str]:
        """The fully-qualified URIs that point to your data in Google Cloud.

        For Google Cloud Storage URIs: Each URI can contain one '*' wildcard character
        and it must come after the 'bucket' name. Size limits related to load jobs apply
        to external data sources. For Google Cloud Bigtable URIs: Exactly one URI can be
        specified and it has be a fully specified and valid HTTPS URL for a Google Cloud Bigtable table.
        For Google Cloud Datastore backups: Exactly one URI can be specified. Also, the '*' wildcard character is not allowed.
        """
        return self._values.get('source_uris')

    @builtins.property
    def allow_jagged_rows(self) -> typing.Optional[bool]:
        """Accept rows that are missing trailing optional columns.

        The missing values are treated as nulls.
        If false, records with missing trailing columns are treated as bad records, and if there are too many bad records,
        an invalid error is returned in the job result. The default value is false. Only applicable to CSV, ignored for other formats.
        """
        return self._values.get('allow_jagged_rows')

    @builtins.property
    def allow_quoted_newlines(self) -> typing.Optional[bool]:
        """Indicates if BigQuery should allow quoted data sections that contain newline characters in a CSV file.

        The default value is false.
        """
        return self._values.get('allow_quoted_newlines')

    @builtins.property
    def autodetect(self) -> typing.Optional[bool]:
        """Indicates if we should automatically infer the options and schema for CSV and JSON sources."""
        return self._values.get('autodetect')

    @builtins.property
    def create_disposition(self) -> typing.Optional[str]:
        """Specifies whether the job is allowed to create new tables.

        The following values are supported:
        CREATE_IF_NEEDED: If the table does not exist, BigQuery creates the table.
        CREATE_NEVER: The table must already exist. If it does not, a 'notFound' error is returned in the job result.
        Creation, truncation and append actions occur as one atomic update upon job completion Default value: "CREATE_IF_NEEDED" Possible values: ["CREATE_IF_NEEDED", "CREATE_NEVER"]
        """
        return self._values.get('create_disposition')

    @builtins.property
    def destination_encryption_configuration(self) -> typing.Optional[typing.List["BigqueryJobLoadDestinationEncryptionConfiguration"]]:
        """destination_encryption_configuration block."""
        return self._values.get('destination_encryption_configuration')

    @builtins.property
    def encoding(self) -> typing.Optional[str]:
        """The character encoding of the data.

        The supported values are UTF-8 or ISO-8859-1.
        The default value is UTF-8. BigQuery decodes the data after the raw, binary data
        has been split using the values of the quote and fieldDelimiter properties.
        """
        return self._values.get('encoding')

    @builtins.property
    def field_delimiter(self) -> typing.Optional[str]:
        """The separator for fields in a CSV file.

        The separator can be any ISO-8859-1 single-byte character.
        To use a character in the range 128-255, you must encode the character as UTF8. BigQuery converts
        the string to ISO-8859-1 encoding, and then uses the first byte of the encoded string to split the
        data in its raw, binary state. BigQuery also supports the escape sequence "\t" to specify a tab separator.
        The default value is a comma (',').
        """
        return self._values.get('field_delimiter')

    @builtins.property
    def ignore_unknown_values(self) -> typing.Optional[bool]:
        """Indicates if BigQuery should allow extra values that are not represented in the table schema.

        If true, the extra values are ignored. If false, records with extra columns are treated as bad records,
        and if there are too many bad records, an invalid error is returned in the job result.
        The default value is false. The sourceFormat property determines what BigQuery treats as an extra value:
        CSV: Trailing columns
        JSON: Named values that don't match any column names
        """
        return self._values.get('ignore_unknown_values')

    @builtins.property
    def max_bad_records(self) -> typing.Optional[jsii.Number]:
        """The maximum number of bad records that BigQuery can ignore when running the job.

        If the number of bad records exceeds this value,
        an invalid error is returned in the job result. The default value is 0, which requires that all records are valid.
        """
        return self._values.get('max_bad_records')

    @builtins.property
    def null_marker(self) -> typing.Optional[str]:
        """Specifies a string that represents a null value in a CSV file.

        For example, if you specify "\N", BigQuery interprets "\N" as a null value
        when loading a CSV file. The default value is the empty string. If you set this property to a custom value, BigQuery throws an error if an
        empty string is present for all data types except for STRING and BYTE. For STRING and BYTE columns, BigQuery interprets the empty string as
        an empty value.
        """
        return self._values.get('null_marker')

    @builtins.property
    def projection_fields(self) -> typing.Optional[typing.List[str]]:
        """If sourceFormat is set to "DATASTORE_BACKUP", indicates which entity properties to load into BigQuery from a Cloud Datastore backup.

        Property names are case sensitive and must be top-level properties. If no properties are specified, BigQuery loads all properties.
        If any named property isn't found in the Cloud Datastore backup, an invalid error is returned in the job result.
        """
        return self._values.get('projection_fields')

    @builtins.property
    def quote(self) -> typing.Optional[str]:
        """The value that is used to quote data sections in a CSV file.

        BigQuery converts the string to ISO-8859-1 encoding,
        and then uses the first byte of the encoded string to split the data in its raw, binary state.
        The default value is a double-quote ('"'). If your data does not contain quoted sections, set the property value to an empty string.
        If your data contains quoted newline characters, you must also set the allowQuotedNewlines property to true.
        """
        return self._values.get('quote')

    @builtins.property
    def schema_update_options(self) -> typing.Optional[typing.List[str]]:
        """Allows the schema of the destination table to be updated as a side effect of the load job if a schema is autodetected or supplied in the job configuration.

        Schema update options are supported in two cases: when writeDisposition is WRITE_APPEND;
        when writeDisposition is WRITE_TRUNCATE and the destination table is a partition of a table, specified by partition decorators.
        For normal tables, WRITE_TRUNCATE will always overwrite the schema. One or more of the following values are specified:
        ALLOW_FIELD_ADDITION: allow adding a nullable field to the schema.
        ALLOW_FIELD_RELAXATION: allow relaxing a required field in the original schema to nullable.
        """
        return self._values.get('schema_update_options')

    @builtins.property
    def skip_leading_rows(self) -> typing.Optional[jsii.Number]:
        """The number of rows at the top of a CSV file that BigQuery will skip when loading the data.

        The default value is 0. This property is useful if you have header rows in the file that should be skipped.
        When autodetect is on, the behavior is the following:
        skipLeadingRows unspecified - Autodetect tries to detect headers in the first row. If they are not detected,
        the row is read as data. Otherwise data is read starting from the second row.
        skipLeadingRows is 0 - Instructs autodetect that there are no headers and data should be read starting from the first row.
        skipLeadingRows = N > 0 - Autodetect skips N-1 rows and tries to detect headers in row N. If headers are not detected,
        row N is just skipped. Otherwise row N is used to extract column names for the detected schema.
        """
        return self._values.get('skip_leading_rows')

    @builtins.property
    def source_format(self) -> typing.Optional[str]:
        """The format of the data files.

        For CSV files, specify "CSV". For datastore backups, specify "DATASTORE_BACKUP".
        For newline-delimited JSON, specify "NEWLINE_DELIMITED_JSON". For Avro, specify "AVRO". For parquet, specify "PARQUET".
        For orc, specify "ORC". The default value is CSV.
        """
        return self._values.get('source_format')

    @builtins.property
    def time_partitioning(self) -> typing.Optional[typing.List["BigqueryJobLoadTimePartitioning"]]:
        """time_partitioning block."""
        return self._values.get('time_partitioning')

    @builtins.property
    def write_disposition(self) -> typing.Optional[str]:
        """Specifies the action that occurs if the destination table already exists.

        The following values are supported:
        WRITE_TRUNCATE: If the table already exists, BigQuery overwrites the table data and uses the schema from the query result.
        WRITE_APPEND: If the table already exists, BigQuery appends the data to the table.
        WRITE_EMPTY: If the table already exists and contains data, a 'duplicate' error is returned in the job result.
        Each action is atomic and only occurs if BigQuery is able to complete the job successfully.
        Creation, truncation and append actions occur as one atomic update upon job completion. Default value: "WRITE_EMPTY" Possible values: ["WRITE_TRUNCATE", "WRITE_APPEND", "WRITE_EMPTY"]
        """
        return self._values.get('write_disposition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobLoad(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobLoadDestinationEncryptionConfiguration", jsii_struct_bases=[], name_mapping={'kms_key_name': 'kmsKeyName'})
class BigqueryJobLoadDestinationEncryptionConfiguration():
    def __init__(self, *, kms_key_name: str) -> None:
        """
        :param kms_key_name: Describes the Cloud KMS encryption key that will be used to protect destination BigQuery table. The BigQuery Service Account associated with your project requires access to this encryption key.
        """
        self._values = {
            'kms_key_name': kms_key_name,
        }

    @builtins.property
    def kms_key_name(self) -> str:
        """Describes the Cloud KMS encryption key that will be used to protect destination BigQuery table.

        The BigQuery Service Account associated with your project requires access to this encryption key.
        """
        return self._values.get('kms_key_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobLoadDestinationEncryptionConfiguration(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobLoadDestinationTable", jsii_struct_bases=[], name_mapping={'table_id': 'tableId', 'dataset_id': 'datasetId', 'project_id': 'projectId'})
class BigqueryJobLoadDestinationTable():
    def __init__(self, *, table_id: str, dataset_id: typing.Optional[str]=None, project_id: typing.Optional[str]=None) -> None:
        """
        :param table_id: The table. Can be specified '{{table_id}}' if 'project_id' and 'dataset_id' are also set, or of the form 'projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}}' if not.
        :param dataset_id: The ID of the dataset containing this table.
        :param project_id: The ID of the project containing this table.
        """
        self._values = {
            'table_id': table_id,
        }
        if dataset_id is not None: self._values["dataset_id"] = dataset_id
        if project_id is not None: self._values["project_id"] = project_id

    @builtins.property
    def table_id(self) -> str:
        """The table.

        Can be specified '{{table_id}}' if 'project_id' and 'dataset_id' are also set,
        or of the form 'projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}}' if not.
        """
        return self._values.get('table_id')

    @builtins.property
    def dataset_id(self) -> typing.Optional[str]:
        """The ID of the dataset containing this table."""
        return self._values.get('dataset_id')

    @builtins.property
    def project_id(self) -> typing.Optional[str]:
        """The ID of the project containing this table."""
        return self._values.get('project_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobLoadDestinationTable(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobLoadTimePartitioning", jsii_struct_bases=[], name_mapping={'type': 'type', 'expiration_ms': 'expirationMs', 'field': 'field'})
class BigqueryJobLoadTimePartitioning():
    def __init__(self, *, type: str, expiration_ms: typing.Optional[str]=None, field: typing.Optional[str]=None) -> None:
        """
        :param type: The only type supported is DAY, which will generate one partition per day. Providing an empty string used to cause an error, but in OnePlatform the field will be treated as unset.
        :param expiration_ms: Number of milliseconds for which to keep the storage for a partition. A wrapper is used here because 0 is an invalid value.
        :param field: If not set, the table is partitioned by pseudo column '_PARTITIONTIME'; if set, the table is partitioned by this field. The field must be a top-level TIMESTAMP or DATE field. Its mode must be NULLABLE or REQUIRED. A wrapper is used here because an empty string is an invalid value.
        """
        self._values = {
            'type': type,
        }
        if expiration_ms is not None: self._values["expiration_ms"] = expiration_ms
        if field is not None: self._values["field"] = field

    @builtins.property
    def type(self) -> str:
        """The only type supported is DAY, which will generate one partition per day.

        Providing an empty string used to cause an error,
        but in OnePlatform the field will be treated as unset.
        """
        return self._values.get('type')

    @builtins.property
    def expiration_ms(self) -> typing.Optional[str]:
        """Number of milliseconds for which to keep the storage for a partition.

        A wrapper is used here because 0 is an invalid value.
        """
        return self._values.get('expiration_ms')

    @builtins.property
    def field(self) -> typing.Optional[str]:
        """If not set, the table is partitioned by pseudo column '_PARTITIONTIME';

        if set, the table is partitioned by this field.
        The field must be a top-level TIMESTAMP or DATE field. Its mode must be NULLABLE or REQUIRED.
        A wrapper is used here because an empty string is an invalid value.
        """
        return self._values.get('field')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobLoadTimePartitioning(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobQuery", jsii_struct_bases=[], name_mapping={'query': 'query', 'allow_large_results': 'allowLargeResults', 'create_disposition': 'createDisposition', 'default_dataset': 'defaultDataset', 'destination_encryption_configuration': 'destinationEncryptionConfiguration', 'destination_table': 'destinationTable', 'flatten_results': 'flattenResults', 'maximum_billing_tier': 'maximumBillingTier', 'maximum_bytes_billed': 'maximumBytesBilled', 'parameter_mode': 'parameterMode', 'priority': 'priority', 'schema_update_options': 'schemaUpdateOptions', 'script_options': 'scriptOptions', 'use_legacy_sql': 'useLegacySql', 'use_query_cache': 'useQueryCache', 'user_defined_function_resources': 'userDefinedFunctionResources', 'write_disposition': 'writeDisposition'})
class BigqueryJobQuery():
    def __init__(self, *, query: str, allow_large_results: typing.Optional[bool]=None, create_disposition: typing.Optional[str]=None, default_dataset: typing.Optional[typing.List["BigqueryJobQueryDefaultDataset"]]=None, destination_encryption_configuration: typing.Optional[typing.List["BigqueryJobQueryDestinationEncryptionConfiguration"]]=None, destination_table: typing.Optional[typing.List["BigqueryJobQueryDestinationTable"]]=None, flatten_results: typing.Optional[bool]=None, maximum_billing_tier: typing.Optional[jsii.Number]=None, maximum_bytes_billed: typing.Optional[str]=None, parameter_mode: typing.Optional[str]=None, priority: typing.Optional[str]=None, schema_update_options: typing.Optional[typing.List[str]]=None, script_options: typing.Optional[typing.List["BigqueryJobQueryScriptOptions"]]=None, use_legacy_sql: typing.Optional[bool]=None, use_query_cache: typing.Optional[bool]=None, user_defined_function_resources: typing.Optional[typing.List["BigqueryJobQueryUserDefinedFunctionResources"]]=None, write_disposition: typing.Optional[str]=None) -> None:
        """
        :param query: SQL query text to execute. The useLegacySql field can be used to indicate whether the query uses legacy SQL or standard SQL.
        :param allow_large_results: If true and query uses legacy SQL dialect, allows the query to produce arbitrarily large result tables at a slight cost in performance. Requires destinationTable to be set. For standard SQL queries, this flag is ignored and large results are always allowed. However, you must still set destinationTable when result size exceeds the allowed maximum response size.
        :param create_disposition: Specifies whether the job is allowed to create new tables. The following values are supported: CREATE_IF_NEEDED: If the table does not exist, BigQuery creates the table. CREATE_NEVER: The table must already exist. If it does not, a 'notFound' error is returned in the job result. Creation, truncation and append actions occur as one atomic update upon job completion Default value: "CREATE_IF_NEEDED" Possible values: ["CREATE_IF_NEEDED", "CREATE_NEVER"]
        :param default_dataset: default_dataset block.
        :param destination_encryption_configuration: destination_encryption_configuration block.
        :param destination_table: destination_table block.
        :param flatten_results: If true and query uses legacy SQL dialect, flattens all nested and repeated fields in the query results. allowLargeResults must be true if this is set to false. For standard SQL queries, this flag is ignored and results are never flattened.
        :param maximum_billing_tier: Limits the billing tier for this job. Queries that have resource usage beyond this tier will fail (without incurring a charge). If unspecified, this will be set to your project default.
        :param maximum_bytes_billed: Limits the bytes billed for this job. Queries that will have bytes billed beyond this limit will fail (without incurring a charge). If unspecified, this will be set to your project default.
        :param parameter_mode: Standard SQL only. Set to POSITIONAL to use positional (?) query parameters or to NAMED to use named (@myparam) query parameters in this query.
        :param priority: Specifies a priority for the query. Default value: "INTERACTIVE" Possible values: ["INTERACTIVE", "BATCH"]
        :param schema_update_options: Allows the schema of the destination table to be updated as a side effect of the query job. Schema update options are supported in two cases: when writeDisposition is WRITE_APPEND; when writeDisposition is WRITE_TRUNCATE and the destination table is a partition of a table, specified by partition decorators. For normal tables, WRITE_TRUNCATE will always overwrite the schema. One or more of the following values are specified: ALLOW_FIELD_ADDITION: allow adding a nullable field to the schema. ALLOW_FIELD_RELAXATION: allow relaxing a required field in the original schema to nullable.
        :param script_options: script_options block.
        :param use_legacy_sql: Specifies whether to use BigQuery's legacy SQL dialect for this query. The default value is true. If set to false, the query will use BigQuery's standard SQL.
        :param use_query_cache: Whether to look for the result in the query cache. The query cache is a best-effort cache that will be flushed whenever tables in the query are modified. Moreover, the query cache is only available when a query does not have a destination table specified. The default value is true.
        :param user_defined_function_resources: user_defined_function_resources block.
        :param write_disposition: Specifies the action that occurs if the destination table already exists. The following values are supported: WRITE_TRUNCATE: If the table already exists, BigQuery overwrites the table data and uses the schema from the query result. WRITE_APPEND: If the table already exists, BigQuery appends the data to the table. WRITE_EMPTY: If the table already exists and contains data, a 'duplicate' error is returned in the job result. Each action is atomic and only occurs if BigQuery is able to complete the job successfully. Creation, truncation and append actions occur as one atomic update upon job completion. Default value: "WRITE_EMPTY" Possible values: ["WRITE_TRUNCATE", "WRITE_APPEND", "WRITE_EMPTY"]
        """
        self._values = {
            'query': query,
        }
        if allow_large_results is not None: self._values["allow_large_results"] = allow_large_results
        if create_disposition is not None: self._values["create_disposition"] = create_disposition
        if default_dataset is not None: self._values["default_dataset"] = default_dataset
        if destination_encryption_configuration is not None: self._values["destination_encryption_configuration"] = destination_encryption_configuration
        if destination_table is not None: self._values["destination_table"] = destination_table
        if flatten_results is not None: self._values["flatten_results"] = flatten_results
        if maximum_billing_tier is not None: self._values["maximum_billing_tier"] = maximum_billing_tier
        if maximum_bytes_billed is not None: self._values["maximum_bytes_billed"] = maximum_bytes_billed
        if parameter_mode is not None: self._values["parameter_mode"] = parameter_mode
        if priority is not None: self._values["priority"] = priority
        if schema_update_options is not None: self._values["schema_update_options"] = schema_update_options
        if script_options is not None: self._values["script_options"] = script_options
        if use_legacy_sql is not None: self._values["use_legacy_sql"] = use_legacy_sql
        if use_query_cache is not None: self._values["use_query_cache"] = use_query_cache
        if user_defined_function_resources is not None: self._values["user_defined_function_resources"] = user_defined_function_resources
        if write_disposition is not None: self._values["write_disposition"] = write_disposition

    @builtins.property
    def query(self) -> str:
        """SQL query text to execute.

        The useLegacySql field can be used to indicate whether the query uses legacy SQL or standard SQL.
        """
        return self._values.get('query')

    @builtins.property
    def allow_large_results(self) -> typing.Optional[bool]:
        """If true and query uses legacy SQL dialect, allows the query to produce arbitrarily large result tables at a slight cost in performance.

        Requires destinationTable to be set. For standard SQL queries, this flag is ignored and large results are always allowed.
        However, you must still set destinationTable when result size exceeds the allowed maximum response size.
        """
        return self._values.get('allow_large_results')

    @builtins.property
    def create_disposition(self) -> typing.Optional[str]:
        """Specifies whether the job is allowed to create new tables.

        The following values are supported:
        CREATE_IF_NEEDED: If the table does not exist, BigQuery creates the table.
        CREATE_NEVER: The table must already exist. If it does not, a 'notFound' error is returned in the job result.
        Creation, truncation and append actions occur as one atomic update upon job completion Default value: "CREATE_IF_NEEDED" Possible values: ["CREATE_IF_NEEDED", "CREATE_NEVER"]
        """
        return self._values.get('create_disposition')

    @builtins.property
    def default_dataset(self) -> typing.Optional[typing.List["BigqueryJobQueryDefaultDataset"]]:
        """default_dataset block."""
        return self._values.get('default_dataset')

    @builtins.property
    def destination_encryption_configuration(self) -> typing.Optional[typing.List["BigqueryJobQueryDestinationEncryptionConfiguration"]]:
        """destination_encryption_configuration block."""
        return self._values.get('destination_encryption_configuration')

    @builtins.property
    def destination_table(self) -> typing.Optional[typing.List["BigqueryJobQueryDestinationTable"]]:
        """destination_table block."""
        return self._values.get('destination_table')

    @builtins.property
    def flatten_results(self) -> typing.Optional[bool]:
        """If true and query uses legacy SQL dialect, flattens all nested and repeated fields in the query results.

        allowLargeResults must be true if this is set to false. For standard SQL queries, this flag is ignored and results are never flattened.
        """
        return self._values.get('flatten_results')

    @builtins.property
    def maximum_billing_tier(self) -> typing.Optional[jsii.Number]:
        """Limits the billing tier for this job.

        Queries that have resource usage beyond this tier will fail (without incurring a charge).
        If unspecified, this will be set to your project default.
        """
        return self._values.get('maximum_billing_tier')

    @builtins.property
    def maximum_bytes_billed(self) -> typing.Optional[str]:
        """Limits the bytes billed for this job.

        Queries that will have bytes billed beyond this limit will fail (without incurring a charge).
        If unspecified, this will be set to your project default.
        """
        return self._values.get('maximum_bytes_billed')

    @builtins.property
    def parameter_mode(self) -> typing.Optional[str]:
        """Standard SQL only.

        Set to POSITIONAL to use positional (?) query parameters or to NAMED to use named (@myparam) query parameters in this query.
        """
        return self._values.get('parameter_mode')

    @builtins.property
    def priority(self) -> typing.Optional[str]:
        """Specifies a priority for the query.

        Default value: "INTERACTIVE" Possible values: ["INTERACTIVE", "BATCH"]
        """
        return self._values.get('priority')

    @builtins.property
    def schema_update_options(self) -> typing.Optional[typing.List[str]]:
        """Allows the schema of the destination table to be updated as a side effect of the query job.

        Schema update options are supported in two cases: when writeDisposition is WRITE_APPEND;
        when writeDisposition is WRITE_TRUNCATE and the destination table is a partition of a table,
        specified by partition decorators. For normal tables, WRITE_TRUNCATE will always overwrite the schema.
        One or more of the following values are specified:
        ALLOW_FIELD_ADDITION: allow adding a nullable field to the schema.
        ALLOW_FIELD_RELAXATION: allow relaxing a required field in the original schema to nullable.
        """
        return self._values.get('schema_update_options')

    @builtins.property
    def script_options(self) -> typing.Optional[typing.List["BigqueryJobQueryScriptOptions"]]:
        """script_options block."""
        return self._values.get('script_options')

    @builtins.property
    def use_legacy_sql(self) -> typing.Optional[bool]:
        """Specifies whether to use BigQuery's legacy SQL dialect for this query.

        The default value is true.
        If set to false, the query will use BigQuery's standard SQL.
        """
        return self._values.get('use_legacy_sql')

    @builtins.property
    def use_query_cache(self) -> typing.Optional[bool]:
        """Whether to look for the result in the query cache.

        The query cache is a best-effort cache that will be flushed whenever
        tables in the query are modified. Moreover, the query cache is only available when a query does not have a destination table specified.
        The default value is true.
        """
        return self._values.get('use_query_cache')

    @builtins.property
    def user_defined_function_resources(self) -> typing.Optional[typing.List["BigqueryJobQueryUserDefinedFunctionResources"]]:
        """user_defined_function_resources block."""
        return self._values.get('user_defined_function_resources')

    @builtins.property
    def write_disposition(self) -> typing.Optional[str]:
        """Specifies the action that occurs if the destination table already exists.

        The following values are supported:
        WRITE_TRUNCATE: If the table already exists, BigQuery overwrites the table data and uses the schema from the query result.
        WRITE_APPEND: If the table already exists, BigQuery appends the data to the table.
        WRITE_EMPTY: If the table already exists and contains data, a 'duplicate' error is returned in the job result.
        Each action is atomic and only occurs if BigQuery is able to complete the job successfully.
        Creation, truncation and append actions occur as one atomic update upon job completion. Default value: "WRITE_EMPTY" Possible values: ["WRITE_TRUNCATE", "WRITE_APPEND", "WRITE_EMPTY"]
        """
        return self._values.get('write_disposition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobQuery(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobQueryDefaultDataset", jsii_struct_bases=[], name_mapping={'dataset_id': 'datasetId', 'project_id': 'projectId'})
class BigqueryJobQueryDefaultDataset():
    def __init__(self, *, dataset_id: str, project_id: typing.Optional[str]=None) -> None:
        """
        :param dataset_id: The dataset. Can be specified '{{dataset_id}}' if 'project_id' is also set, or of the form 'projects/{{project}}/datasets/{{dataset_id}}' if not.
        :param project_id: The ID of the project containing this table.
        """
        self._values = {
            'dataset_id': dataset_id,
        }
        if project_id is not None: self._values["project_id"] = project_id

    @builtins.property
    def dataset_id(self) -> str:
        """The dataset.

        Can be specified '{{dataset_id}}' if 'project_id' is also set,
        or of the form 'projects/{{project}}/datasets/{{dataset_id}}' if not.
        """
        return self._values.get('dataset_id')

    @builtins.property
    def project_id(self) -> typing.Optional[str]:
        """The ID of the project containing this table."""
        return self._values.get('project_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobQueryDefaultDataset(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobQueryDestinationEncryptionConfiguration", jsii_struct_bases=[], name_mapping={'kms_key_name': 'kmsKeyName'})
class BigqueryJobQueryDestinationEncryptionConfiguration():
    def __init__(self, *, kms_key_name: str) -> None:
        """
        :param kms_key_name: Describes the Cloud KMS encryption key that will be used to protect destination BigQuery table. The BigQuery Service Account associated with your project requires access to this encryption key.
        """
        self._values = {
            'kms_key_name': kms_key_name,
        }

    @builtins.property
    def kms_key_name(self) -> str:
        """Describes the Cloud KMS encryption key that will be used to protect destination BigQuery table.

        The BigQuery Service Account associated with your project requires access to this encryption key.
        """
        return self._values.get('kms_key_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobQueryDestinationEncryptionConfiguration(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobQueryDestinationTable", jsii_struct_bases=[], name_mapping={'table_id': 'tableId', 'dataset_id': 'datasetId', 'project_id': 'projectId'})
class BigqueryJobQueryDestinationTable():
    def __init__(self, *, table_id: str, dataset_id: typing.Optional[str]=None, project_id: typing.Optional[str]=None) -> None:
        """
        :param table_id: The table. Can be specified '{{table_id}}' if 'project_id' and 'dataset_id' are also set, or of the form 'projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}}' if not.
        :param dataset_id: The ID of the dataset containing this table.
        :param project_id: The ID of the project containing this table.
        """
        self._values = {
            'table_id': table_id,
        }
        if dataset_id is not None: self._values["dataset_id"] = dataset_id
        if project_id is not None: self._values["project_id"] = project_id

    @builtins.property
    def table_id(self) -> str:
        """The table.

        Can be specified '{{table_id}}' if 'project_id' and 'dataset_id' are also set,
        or of the form 'projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}}' if not.
        """
        return self._values.get('table_id')

    @builtins.property
    def dataset_id(self) -> typing.Optional[str]:
        """The ID of the dataset containing this table."""
        return self._values.get('dataset_id')

    @builtins.property
    def project_id(self) -> typing.Optional[str]:
        """The ID of the project containing this table."""
        return self._values.get('project_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobQueryDestinationTable(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobQueryScriptOptions", jsii_struct_bases=[], name_mapping={'key_result_statement': 'keyResultStatement', 'statement_byte_budget': 'statementByteBudget', 'statement_timeout_ms': 'statementTimeoutMs'})
class BigqueryJobQueryScriptOptions():
    def __init__(self, *, key_result_statement: typing.Optional[str]=None, statement_byte_budget: typing.Optional[str]=None, statement_timeout_ms: typing.Optional[str]=None) -> None:
        """
        :param key_result_statement: Determines which statement in the script represents the "key result", used to populate the schema and query results of the script job. Possible values: ["LAST", "FIRST_SELECT"]
        :param statement_byte_budget: Limit on the number of bytes billed per statement. Exceeding this budget results in an error.
        :param statement_timeout_ms: Timeout period for each statement in a script.
        """
        self._values = {
        }
        if key_result_statement is not None: self._values["key_result_statement"] = key_result_statement
        if statement_byte_budget is not None: self._values["statement_byte_budget"] = statement_byte_budget
        if statement_timeout_ms is not None: self._values["statement_timeout_ms"] = statement_timeout_ms

    @builtins.property
    def key_result_statement(self) -> typing.Optional[str]:
        """Determines which statement in the script represents the "key result", used to populate the schema and query results of the script job.

        Possible values: ["LAST", "FIRST_SELECT"]
        """
        return self._values.get('key_result_statement')

    @builtins.property
    def statement_byte_budget(self) -> typing.Optional[str]:
        """Limit on the number of bytes billed per statement.

        Exceeding this budget results in an error.
        """
        return self._values.get('statement_byte_budget')

    @builtins.property
    def statement_timeout_ms(self) -> typing.Optional[str]:
        """Timeout period for each statement in a script."""
        return self._values.get('statement_timeout_ms')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobQueryScriptOptions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobQueryUserDefinedFunctionResources", jsii_struct_bases=[], name_mapping={'inline_code': 'inlineCode', 'resource_uri': 'resourceUri'})
class BigqueryJobQueryUserDefinedFunctionResources():
    def __init__(self, *, inline_code: typing.Optional[str]=None, resource_uri: typing.Optional[str]=None) -> None:
        """
        :param inline_code: An inline resource that contains code for a user-defined function (UDF). Providing a inline code resource is equivalent to providing a URI for a file containing the same code.
        :param resource_uri: A code resource to load from a Google Cloud Storage URI (gs://bucket/path).
        """
        self._values = {
        }
        if inline_code is not None: self._values["inline_code"] = inline_code
        if resource_uri is not None: self._values["resource_uri"] = resource_uri

    @builtins.property
    def inline_code(self) -> typing.Optional[str]:
        """An inline resource that contains code for a user-defined function (UDF).

        Providing a inline code resource is equivalent to providing a URI for a file containing the same code.
        """
        return self._values.get('inline_code')

    @builtins.property
    def resource_uri(self) -> typing.Optional[str]:
        """A code resource to load from a Google Cloud Storage URI (gs://bucket/path)."""
        return self._values.get('resource_uri')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobQueryUserDefinedFunctionResources(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryJobTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class BigqueryJobTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryJobTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigqueryTable(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigqueryTable"):
    def __init__(self, scope: constructs.Construct, id: str, *, dataset_id: str, table_id: str, clustering: typing.Optional[typing.List[str]]=None, description: typing.Optional[str]=None, encryption_configuration: typing.Optional[typing.List["BigqueryTableEncryptionConfiguration"]]=None, expiration_time: typing.Optional[jsii.Number]=None, external_data_configuration: typing.Optional[typing.List["BigqueryTableExternalDataConfiguration"]]=None, friendly_name: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, range_partitioning: typing.Optional[typing.List["BigqueryTableRangePartitioning"]]=None, schema: typing.Optional[str]=None, time_partitioning: typing.Optional[typing.List["BigqueryTableTimePartitioning"]]=None, view: typing.Optional[typing.List["BigqueryTableView"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dataset_id: The dataset ID to create the table in. Changing this forces a new resource to be created.
        :param table_id: A unique ID for the resource. Changing this forces a new resource to be created.
        :param clustering: Specifies column names to use for data clustering. Up to four top-level columns are allowed, and should be specified in descending priority order.
        :param description: The field description.
        :param encryption_configuration: encryption_configuration block.
        :param expiration_time: The time when this table expires, in milliseconds since the epoch. If not present, the table will persist indefinitely. Expired tables will be deleted and their storage reclaimed.
        :param external_data_configuration: external_data_configuration block.
        :param friendly_name: A descriptive name for the table.
        :param labels: A mapping of labels to assign to the resource.
        :param project: The ID of the project in which the resource belongs.
        :param range_partitioning: range_partitioning block.
        :param schema: A JSON schema for the table.
        :param time_partitioning: time_partitioning block.
        :param view: view block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigqueryTableConfig(dataset_id=dataset_id, table_id=table_id, clustering=clustering, description=description, encryption_configuration=encryption_configuration, expiration_time=expiration_time, external_data_configuration=external_data_configuration, friendly_name=friendly_name, labels=labels, project=project, range_partitioning=range_partitioning, schema=schema, time_partitioning=time_partitioning, view=view, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigqueryTable, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTime")
    def creation_time(self) -> jsii.Number:
        return jsii.get(self, "creationTime")

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="lastModifiedTime")
    def last_modified_time(self) -> jsii.Number:
        return jsii.get(self, "lastModifiedTime")

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @builtins.property
    @jsii.member(jsii_name="numBytes")
    def num_bytes(self) -> jsii.Number:
        return jsii.get(self, "numBytes")

    @builtins.property
    @jsii.member(jsii_name="numLongTermBytes")
    def num_long_term_bytes(self) -> jsii.Number:
        return jsii.get(self, "numLongTermBytes")

    @builtins.property
    @jsii.member(jsii_name="numRows")
    def num_rows(self) -> jsii.Number:
        return jsii.get(self, "numRows")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")

    @builtins.property
    @jsii.member(jsii_name="datasetId")
    def dataset_id(self) -> str:
        return jsii.get(self, "datasetId")

    @dataset_id.setter
    def dataset_id(self, value: str) -> None:
        jsii.set(self, "datasetId", value)

    @builtins.property
    @jsii.member(jsii_name="tableId")
    def table_id(self) -> str:
        return jsii.get(self, "tableId")

    @table_id.setter
    def table_id(self, value: str) -> None:
        jsii.set(self, "tableId", value)

    @builtins.property
    @jsii.member(jsii_name="clustering")
    def clustering(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "clustering")

    @clustering.setter
    def clustering(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "clustering", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="encryptionConfiguration")
    def encryption_configuration(self) -> typing.Optional[typing.List["BigqueryTableEncryptionConfiguration"]]:
        return jsii.get(self, "encryptionConfiguration")

    @encryption_configuration.setter
    def encryption_configuration(self, value: typing.Optional[typing.List["BigqueryTableEncryptionConfiguration"]]) -> None:
        jsii.set(self, "encryptionConfiguration", value)

    @builtins.property
    @jsii.member(jsii_name="expirationTime")
    def expiration_time(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "expirationTime")

    @expiration_time.setter
    def expiration_time(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "expirationTime", value)

    @builtins.property
    @jsii.member(jsii_name="externalDataConfiguration")
    def external_data_configuration(self) -> typing.Optional[typing.List["BigqueryTableExternalDataConfiguration"]]:
        return jsii.get(self, "externalDataConfiguration")

    @external_data_configuration.setter
    def external_data_configuration(self, value: typing.Optional[typing.List["BigqueryTableExternalDataConfiguration"]]) -> None:
        jsii.set(self, "externalDataConfiguration", value)

    @builtins.property
    @jsii.member(jsii_name="friendlyName")
    def friendly_name(self) -> typing.Optional[str]:
        return jsii.get(self, "friendlyName")

    @friendly_name.setter
    def friendly_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "friendlyName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="rangePartitioning")
    def range_partitioning(self) -> typing.Optional[typing.List["BigqueryTableRangePartitioning"]]:
        return jsii.get(self, "rangePartitioning")

    @range_partitioning.setter
    def range_partitioning(self, value: typing.Optional[typing.List["BigqueryTableRangePartitioning"]]) -> None:
        jsii.set(self, "rangePartitioning", value)

    @builtins.property
    @jsii.member(jsii_name="schema")
    def schema(self) -> typing.Optional[str]:
        return jsii.get(self, "schema")

    @schema.setter
    def schema(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "schema", value)

    @builtins.property
    @jsii.member(jsii_name="timePartitioning")
    def time_partitioning(self) -> typing.Optional[typing.List["BigqueryTableTimePartitioning"]]:
        return jsii.get(self, "timePartitioning")

    @time_partitioning.setter
    def time_partitioning(self, value: typing.Optional[typing.List["BigqueryTableTimePartitioning"]]) -> None:
        jsii.set(self, "timePartitioning", value)

    @builtins.property
    @jsii.member(jsii_name="view")
    def view(self) -> typing.Optional[typing.List["BigqueryTableView"]]:
        return jsii.get(self, "view")

    @view.setter
    def view(self, value: typing.Optional[typing.List["BigqueryTableView"]]) -> None:
        jsii.set(self, "view", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryTableConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dataset_id': 'datasetId', 'table_id': 'tableId', 'clustering': 'clustering', 'description': 'description', 'encryption_configuration': 'encryptionConfiguration', 'expiration_time': 'expirationTime', 'external_data_configuration': 'externalDataConfiguration', 'friendly_name': 'friendlyName', 'labels': 'labels', 'project': 'project', 'range_partitioning': 'rangePartitioning', 'schema': 'schema', 'time_partitioning': 'timePartitioning', 'view': 'view'})
class BigqueryTableConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dataset_id: str, table_id: str, clustering: typing.Optional[typing.List[str]]=None, description: typing.Optional[str]=None, encryption_configuration: typing.Optional[typing.List["BigqueryTableEncryptionConfiguration"]]=None, expiration_time: typing.Optional[jsii.Number]=None, external_data_configuration: typing.Optional[typing.List["BigqueryTableExternalDataConfiguration"]]=None, friendly_name: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, range_partitioning: typing.Optional[typing.List["BigqueryTableRangePartitioning"]]=None, schema: typing.Optional[str]=None, time_partitioning: typing.Optional[typing.List["BigqueryTableTimePartitioning"]]=None, view: typing.Optional[typing.List["BigqueryTableView"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dataset_id: The dataset ID to create the table in. Changing this forces a new resource to be created.
        :param table_id: A unique ID for the resource. Changing this forces a new resource to be created.
        :param clustering: Specifies column names to use for data clustering. Up to four top-level columns are allowed, and should be specified in descending priority order.
        :param description: The field description.
        :param encryption_configuration: encryption_configuration block.
        :param expiration_time: The time when this table expires, in milliseconds since the epoch. If not present, the table will persist indefinitely. Expired tables will be deleted and their storage reclaimed.
        :param external_data_configuration: external_data_configuration block.
        :param friendly_name: A descriptive name for the table.
        :param labels: A mapping of labels to assign to the resource.
        :param project: The ID of the project in which the resource belongs.
        :param range_partitioning: range_partitioning block.
        :param schema: A JSON schema for the table.
        :param time_partitioning: time_partitioning block.
        :param view: view block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'dataset_id': dataset_id,
            'table_id': table_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if clustering is not None: self._values["clustering"] = clustering
        if description is not None: self._values["description"] = description
        if encryption_configuration is not None: self._values["encryption_configuration"] = encryption_configuration
        if expiration_time is not None: self._values["expiration_time"] = expiration_time
        if external_data_configuration is not None: self._values["external_data_configuration"] = external_data_configuration
        if friendly_name is not None: self._values["friendly_name"] = friendly_name
        if labels is not None: self._values["labels"] = labels
        if project is not None: self._values["project"] = project
        if range_partitioning is not None: self._values["range_partitioning"] = range_partitioning
        if schema is not None: self._values["schema"] = schema
        if time_partitioning is not None: self._values["time_partitioning"] = time_partitioning
        if view is not None: self._values["view"] = view

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dataset_id(self) -> str:
        """The dataset ID to create the table in.

        Changing this forces a new resource to be created.
        """
        return self._values.get('dataset_id')

    @builtins.property
    def table_id(self) -> str:
        """A unique ID for the resource.

        Changing this forces a new resource to be created.
        """
        return self._values.get('table_id')

    @builtins.property
    def clustering(self) -> typing.Optional[typing.List[str]]:
        """Specifies column names to use for data clustering.

        Up to four top-level columns are allowed, and should be specified in descending priority order.
        """
        return self._values.get('clustering')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """The field description."""
        return self._values.get('description')

    @builtins.property
    def encryption_configuration(self) -> typing.Optional[typing.List["BigqueryTableEncryptionConfiguration"]]:
        """encryption_configuration block."""
        return self._values.get('encryption_configuration')

    @builtins.property
    def expiration_time(self) -> typing.Optional[jsii.Number]:
        """The time when this table expires, in milliseconds since the epoch.

        If not present, the table will persist indefinitely. Expired tables will be deleted and their storage reclaimed.
        """
        return self._values.get('expiration_time')

    @builtins.property
    def external_data_configuration(self) -> typing.Optional[typing.List["BigqueryTableExternalDataConfiguration"]]:
        """external_data_configuration block."""
        return self._values.get('external_data_configuration')

    @builtins.property
    def friendly_name(self) -> typing.Optional[str]:
        """A descriptive name for the table."""
        return self._values.get('friendly_name')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A mapping of labels to assign to the resource."""
        return self._values.get('labels')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs."""
        return self._values.get('project')

    @builtins.property
    def range_partitioning(self) -> typing.Optional[typing.List["BigqueryTableRangePartitioning"]]:
        """range_partitioning block."""
        return self._values.get('range_partitioning')

    @builtins.property
    def schema(self) -> typing.Optional[str]:
        """A JSON schema for the table."""
        return self._values.get('schema')

    @builtins.property
    def time_partitioning(self) -> typing.Optional[typing.List["BigqueryTableTimePartitioning"]]:
        """time_partitioning block."""
        return self._values.get('time_partitioning')

    @builtins.property
    def view(self) -> typing.Optional[typing.List["BigqueryTableView"]]:
        """view block."""
        return self._values.get('view')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryTableConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryTableEncryptionConfiguration", jsii_struct_bases=[], name_mapping={'kms_key_name': 'kmsKeyName'})
class BigqueryTableEncryptionConfiguration():
    def __init__(self, *, kms_key_name: str) -> None:
        """
        :param kms_key_name: The self link or full name of a key which should be used to encrypt this table. Note that the default bigquery service account will need to have encrypt/decrypt permissions on this key - you may want to see the google_bigquery_default_service_account datasource and the google_kms_crypto_key_iam_binding resource.
        """
        self._values = {
            'kms_key_name': kms_key_name,
        }

    @builtins.property
    def kms_key_name(self) -> str:
        """The self link or full name of a key which should be used to encrypt this table.

        Note that the default bigquery service account will need to have encrypt/decrypt permissions on this key - you may want to see the google_bigquery_default_service_account datasource and the google_kms_crypto_key_iam_binding resource.
        """
        return self._values.get('kms_key_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryTableEncryptionConfiguration(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryTableExternalDataConfiguration", jsii_struct_bases=[], name_mapping={'autodetect': 'autodetect', 'source_format': 'sourceFormat', 'source_uris': 'sourceUris', 'compression': 'compression', 'csv_options': 'csvOptions', 'google_sheets_options': 'googleSheetsOptions', 'hive_partitioning_options': 'hivePartitioningOptions', 'ignore_unknown_values': 'ignoreUnknownValues', 'max_bad_records': 'maxBadRecords', 'schema': 'schema'})
class BigqueryTableExternalDataConfiguration():
    def __init__(self, *, autodetect: bool, source_format: str, source_uris: typing.List[str], compression: typing.Optional[str]=None, csv_options: typing.Optional[typing.List["BigqueryTableExternalDataConfigurationCsvOptions"]]=None, google_sheets_options: typing.Optional[typing.List["BigqueryTableExternalDataConfigurationGoogleSheetsOptions"]]=None, hive_partitioning_options: typing.Optional[typing.List["BigqueryTableExternalDataConfigurationHivePartitioningOptions"]]=None, ignore_unknown_values: typing.Optional[bool]=None, max_bad_records: typing.Optional[jsii.Number]=None, schema: typing.Optional[str]=None) -> None:
        """
        :param autodetect: Let BigQuery try to autodetect the schema and format of the table.
        :param source_format: The data format. Supported values are: "CSV", "GOOGLE_SHEETS", "NEWLINE_DELIMITED_JSON", "AVRO", "PARQUET", and "DATSTORE_BACKUP". To use "GOOGLE_SHEETS" the scopes must include "googleapis.com/auth/drive.readonly".
        :param source_uris: A list of the fully-qualified URIs that point to your data in Google Cloud.
        :param compression: The compression type of the data source. Valid values are "NONE" or "GZIP".
        :param csv_options: csv_options block.
        :param google_sheets_options: google_sheets_options block.
        :param hive_partitioning_options: hive_partitioning_options block.
        :param ignore_unknown_values: Indicates if BigQuery should allow extra values that are not represented in the table schema. If true, the extra values are ignored. If false, records with extra columns are treated as bad records, and if there are too many bad records, an invalid error is returned in the job result. The default value is false.
        :param max_bad_records: The maximum number of bad records that BigQuery can ignore when reading data.
        :param schema: A JSON schema for the external table. Schema is required for CSV and JSON formats and is disallowed for Google Cloud Bigtable, Cloud Datastore backups, and Avro formats when using external tables.
        """
        self._values = {
            'autodetect': autodetect,
            'source_format': source_format,
            'source_uris': source_uris,
        }
        if compression is not None: self._values["compression"] = compression
        if csv_options is not None: self._values["csv_options"] = csv_options
        if google_sheets_options is not None: self._values["google_sheets_options"] = google_sheets_options
        if hive_partitioning_options is not None: self._values["hive_partitioning_options"] = hive_partitioning_options
        if ignore_unknown_values is not None: self._values["ignore_unknown_values"] = ignore_unknown_values
        if max_bad_records is not None: self._values["max_bad_records"] = max_bad_records
        if schema is not None: self._values["schema"] = schema

    @builtins.property
    def autodetect(self) -> bool:
        """Let BigQuery try to autodetect the schema and format of the table."""
        return self._values.get('autodetect')

    @builtins.property
    def source_format(self) -> str:
        """The data format.

        Supported values are: "CSV", "GOOGLE_SHEETS", "NEWLINE_DELIMITED_JSON", "AVRO", "PARQUET", and "DATSTORE_BACKUP". To use "GOOGLE_SHEETS" the scopes must include "googleapis.com/auth/drive.readonly".
        """
        return self._values.get('source_format')

    @builtins.property
    def source_uris(self) -> typing.List[str]:
        """A list of the fully-qualified URIs that point to your data in Google Cloud."""
        return self._values.get('source_uris')

    @builtins.property
    def compression(self) -> typing.Optional[str]:
        """The compression type of the data source.

        Valid values are "NONE" or "GZIP".
        """
        return self._values.get('compression')

    @builtins.property
    def csv_options(self) -> typing.Optional[typing.List["BigqueryTableExternalDataConfigurationCsvOptions"]]:
        """csv_options block."""
        return self._values.get('csv_options')

    @builtins.property
    def google_sheets_options(self) -> typing.Optional[typing.List["BigqueryTableExternalDataConfigurationGoogleSheetsOptions"]]:
        """google_sheets_options block."""
        return self._values.get('google_sheets_options')

    @builtins.property
    def hive_partitioning_options(self) -> typing.Optional[typing.List["BigqueryTableExternalDataConfigurationHivePartitioningOptions"]]:
        """hive_partitioning_options block."""
        return self._values.get('hive_partitioning_options')

    @builtins.property
    def ignore_unknown_values(self) -> typing.Optional[bool]:
        """Indicates if BigQuery should allow extra values that are not represented in the table schema.

        If true, the extra values are ignored. If false, records with extra columns are treated as bad records, and if there are too many bad records, an invalid error is returned in the job result. The default value is false.
        """
        return self._values.get('ignore_unknown_values')

    @builtins.property
    def max_bad_records(self) -> typing.Optional[jsii.Number]:
        """The maximum number of bad records that BigQuery can ignore when reading data."""
        return self._values.get('max_bad_records')

    @builtins.property
    def schema(self) -> typing.Optional[str]:
        """A JSON schema for the external table.

        Schema is required for CSV and JSON formats and is disallowed for Google Cloud Bigtable, Cloud Datastore backups, and Avro formats when using external tables.
        """
        return self._values.get('schema')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryTableExternalDataConfiguration(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryTableExternalDataConfigurationCsvOptions", jsii_struct_bases=[], name_mapping={'quote': 'quote', 'allow_jagged_rows': 'allowJaggedRows', 'allow_quoted_newlines': 'allowQuotedNewlines', 'encoding': 'encoding', 'field_delimiter': 'fieldDelimiter', 'skip_leading_rows': 'skipLeadingRows'})
class BigqueryTableExternalDataConfigurationCsvOptions():
    def __init__(self, *, quote: str, allow_jagged_rows: typing.Optional[bool]=None, allow_quoted_newlines: typing.Optional[bool]=None, encoding: typing.Optional[str]=None, field_delimiter: typing.Optional[str]=None, skip_leading_rows: typing.Optional[jsii.Number]=None) -> None:
        """
        :param quote: The value that is used to quote data sections in a CSV file. If your data does not contain quoted sections, set the property value to an empty string. If your data contains quoted newline characters, you must also set the allow_quoted_newlines property to true. The API-side default is ", specified in Terraform escaped as ". Due to limitations with Terraform default values, this value is required to be explicitly set.
        :param allow_jagged_rows: Indicates if BigQuery should accept rows that are missing trailing optional columns.
        :param allow_quoted_newlines: Indicates if BigQuery should allow quoted data sections that contain newline characters in a CSV file. The default value is false.
        :param encoding: The character encoding of the data. The supported values are UTF-8 or ISO-8859-1.
        :param field_delimiter: The separator for fields in a CSV file.
        :param skip_leading_rows: The number of rows at the top of a CSV file that BigQuery will skip when reading the data.
        """
        self._values = {
            'quote': quote,
        }
        if allow_jagged_rows is not None: self._values["allow_jagged_rows"] = allow_jagged_rows
        if allow_quoted_newlines is not None: self._values["allow_quoted_newlines"] = allow_quoted_newlines
        if encoding is not None: self._values["encoding"] = encoding
        if field_delimiter is not None: self._values["field_delimiter"] = field_delimiter
        if skip_leading_rows is not None: self._values["skip_leading_rows"] = skip_leading_rows

    @builtins.property
    def quote(self) -> str:
        """The value that is used to quote data sections in a CSV file.

        If your data does not contain quoted sections, set the property value to an empty string. If your data contains quoted newline characters, you must also set the allow_quoted_newlines property to true. The API-side default is ", specified in Terraform escaped as ". Due to limitations with Terraform default values, this value is required to be explicitly set.
        """
        return self._values.get('quote')

    @builtins.property
    def allow_jagged_rows(self) -> typing.Optional[bool]:
        """Indicates if BigQuery should accept rows that are missing trailing optional columns."""
        return self._values.get('allow_jagged_rows')

    @builtins.property
    def allow_quoted_newlines(self) -> typing.Optional[bool]:
        """Indicates if BigQuery should allow quoted data sections that contain newline characters in a CSV file.

        The default value is false.
        """
        return self._values.get('allow_quoted_newlines')

    @builtins.property
    def encoding(self) -> typing.Optional[str]:
        """The character encoding of the data.

        The supported values are UTF-8 or ISO-8859-1.
        """
        return self._values.get('encoding')

    @builtins.property
    def field_delimiter(self) -> typing.Optional[str]:
        """The separator for fields in a CSV file."""
        return self._values.get('field_delimiter')

    @builtins.property
    def skip_leading_rows(self) -> typing.Optional[jsii.Number]:
        """The number of rows at the top of a CSV file that BigQuery will skip when reading the data."""
        return self._values.get('skip_leading_rows')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryTableExternalDataConfigurationCsvOptions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryTableExternalDataConfigurationGoogleSheetsOptions", jsii_struct_bases=[], name_mapping={'range': 'range', 'skip_leading_rows': 'skipLeadingRows'})
class BigqueryTableExternalDataConfigurationGoogleSheetsOptions():
    def __init__(self, *, range: typing.Optional[str]=None, skip_leading_rows: typing.Optional[jsii.Number]=None) -> None:
        """
        :param range: Range of a sheet to query from. Only used when non-empty. At least one of range or skip_leading_rows must be set. Typical format: "sheet_name!top_left_cell_id:bottom_right_cell_id" For example: "sheet1!A1:B20"
        :param skip_leading_rows: The number of rows at the top of the sheet that BigQuery will skip when reading the data. At least one of range or skip_leading_rows must be set.
        """
        self._values = {
        }
        if range is not None: self._values["range"] = range
        if skip_leading_rows is not None: self._values["skip_leading_rows"] = skip_leading_rows

    @builtins.property
    def range(self) -> typing.Optional[str]:
        """Range of a sheet to query from.

        Only used when non-empty. At least one of range or skip_leading_rows must be set. Typical format: "sheet_name!top_left_cell_id:bottom_right_cell_id" For example: "sheet1!A1:B20"
        """
        return self._values.get('range')

    @builtins.property
    def skip_leading_rows(self) -> typing.Optional[jsii.Number]:
        """The number of rows at the top of the sheet that BigQuery will skip when reading the data.

        At least one of range or skip_leading_rows must be set.
        """
        return self._values.get('skip_leading_rows')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryTableExternalDataConfigurationGoogleSheetsOptions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryTableExternalDataConfigurationHivePartitioningOptions", jsii_struct_bases=[], name_mapping={'mode': 'mode', 'source_uri_prefix': 'sourceUriPrefix'})
class BigqueryTableExternalDataConfigurationHivePartitioningOptions():
    def __init__(self, *, mode: typing.Optional[str]=None, source_uri_prefix: typing.Optional[str]=None) -> None:
        """
        :param mode: When set, what mode of hive partitioning to use when reading data.
        :param source_uri_prefix: When hive partition detection is requested, a common for all source uris must be required. The prefix must end immediately before the partition key encoding begins.
        """
        self._values = {
        }
        if mode is not None: self._values["mode"] = mode
        if source_uri_prefix is not None: self._values["source_uri_prefix"] = source_uri_prefix

    @builtins.property
    def mode(self) -> typing.Optional[str]:
        """When set, what mode of hive partitioning to use when reading data."""
        return self._values.get('mode')

    @builtins.property
    def source_uri_prefix(self) -> typing.Optional[str]:
        """When hive partition detection is requested, a common for all source uris must be required.

        The prefix must end immediately before the partition key encoding begins.
        """
        return self._values.get('source_uri_prefix')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryTableExternalDataConfigurationHivePartitioningOptions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryTableRangePartitioning", jsii_struct_bases=[], name_mapping={'field': 'field', 'range': 'range'})
class BigqueryTableRangePartitioning():
    def __init__(self, *, field: str, range: typing.List["BigqueryTableRangePartitioningRange"]) -> None:
        """
        :param field: The field used to determine how to create a range-based partition.
        :param range: range block.
        """
        self._values = {
            'field': field,
            'range': range,
        }

    @builtins.property
    def field(self) -> str:
        """The field used to determine how to create a range-based partition."""
        return self._values.get('field')

    @builtins.property
    def range(self) -> typing.List["BigqueryTableRangePartitioningRange"]:
        """range block."""
        return self._values.get('range')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryTableRangePartitioning(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryTableRangePartitioningRange", jsii_struct_bases=[], name_mapping={'end': 'end', 'interval': 'interval', 'start': 'start'})
class BigqueryTableRangePartitioningRange():
    def __init__(self, *, end: jsii.Number, interval: jsii.Number, start: jsii.Number) -> None:
        """
        :param end: End of the range partitioning, exclusive.
        :param interval: The width of each range within the partition.
        :param start: Start of the range partitioning, inclusive.
        """
        self._values = {
            'end': end,
            'interval': interval,
            'start': start,
        }

    @builtins.property
    def end(self) -> jsii.Number:
        """End of the range partitioning, exclusive."""
        return self._values.get('end')

    @builtins.property
    def interval(self) -> jsii.Number:
        """The width of each range within the partition."""
        return self._values.get('interval')

    @builtins.property
    def start(self) -> jsii.Number:
        """Start of the range partitioning, inclusive."""
        return self._values.get('start')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryTableRangePartitioningRange(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryTableTimePartitioning", jsii_struct_bases=[], name_mapping={'type': 'type', 'expiration_ms': 'expirationMs', 'field': 'field', 'require_partition_filter': 'requirePartitionFilter'})
class BigqueryTableTimePartitioning():
    def __init__(self, *, type: str, expiration_ms: typing.Optional[jsii.Number]=None, field: typing.Optional[str]=None, require_partition_filter: typing.Optional[bool]=None) -> None:
        """
        :param type: The supported types are DAY and HOUR, which will generate one partition per day or hour based on data loading time.
        :param expiration_ms: Number of milliseconds for which to keep the storage for a partition.
        :param field: The field used to determine how to create a time-based partition. If time-based partitioning is enabled without this value, the table is partitioned based on the load time.
        :param require_partition_filter: If set to true, queries over this table require a partition filter that can be used for partition elimination to be specified.
        """
        self._values = {
            'type': type,
        }
        if expiration_ms is not None: self._values["expiration_ms"] = expiration_ms
        if field is not None: self._values["field"] = field
        if require_partition_filter is not None: self._values["require_partition_filter"] = require_partition_filter

    @builtins.property
    def type(self) -> str:
        """The supported types are DAY and HOUR, which will generate one partition per day or hour based on data loading time."""
        return self._values.get('type')

    @builtins.property
    def expiration_ms(self) -> typing.Optional[jsii.Number]:
        """Number of milliseconds for which to keep the storage for a partition."""
        return self._values.get('expiration_ms')

    @builtins.property
    def field(self) -> typing.Optional[str]:
        """The field used to determine how to create a time-based partition.

        If time-based partitioning is enabled without this value, the table is partitioned based on the load time.
        """
        return self._values.get('field')

    @builtins.property
    def require_partition_filter(self) -> typing.Optional[bool]:
        """If set to true, queries over this table require a partition filter that can be used for partition elimination to be specified."""
        return self._values.get('require_partition_filter')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryTableTimePartitioning(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigqueryTableView", jsii_struct_bases=[], name_mapping={'query': 'query', 'use_legacy_sql': 'useLegacySql'})
class BigqueryTableView():
    def __init__(self, *, query: str, use_legacy_sql: typing.Optional[bool]=None) -> None:
        """
        :param query: A query that BigQuery executes when the view is referenced.
        :param use_legacy_sql: Specifies whether to use BigQuery's legacy SQL for this view. The default value is true. If set to false, the view will use BigQuery's standard SQL
        """
        self._values = {
            'query': query,
        }
        if use_legacy_sql is not None: self._values["use_legacy_sql"] = use_legacy_sql

    @builtins.property
    def query(self) -> str:
        """A query that BigQuery executes when the view is referenced."""
        return self._values.get('query')

    @builtins.property
    def use_legacy_sql(self) -> typing.Optional[bool]:
        """Specifies whether to use BigQuery's legacy SQL for this view.

        The default value is true. If set to false, the view will use BigQuery's standard SQL
        """
        return self._values.get('use_legacy_sql')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigqueryTableView(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigtableAppProfile(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigtableAppProfile"):
    def __init__(self, scope: constructs.Construct, id: str, *, app_profile_id: str, description: typing.Optional[str]=None, ignore_warnings: typing.Optional[bool]=None, instance: typing.Optional[str]=None, multi_cluster_routing_use_any: typing.Optional[bool]=None, project: typing.Optional[str]=None, single_cluster_routing: typing.Optional[typing.List["BigtableAppProfileSingleClusterRouting"]]=None, timeouts: typing.Optional["BigtableAppProfileTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param app_profile_id: The unique name of the app profile in the form '[*a-zA-Z0-9][-*.a-zA-Z0-9]*'.
        :param description: Long form description of the use case for this app profile.
        :param ignore_warnings: If true, ignore safety checks when deleting/updating the app profile.
        :param instance: The name of the instance to create the app profile within.
        :param multi_cluster_routing_use_any: If true, read/write requests are routed to the nearest cluster in the instance, and will fail over to the nearest cluster that is available in the event of transient errors or delays. Clusters in a region are considered equidistant. Choosing this option sacrifices read-your-writes consistency to improve availability.
        :param project: 
        :param single_cluster_routing: single_cluster_routing block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigtableAppProfileConfig(app_profile_id=app_profile_id, description=description, ignore_warnings=ignore_warnings, instance=instance, multi_cluster_routing_use_any=multi_cluster_routing_use_any, project=project, single_cluster_routing=single_cluster_routing, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigtableAppProfile, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="appProfileId")
    def app_profile_id(self) -> str:
        return jsii.get(self, "appProfileId")

    @app_profile_id.setter
    def app_profile_id(self, value: str) -> None:
        jsii.set(self, "appProfileId", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="ignoreWarnings")
    def ignore_warnings(self) -> typing.Optional[bool]:
        return jsii.get(self, "ignoreWarnings")

    @ignore_warnings.setter
    def ignore_warnings(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "ignoreWarnings", value)

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> typing.Optional[str]:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="multiClusterRoutingUseAny")
    def multi_cluster_routing_use_any(self) -> typing.Optional[bool]:
        return jsii.get(self, "multiClusterRoutingUseAny")

    @multi_cluster_routing_use_any.setter
    def multi_cluster_routing_use_any(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "multiClusterRoutingUseAny", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="singleClusterRouting")
    def single_cluster_routing(self) -> typing.Optional[typing.List["BigtableAppProfileSingleClusterRouting"]]:
        return jsii.get(self, "singleClusterRouting")

    @single_cluster_routing.setter
    def single_cluster_routing(self, value: typing.Optional[typing.List["BigtableAppProfileSingleClusterRouting"]]) -> None:
        jsii.set(self, "singleClusterRouting", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["BigtableAppProfileTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["BigtableAppProfileTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableAppProfileConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'app_profile_id': 'appProfileId', 'description': 'description', 'ignore_warnings': 'ignoreWarnings', 'instance': 'instance', 'multi_cluster_routing_use_any': 'multiClusterRoutingUseAny', 'project': 'project', 'single_cluster_routing': 'singleClusterRouting', 'timeouts': 'timeouts'})
class BigtableAppProfileConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, app_profile_id: str, description: typing.Optional[str]=None, ignore_warnings: typing.Optional[bool]=None, instance: typing.Optional[str]=None, multi_cluster_routing_use_any: typing.Optional[bool]=None, project: typing.Optional[str]=None, single_cluster_routing: typing.Optional[typing.List["BigtableAppProfileSingleClusterRouting"]]=None, timeouts: typing.Optional["BigtableAppProfileTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_profile_id: The unique name of the app profile in the form '[*a-zA-Z0-9][-*.a-zA-Z0-9]*'.
        :param description: Long form description of the use case for this app profile.
        :param ignore_warnings: If true, ignore safety checks when deleting/updating the app profile.
        :param instance: The name of the instance to create the app profile within.
        :param multi_cluster_routing_use_any: If true, read/write requests are routed to the nearest cluster in the instance, and will fail over to the nearest cluster that is available in the event of transient errors or delays. Clusters in a region are considered equidistant. Choosing this option sacrifices read-your-writes consistency to improve availability.
        :param project: 
        :param single_cluster_routing: single_cluster_routing block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = BigtableAppProfileTimeouts(**timeouts)
        self._values = {
            'app_profile_id': app_profile_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if ignore_warnings is not None: self._values["ignore_warnings"] = ignore_warnings
        if instance is not None: self._values["instance"] = instance
        if multi_cluster_routing_use_any is not None: self._values["multi_cluster_routing_use_any"] = multi_cluster_routing_use_any
        if project is not None: self._values["project"] = project
        if single_cluster_routing is not None: self._values["single_cluster_routing"] = single_cluster_routing
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def app_profile_id(self) -> str:
        """The unique name of the app profile in the form '[*a-zA-Z0-9][-*.a-zA-Z0-9]*'."""
        return self._values.get('app_profile_id')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Long form description of the use case for this app profile."""
        return self._values.get('description')

    @builtins.property
    def ignore_warnings(self) -> typing.Optional[bool]:
        """If true, ignore safety checks when deleting/updating the app profile."""
        return self._values.get('ignore_warnings')

    @builtins.property
    def instance(self) -> typing.Optional[str]:
        """The name of the instance to create the app profile within."""
        return self._values.get('instance')

    @builtins.property
    def multi_cluster_routing_use_any(self) -> typing.Optional[bool]:
        """If true, read/write requests are routed to the nearest cluster in the instance, and will fail over to the nearest cluster that is available in the event of transient errors or delays.

        Clusters in a region are considered equidistant. Choosing this option sacrifices read-your-writes
        consistency to improve availability.
        """
        return self._values.get('multi_cluster_routing_use_any')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def single_cluster_routing(self) -> typing.Optional[typing.List["BigtableAppProfileSingleClusterRouting"]]:
        """single_cluster_routing block."""
        return self._values.get('single_cluster_routing')

    @builtins.property
    def timeouts(self) -> typing.Optional["BigtableAppProfileTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableAppProfileConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableAppProfileSingleClusterRouting", jsii_struct_bases=[], name_mapping={'cluster_id': 'clusterId', 'allow_transactional_writes': 'allowTransactionalWrites'})
class BigtableAppProfileSingleClusterRouting():
    def __init__(self, *, cluster_id: str, allow_transactional_writes: typing.Optional[bool]=None) -> None:
        """
        :param cluster_id: The cluster to which read/write requests should be routed.
        :param allow_transactional_writes: If true, CheckAndMutateRow and ReadModifyWriteRow requests are allowed by this app profile. It is unsafe to send these requests to the same table/row/column in multiple clusters.
        """
        self._values = {
            'cluster_id': cluster_id,
        }
        if allow_transactional_writes is not None: self._values["allow_transactional_writes"] = allow_transactional_writes

    @builtins.property
    def cluster_id(self) -> str:
        """The cluster to which read/write requests should be routed."""
        return self._values.get('cluster_id')

    @builtins.property
    def allow_transactional_writes(self) -> typing.Optional[bool]:
        """If true, CheckAndMutateRow and ReadModifyWriteRow requests are allowed by this app profile.

        It is unsafe to send these requests to the same table/row/column in multiple clusters.
        """
        return self._values.get('allow_transactional_writes')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableAppProfileSingleClusterRouting(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableAppProfileTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class BigtableAppProfileTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableAppProfileTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigtableGcPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigtableGcPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, column_family: str, instance_name: str, table: str, max_age: typing.Optional[typing.List["BigtableGcPolicyMaxAge"]]=None, max_version: typing.Optional[typing.List["BigtableGcPolicyMaxVersion"]]=None, mode: typing.Optional[str]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param column_family: The name of the column family.
        :param instance_name: The name of the Bigtable instance.
        :param table: The name of the table.
        :param max_age: max_age block.
        :param max_version: max_version block.
        :param mode: If multiple policies are set, you should choose between UNION OR INTERSECTION.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigtableGcPolicyConfig(column_family=column_family, instance_name=instance_name, table=table, max_age=max_age, max_version=max_version, mode=mode, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigtableGcPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="columnFamily")
    def column_family(self) -> str:
        return jsii.get(self, "columnFamily")

    @column_family.setter
    def column_family(self, value: str) -> None:
        jsii.set(self, "columnFamily", value)

    @builtins.property
    @jsii.member(jsii_name="instanceName")
    def instance_name(self) -> str:
        return jsii.get(self, "instanceName")

    @instance_name.setter
    def instance_name(self, value: str) -> None:
        jsii.set(self, "instanceName", value)

    @builtins.property
    @jsii.member(jsii_name="table")
    def table(self) -> str:
        return jsii.get(self, "table")

    @table.setter
    def table(self, value: str) -> None:
        jsii.set(self, "table", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="maxAge")
    def max_age(self) -> typing.Optional[typing.List["BigtableGcPolicyMaxAge"]]:
        return jsii.get(self, "maxAge")

    @max_age.setter
    def max_age(self, value: typing.Optional[typing.List["BigtableGcPolicyMaxAge"]]) -> None:
        jsii.set(self, "maxAge", value)

    @builtins.property
    @jsii.member(jsii_name="maxVersion")
    def max_version(self) -> typing.Optional[typing.List["BigtableGcPolicyMaxVersion"]]:
        return jsii.get(self, "maxVersion")

    @max_version.setter
    def max_version(self, value: typing.Optional[typing.List["BigtableGcPolicyMaxVersion"]]) -> None:
        jsii.set(self, "maxVersion", value)

    @builtins.property
    @jsii.member(jsii_name="mode")
    def mode(self) -> typing.Optional[str]:
        return jsii.get(self, "mode")

    @mode.setter
    def mode(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "mode", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableGcPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'column_family': 'columnFamily', 'instance_name': 'instanceName', 'table': 'table', 'max_age': 'maxAge', 'max_version': 'maxVersion', 'mode': 'mode', 'project': 'project'})
class BigtableGcPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, column_family: str, instance_name: str, table: str, max_age: typing.Optional[typing.List["BigtableGcPolicyMaxAge"]]=None, max_version: typing.Optional[typing.List["BigtableGcPolicyMaxVersion"]]=None, mode: typing.Optional[str]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param column_family: The name of the column family.
        :param instance_name: The name of the Bigtable instance.
        :param table: The name of the table.
        :param max_age: max_age block.
        :param max_version: max_version block.
        :param mode: If multiple policies are set, you should choose between UNION OR INTERSECTION.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'column_family': column_family,
            'instance_name': instance_name,
            'table': table,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if max_age is not None: self._values["max_age"] = max_age
        if max_version is not None: self._values["max_version"] = max_version
        if mode is not None: self._values["mode"] = mode
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def column_family(self) -> str:
        """The name of the column family."""
        return self._values.get('column_family')

    @builtins.property
    def instance_name(self) -> str:
        """The name of the Bigtable instance."""
        return self._values.get('instance_name')

    @builtins.property
    def table(self) -> str:
        """The name of the table."""
        return self._values.get('table')

    @builtins.property
    def max_age(self) -> typing.Optional[typing.List["BigtableGcPolicyMaxAge"]]:
        """max_age block."""
        return self._values.get('max_age')

    @builtins.property
    def max_version(self) -> typing.Optional[typing.List["BigtableGcPolicyMaxVersion"]]:
        """max_version block."""
        return self._values.get('max_version')

    @builtins.property
    def mode(self) -> typing.Optional[str]:
        """If multiple policies are set, you should choose between UNION OR INTERSECTION."""
        return self._values.get('mode')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableGcPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableGcPolicyMaxAge", jsii_struct_bases=[], name_mapping={'days': 'days'})
class BigtableGcPolicyMaxAge():
    def __init__(self, *, days: jsii.Number) -> None:
        """
        :param days: Number of days before applying GC policy.
        """
        self._values = {
            'days': days,
        }

    @builtins.property
    def days(self) -> jsii.Number:
        """Number of days before applying GC policy."""
        return self._values.get('days')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableGcPolicyMaxAge(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableGcPolicyMaxVersion", jsii_struct_bases=[], name_mapping={'number': 'number'})
class BigtableGcPolicyMaxVersion():
    def __init__(self, *, number: jsii.Number) -> None:
        """
        :param number: Number of version before applying the GC policy.
        """
        self._values = {
            'number': number,
        }

    @builtins.property
    def number(self) -> jsii.Number:
        """Number of version before applying the GC policy."""
        return self._values.get('number')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableGcPolicyMaxVersion(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigtableInstance(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigtableInstance"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, cluster: typing.Optional[typing.List["BigtableInstanceCluster"]]=None, deletion_protection: typing.Optional[bool]=None, display_name: typing.Optional[str]=None, instance_type: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name (also called Instance Id in the Cloud Console) of the Cloud Bigtable instance.
        :param cluster: cluster block.
        :param deletion_protection: Whether or not to allow Terraform to destroy the instance. Unless this field is set to false in Terraform state, a terraform destroy or terraform apply that would delete the instance will fail.
        :param display_name: The human-readable display name of the Bigtable instance. Defaults to the instance name.
        :param instance_type: The instance type to create. One of "DEVELOPMENT" or "PRODUCTION". Defaults to "PRODUCTION".
        :param labels: A mapping of labels to assign to the resource.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigtableInstanceConfig(name=name, cluster=cluster, deletion_protection=deletion_protection, display_name=display_name, instance_type=instance_type, labels=labels, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigtableInstance, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="cluster")
    def cluster(self) -> typing.Optional[typing.List["BigtableInstanceCluster"]]:
        return jsii.get(self, "cluster")

    @cluster.setter
    def cluster(self, value: typing.Optional[typing.List["BigtableInstanceCluster"]]) -> None:
        jsii.set(self, "cluster", value)

    @builtins.property
    @jsii.member(jsii_name="deletionProtection")
    def deletion_protection(self) -> typing.Optional[bool]:
        return jsii.get(self, "deletionProtection")

    @deletion_protection.setter
    def deletion_protection(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "deletionProtection", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> typing.Optional[str]:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="instanceType")
    def instance_type(self) -> typing.Optional[str]:
        return jsii.get(self, "instanceType")

    @instance_type.setter
    def instance_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "instanceType", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableInstanceCluster", jsii_struct_bases=[], name_mapping={'cluster_id': 'clusterId', 'zone': 'zone', 'num_nodes': 'numNodes', 'storage_type': 'storageType'})
class BigtableInstanceCluster():
    def __init__(self, *, cluster_id: str, zone: str, num_nodes: typing.Optional[jsii.Number]=None, storage_type: typing.Optional[str]=None) -> None:
        """
        :param cluster_id: The ID of the Cloud Bigtable cluster.
        :param zone: The zone to create the Cloud Bigtable cluster in. Each cluster must have a different zone in the same region. Zones that support Bigtable instances are noted on the Cloud Bigtable locations page.
        :param num_nodes: The number of nodes in your Cloud Bigtable cluster. Required, with a minimum of 1 for a PRODUCTION instance. Must be left unset for a DEVELOPMENT instance.
        :param storage_type: The storage type to use. One of "SSD" or "HDD". Defaults to "SSD".
        """
        self._values = {
            'cluster_id': cluster_id,
            'zone': zone,
        }
        if num_nodes is not None: self._values["num_nodes"] = num_nodes
        if storage_type is not None: self._values["storage_type"] = storage_type

    @builtins.property
    def cluster_id(self) -> str:
        """The ID of the Cloud Bigtable cluster."""
        return self._values.get('cluster_id')

    @builtins.property
    def zone(self) -> str:
        """The zone to create the Cloud Bigtable cluster in.

        Each cluster must have a different zone in the same region. Zones that support Bigtable instances are noted on the Cloud Bigtable locations page.
        """
        return self._values.get('zone')

    @builtins.property
    def num_nodes(self) -> typing.Optional[jsii.Number]:
        """The number of nodes in your Cloud Bigtable cluster.

        Required, with a minimum of 1 for a PRODUCTION instance. Must be left unset for a DEVELOPMENT instance.
        """
        return self._values.get('num_nodes')

    @builtins.property
    def storage_type(self) -> typing.Optional[str]:
        """The storage type to use.

        One of "SSD" or "HDD". Defaults to "SSD".
        """
        return self._values.get('storage_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableInstanceCluster(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableInstanceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'cluster': 'cluster', 'deletion_protection': 'deletionProtection', 'display_name': 'displayName', 'instance_type': 'instanceType', 'labels': 'labels', 'project': 'project'})
class BigtableInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, cluster: typing.Optional[typing.List["BigtableInstanceCluster"]]=None, deletion_protection: typing.Optional[bool]=None, display_name: typing.Optional[str]=None, instance_type: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name (also called Instance Id in the Cloud Console) of the Cloud Bigtable instance.
        :param cluster: cluster block.
        :param deletion_protection: Whether or not to allow Terraform to destroy the instance. Unless this field is set to false in Terraform state, a terraform destroy or terraform apply that would delete the instance will fail.
        :param display_name: The human-readable display name of the Bigtable instance. Defaults to the instance name.
        :param instance_type: The instance type to create. One of "DEVELOPMENT" or "PRODUCTION". Defaults to "PRODUCTION".
        :param labels: A mapping of labels to assign to the resource.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if cluster is not None: self._values["cluster"] = cluster
        if deletion_protection is not None: self._values["deletion_protection"] = deletion_protection
        if display_name is not None: self._values["display_name"] = display_name
        if instance_type is not None: self._values["instance_type"] = instance_type
        if labels is not None: self._values["labels"] = labels
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name (also called Instance Id in the Cloud Console) of the Cloud Bigtable instance."""
        return self._values.get('name')

    @builtins.property
    def cluster(self) -> typing.Optional[typing.List["BigtableInstanceCluster"]]:
        """cluster block."""
        return self._values.get('cluster')

    @builtins.property
    def deletion_protection(self) -> typing.Optional[bool]:
        """Whether or not to allow Terraform to destroy the instance.

        Unless this field is set to false in Terraform state, a terraform destroy or terraform apply that would delete the instance will fail.
        """
        return self._values.get('deletion_protection')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """The human-readable display name of the Bigtable instance.

        Defaults to the instance name.
        """
        return self._values.get('display_name')

    @builtins.property
    def instance_type(self) -> typing.Optional[str]:
        """The instance type to create.

        One of "DEVELOPMENT" or "PRODUCTION". Defaults to "PRODUCTION".
        """
        return self._values.get('instance_type')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A mapping of labels to assign to the resource."""
        return self._values.get('labels')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigtableInstanceIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigtableInstanceIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["BigtableInstanceIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigtableInstanceIamBindingConfig(instance=instance, members=members, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigtableInstanceIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["BigtableInstanceIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["BigtableInstanceIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableInstanceIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class BigtableInstanceIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableInstanceIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableInstanceIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class BigtableInstanceIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["BigtableInstanceIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance': instance,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["BigtableInstanceIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableInstanceIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigtableInstanceIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigtableInstanceIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, member: str, role: str, condition: typing.Optional[typing.List["BigtableInstanceIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigtableInstanceIamMemberConfig(instance=instance, member=member, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigtableInstanceIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["BigtableInstanceIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["BigtableInstanceIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableInstanceIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class BigtableInstanceIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableInstanceIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableInstanceIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class BigtableInstanceIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, member: str, role: str, condition: typing.Optional[typing.List["BigtableInstanceIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance': instance,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["BigtableInstanceIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableInstanceIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigtableInstanceIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigtableInstanceIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, policy_data: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: 
        :param policy_data: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigtableInstanceIamPolicyConfig(instance=instance, policy_data=policy_data, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigtableInstanceIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableInstanceIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'policy_data': 'policyData', 'project': 'project'})
class BigtableInstanceIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, policy_data: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: 
        :param policy_data: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance': instance,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableInstanceIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BigtableTable(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BigtableTable"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance_name: str, name: str, column_family: typing.Optional[typing.List["BigtableTableColumnFamily"]]=None, project: typing.Optional[str]=None, split_keys: typing.Optional[typing.List[str]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance_name: The name of the Bigtable instance.
        :param name: The name of the table.
        :param column_family: column_family block.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param split_keys: A list of predefined keys to split the table on. !> Warning: Modifying the split_keys of an existing table will cause Terraform to delete/recreate the entire google_bigtable_table resource.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BigtableTableConfig(instance_name=instance_name, name=name, column_family=column_family, project=project, split_keys=split_keys, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BigtableTable, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="instanceName")
    def instance_name(self) -> str:
        return jsii.get(self, "instanceName")

    @instance_name.setter
    def instance_name(self, value: str) -> None:
        jsii.set(self, "instanceName", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="columnFamily")
    def column_family(self) -> typing.Optional[typing.List["BigtableTableColumnFamily"]]:
        return jsii.get(self, "columnFamily")

    @column_family.setter
    def column_family(self, value: typing.Optional[typing.List["BigtableTableColumnFamily"]]) -> None:
        jsii.set(self, "columnFamily", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="splitKeys")
    def split_keys(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "splitKeys")

    @split_keys.setter
    def split_keys(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "splitKeys", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableTableColumnFamily", jsii_struct_bases=[], name_mapping={'family': 'family'})
class BigtableTableColumnFamily():
    def __init__(self, *, family: str) -> None:
        """
        :param family: The name of the column family.
        """
        self._values = {
            'family': family,
        }

    @builtins.property
    def family(self) -> str:
        """The name of the column family."""
        return self._values.get('family')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableTableColumnFamily(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BigtableTableConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance_name': 'instanceName', 'name': 'name', 'column_family': 'columnFamily', 'project': 'project', 'split_keys': 'splitKeys'})
class BigtableTableConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance_name: str, name: str, column_family: typing.Optional[typing.List["BigtableTableColumnFamily"]]=None, project: typing.Optional[str]=None, split_keys: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance_name: The name of the Bigtable instance.
        :param name: The name of the table.
        :param column_family: column_family block.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param split_keys: A list of predefined keys to split the table on. !> Warning: Modifying the split_keys of an existing table will cause Terraform to delete/recreate the entire google_bigtable_table resource.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance_name': instance_name,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if column_family is not None: self._values["column_family"] = column_family
        if project is not None: self._values["project"] = project
        if split_keys is not None: self._values["split_keys"] = split_keys

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance_name(self) -> str:
        """The name of the Bigtable instance."""
        return self._values.get('instance_name')

    @builtins.property
    def name(self) -> str:
        """The name of the table."""
        return self._values.get('name')

    @builtins.property
    def column_family(self) -> typing.Optional[typing.List["BigtableTableColumnFamily"]]:
        """column_family block."""
        return self._values.get('column_family')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def split_keys(self) -> typing.Optional[typing.List[str]]:
        """A list of predefined keys to split the table on.

        !> Warning: Modifying the split_keys of an existing table will cause Terraform to delete/recreate the entire google_bigtable_table resource.
        """
        return self._values.get('split_keys')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BigtableTableConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BillingAccountIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BillingAccountIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, billing_account_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["BillingAccountIamBindingCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param billing_account_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BillingAccountIamBindingConfig(billing_account_id=billing_account_id, members=members, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BillingAccountIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="billingAccountId")
    def billing_account_id(self) -> str:
        return jsii.get(self, "billingAccountId")

    @billing_account_id.setter
    def billing_account_id(self, value: str) -> None:
        jsii.set(self, "billingAccountId", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["BillingAccountIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["BillingAccountIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BillingAccountIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class BillingAccountIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BillingAccountIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BillingAccountIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'billing_account_id': 'billingAccountId', 'members': 'members', 'role': 'role', 'condition': 'condition'})
class BillingAccountIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, billing_account_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["BillingAccountIamBindingCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param billing_account_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'billing_account_id': billing_account_id,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def billing_account_id(self) -> str:
        return self._values.get('billing_account_id')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["BillingAccountIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BillingAccountIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BillingAccountIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BillingAccountIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, billing_account_id: str, member: str, role: str, condition: typing.Optional[typing.List["BillingAccountIamMemberCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param billing_account_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BillingAccountIamMemberConfig(billing_account_id=billing_account_id, member=member, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BillingAccountIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="billingAccountId")
    def billing_account_id(self) -> str:
        return jsii.get(self, "billingAccountId")

    @billing_account_id.setter
    def billing_account_id(self, value: str) -> None:
        jsii.set(self, "billingAccountId", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["BillingAccountIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["BillingAccountIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BillingAccountIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class BillingAccountIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BillingAccountIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BillingAccountIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'billing_account_id': 'billingAccountId', 'member': 'member', 'role': 'role', 'condition': 'condition'})
class BillingAccountIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, billing_account_id: str, member: str, role: str, condition: typing.Optional[typing.List["BillingAccountIamMemberCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param billing_account_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'billing_account_id': billing_account_id,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def billing_account_id(self) -> str:
        return self._values.get('billing_account_id')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["BillingAccountIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BillingAccountIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BillingAccountIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BillingAccountIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, billing_account_id: str, policy_data: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param billing_account_id: 
        :param policy_data: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BillingAccountIamPolicyConfig(billing_account_id=billing_account_id, policy_data=policy_data, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BillingAccountIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="billingAccountId")
    def billing_account_id(self) -> str:
        return jsii.get(self, "billingAccountId")

    @billing_account_id.setter
    def billing_account_id(self, value: str) -> None:
        jsii.set(self, "billingAccountId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BillingAccountIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'billing_account_id': 'billingAccountId', 'policy_data': 'policyData'})
class BillingAccountIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, billing_account_id: str, policy_data: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param billing_account_id: 
        :param policy_data: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'billing_account_id': billing_account_id,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def billing_account_id(self) -> str:
        return self._values.get('billing_account_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BillingAccountIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BinaryAuthorizationAttestor(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestor"):
    def __init__(self, scope: constructs.Construct, id: str, *, attestation_authority_note: typing.List["BinaryAuthorizationAttestorAttestationAuthorityNote"], name: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["BinaryAuthorizationAttestorTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param attestation_authority_note: attestation_authority_note block.
        :param name: The resource name.
        :param description: A descriptive comment. This field may be updated. The field may be displayed in chooser dialogs.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BinaryAuthorizationAttestorConfig(attestation_authority_note=attestation_authority_note, name=name, description=description, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BinaryAuthorizationAttestor, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="attestationAuthorityNote")
    def attestation_authority_note(self) -> typing.List["BinaryAuthorizationAttestorAttestationAuthorityNote"]:
        return jsii.get(self, "attestationAuthorityNote")

    @attestation_authority_note.setter
    def attestation_authority_note(self, value: typing.List["BinaryAuthorizationAttestorAttestationAuthorityNote"]) -> None:
        jsii.set(self, "attestationAuthorityNote", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["BinaryAuthorizationAttestorTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["BinaryAuthorizationAttestorTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorAttestationAuthorityNote", jsii_struct_bases=[], name_mapping={'note_reference': 'noteReference', 'public_keys': 'publicKeys'})
class BinaryAuthorizationAttestorAttestationAuthorityNote():
    def __init__(self, *, note_reference: str, public_keys: typing.Optional[typing.List["BinaryAuthorizationAttestorAttestationAuthorityNotePublicKeys"]]=None) -> None:
        """
        :param note_reference: The resource name of a ATTESTATION_AUTHORITY Note, created by the user. If the Note is in a different project from the Attestor, it should be specified in the format 'projects/*/notes/*' (or the legacy 'providers/*/notes/*'). This field may not be updated. An attestation by this attestor is stored as a Container Analysis ATTESTATION_AUTHORITY Occurrence that names a container image and that links to this Note.
        :param public_keys: public_keys block.
        """
        self._values = {
            'note_reference': note_reference,
        }
        if public_keys is not None: self._values["public_keys"] = public_keys

    @builtins.property
    def note_reference(self) -> str:
        """The resource name of a ATTESTATION_AUTHORITY Note, created by the user.

        If the Note is in a different project from the Attestor, it
        should be specified in the format 'projects/*/notes/*' (or the legacy
        'providers/*/notes/*'). This field may not be updated.
        An attestation by this attestor is stored as a Container Analysis
        ATTESTATION_AUTHORITY Occurrence that names a container image
        and that links to this Note.
        """
        return self._values.get('note_reference')

    @builtins.property
    def public_keys(self) -> typing.Optional[typing.List["BinaryAuthorizationAttestorAttestationAuthorityNotePublicKeys"]]:
        """public_keys block."""
        return self._values.get('public_keys')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationAttestorAttestationAuthorityNote(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorAttestationAuthorityNotePublicKeys", jsii_struct_bases=[], name_mapping={'ascii_armored_pgp_public_key': 'asciiArmoredPgpPublicKey', 'comment': 'comment', 'id': 'id', 'pkix_public_key': 'pkixPublicKey'})
class BinaryAuthorizationAttestorAttestationAuthorityNotePublicKeys():
    def __init__(self, *, ascii_armored_pgp_public_key: typing.Optional[str]=None, comment: typing.Optional[str]=None, id: typing.Optional[str]=None, pkix_public_key: typing.Optional[typing.List["BinaryAuthorizationAttestorAttestationAuthorityNotePublicKeysPkixPublicKey"]]=None) -> None:
        """
        :param ascii_armored_pgp_public_key: ASCII-armored representation of a PGP public key, as the entire output by the command 'gpg --export --armor foo@example.com' (either LF or CRLF line endings). When using this field, id should be left blank. The BinAuthz API handlers will calculate the ID and fill it in automatically. BinAuthz computes this ID as the OpenPGP RFC4880 V4 fingerprint, represented as upper-case hex. If id is provided by the caller, it will be overwritten by the API-calculated ID.
        :param comment: A descriptive comment. This field may be updated.
        :param id: The ID of this public key. Signatures verified by BinAuthz must include the ID of the public key that can be used to verify them, and that ID must match the contents of this field exactly. Additional restrictions on this field can be imposed based on which public key type is encapsulated. See the documentation on publicKey cases below for details.
        :param pkix_public_key: pkix_public_key block.
        """
        self._values = {
        }
        if ascii_armored_pgp_public_key is not None: self._values["ascii_armored_pgp_public_key"] = ascii_armored_pgp_public_key
        if comment is not None: self._values["comment"] = comment
        if id is not None: self._values["id"] = id
        if pkix_public_key is not None: self._values["pkix_public_key"] = pkix_public_key

    @builtins.property
    def ascii_armored_pgp_public_key(self) -> typing.Optional[str]:
        """ASCII-armored representation of a PGP public key, as the entire output by the command 'gpg --export --armor foo@example.com' (either LF or CRLF line endings). When using this field, id should be left blank. The BinAuthz API handlers will calculate the ID and fill it in automatically. BinAuthz computes this ID as the OpenPGP RFC4880 V4 fingerprint, represented as upper-case hex. If id is provided by the caller, it will be overwritten by the API-calculated ID."""
        return self._values.get('ascii_armored_pgp_public_key')

    @builtins.property
    def comment(self) -> typing.Optional[str]:
        """A descriptive comment.

        This field may be updated.
        """
        return self._values.get('comment')

    @builtins.property
    def id(self) -> typing.Optional[str]:
        """The ID of this public key.

        Signatures verified by BinAuthz
        must include the ID of the public key that can be used to
        verify them, and that ID must match the contents of this
        field exactly. Additional restrictions on this field can
        be imposed based on which public key type is encapsulated.
        See the documentation on publicKey cases below for details.
        """
        return self._values.get('id')

    @builtins.property
    def pkix_public_key(self) -> typing.Optional[typing.List["BinaryAuthorizationAttestorAttestationAuthorityNotePublicKeysPkixPublicKey"]]:
        """pkix_public_key block."""
        return self._values.get('pkix_public_key')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationAttestorAttestationAuthorityNotePublicKeys(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorAttestationAuthorityNotePublicKeysPkixPublicKey", jsii_struct_bases=[], name_mapping={'public_key_pem': 'publicKeyPem', 'signature_algorithm': 'signatureAlgorithm'})
class BinaryAuthorizationAttestorAttestationAuthorityNotePublicKeysPkixPublicKey():
    def __init__(self, *, public_key_pem: typing.Optional[str]=None, signature_algorithm: typing.Optional[str]=None) -> None:
        """
        :param public_key_pem: A PEM-encoded public key, as described in 'https://tools.ietf.org/html/rfc7468#section-13'.
        :param signature_algorithm: The signature algorithm used to verify a message against a signature using this key. These signature algorithm must match the structure and any object identifiers encoded in publicKeyPem (i.e. this algorithm must match that of the public key).
        """
        self._values = {
        }
        if public_key_pem is not None: self._values["public_key_pem"] = public_key_pem
        if signature_algorithm is not None: self._values["signature_algorithm"] = signature_algorithm

    @builtins.property
    def public_key_pem(self) -> typing.Optional[str]:
        """A PEM-encoded public key, as described in 'https://tools.ietf.org/html/rfc7468#section-13'."""
        return self._values.get('public_key_pem')

    @builtins.property
    def signature_algorithm(self) -> typing.Optional[str]:
        """The signature algorithm used to verify a message against a signature using this key.

        These signature algorithm must
        match the structure and any object identifiers encoded in
        publicKeyPem (i.e. this algorithm must match that of the
        public key).
        """
        return self._values.get('signature_algorithm')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationAttestorAttestationAuthorityNotePublicKeysPkixPublicKey(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'attestation_authority_note': 'attestationAuthorityNote', 'name': 'name', 'description': 'description', 'project': 'project', 'timeouts': 'timeouts'})
class BinaryAuthorizationAttestorConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, attestation_authority_note: typing.List["BinaryAuthorizationAttestorAttestationAuthorityNote"], name: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["BinaryAuthorizationAttestorTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param attestation_authority_note: attestation_authority_note block.
        :param name: The resource name.
        :param description: A descriptive comment. This field may be updated. The field may be displayed in chooser dialogs.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = BinaryAuthorizationAttestorTimeouts(**timeouts)
        self._values = {
            'attestation_authority_note': attestation_authority_note,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def attestation_authority_note(self) -> typing.List["BinaryAuthorizationAttestorAttestationAuthorityNote"]:
        """attestation_authority_note block."""
        return self._values.get('attestation_authority_note')

    @builtins.property
    def name(self) -> str:
        """The resource name."""
        return self._values.get('name')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A descriptive comment.

        This field may be updated. The field may be
        displayed in chooser dialogs.
        """
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["BinaryAuthorizationAttestorTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationAttestorConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BinaryAuthorizationAttestorIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, attestor: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["BinaryAuthorizationAttestorIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param attestor: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BinaryAuthorizationAttestorIamBindingConfig(attestor=attestor, members=members, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BinaryAuthorizationAttestorIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="attestor")
    def attestor(self) -> str:
        return jsii.get(self, "attestor")

    @attestor.setter
    def attestor(self, value: str) -> None:
        jsii.set(self, "attestor", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["BinaryAuthorizationAttestorIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["BinaryAuthorizationAttestorIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class BinaryAuthorizationAttestorIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationAttestorIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'attestor': 'attestor', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class BinaryAuthorizationAttestorIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, attestor: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["BinaryAuthorizationAttestorIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param attestor: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'attestor': attestor,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def attestor(self) -> str:
        return self._values.get('attestor')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["BinaryAuthorizationAttestorIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationAttestorIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BinaryAuthorizationAttestorIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, attestor: str, member: str, role: str, condition: typing.Optional[typing.List["BinaryAuthorizationAttestorIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param attestor: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BinaryAuthorizationAttestorIamMemberConfig(attestor=attestor, member=member, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BinaryAuthorizationAttestorIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="attestor")
    def attestor(self) -> str:
        return jsii.get(self, "attestor")

    @attestor.setter
    def attestor(self, value: str) -> None:
        jsii.set(self, "attestor", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["BinaryAuthorizationAttestorIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["BinaryAuthorizationAttestorIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class BinaryAuthorizationAttestorIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationAttestorIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'attestor': 'attestor', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class BinaryAuthorizationAttestorIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, attestor: str, member: str, role: str, condition: typing.Optional[typing.List["BinaryAuthorizationAttestorIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param attestor: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'attestor': attestor,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def attestor(self) -> str:
        return self._values.get('attestor')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["BinaryAuthorizationAttestorIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationAttestorIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BinaryAuthorizationAttestorIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, attestor: str, policy_data: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param attestor: 
        :param policy_data: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BinaryAuthorizationAttestorIamPolicyConfig(attestor=attestor, policy_data=policy_data, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BinaryAuthorizationAttestorIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="attestor")
    def attestor(self) -> str:
        return jsii.get(self, "attestor")

    @attestor.setter
    def attestor(self, value: str) -> None:
        jsii.set(self, "attestor", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'attestor': 'attestor', 'policy_data': 'policyData', 'project': 'project'})
class BinaryAuthorizationAttestorIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, attestor: str, policy_data: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param attestor: 
        :param policy_data: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'attestor': attestor,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def attestor(self) -> str:
        return self._values.get('attestor')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationAttestorIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationAttestorTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class BinaryAuthorizationAttestorTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationAttestorTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class BinaryAuthorizationPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.BinaryAuthorizationPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, default_admission_rule: typing.List["BinaryAuthorizationPolicyDefaultAdmissionRule"], admission_whitelist_patterns: typing.Optional[typing.List["BinaryAuthorizationPolicyAdmissionWhitelistPatterns"]]=None, cluster_admission_rules: typing.Optional[typing.List["BinaryAuthorizationPolicyClusterAdmissionRules"]]=None, description: typing.Optional[str]=None, global_policy_evaluation_mode: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["BinaryAuthorizationPolicyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param default_admission_rule: default_admission_rule block.
        :param admission_whitelist_patterns: admission_whitelist_patterns block.
        :param cluster_admission_rules: cluster_admission_rules block.
        :param description: A descriptive comment.
        :param global_policy_evaluation_mode: Controls the evaluation of a Google-maintained global admission policy for common system-level images. Images not covered by the global policy will be subject to the project admission policy. Possible values: ["ENABLE", "DISABLE"]
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = BinaryAuthorizationPolicyConfig(default_admission_rule=default_admission_rule, admission_whitelist_patterns=admission_whitelist_patterns, cluster_admission_rules=cluster_admission_rules, description=description, global_policy_evaluation_mode=global_policy_evaluation_mode, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(BinaryAuthorizationPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="defaultAdmissionRule")
    def default_admission_rule(self) -> typing.List["BinaryAuthorizationPolicyDefaultAdmissionRule"]:
        return jsii.get(self, "defaultAdmissionRule")

    @default_admission_rule.setter
    def default_admission_rule(self, value: typing.List["BinaryAuthorizationPolicyDefaultAdmissionRule"]) -> None:
        jsii.set(self, "defaultAdmissionRule", value)

    @builtins.property
    @jsii.member(jsii_name="admissionWhitelistPatterns")
    def admission_whitelist_patterns(self) -> typing.Optional[typing.List["BinaryAuthorizationPolicyAdmissionWhitelistPatterns"]]:
        return jsii.get(self, "admissionWhitelistPatterns")

    @admission_whitelist_patterns.setter
    def admission_whitelist_patterns(self, value: typing.Optional[typing.List["BinaryAuthorizationPolicyAdmissionWhitelistPatterns"]]) -> None:
        jsii.set(self, "admissionWhitelistPatterns", value)

    @builtins.property
    @jsii.member(jsii_name="clusterAdmissionRules")
    def cluster_admission_rules(self) -> typing.Optional[typing.List["BinaryAuthorizationPolicyClusterAdmissionRules"]]:
        return jsii.get(self, "clusterAdmissionRules")

    @cluster_admission_rules.setter
    def cluster_admission_rules(self, value: typing.Optional[typing.List["BinaryAuthorizationPolicyClusterAdmissionRules"]]) -> None:
        jsii.set(self, "clusterAdmissionRules", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="globalPolicyEvaluationMode")
    def global_policy_evaluation_mode(self) -> typing.Optional[str]:
        return jsii.get(self, "globalPolicyEvaluationMode")

    @global_policy_evaluation_mode.setter
    def global_policy_evaluation_mode(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "globalPolicyEvaluationMode", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["BinaryAuthorizationPolicyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["BinaryAuthorizationPolicyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationPolicyAdmissionWhitelistPatterns", jsii_struct_bases=[], name_mapping={'name_pattern': 'namePattern'})
class BinaryAuthorizationPolicyAdmissionWhitelistPatterns():
    def __init__(self, *, name_pattern: str) -> None:
        """
        :param name_pattern: An image name pattern to whitelist, in the form 'registry/path/to/image'. This supports a trailing * as a wildcard, but this is allowed only in text after the registry/ part.
        """
        self._values = {
            'name_pattern': name_pattern,
        }

    @builtins.property
    def name_pattern(self) -> str:
        """An image name pattern to whitelist, in the form 'registry/path/to/image'.

        This supports a trailing * as a
        wildcard, but this is allowed only in text after the registry/
        part.
        """
        return self._values.get('name_pattern')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationPolicyAdmissionWhitelistPatterns(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationPolicyClusterAdmissionRules", jsii_struct_bases=[], name_mapping={'cluster': 'cluster', 'enforcement_mode': 'enforcementMode', 'evaluation_mode': 'evaluationMode', 'require_attestations_by': 'requireAttestationsBy'})
class BinaryAuthorizationPolicyClusterAdmissionRules():
    def __init__(self, *, cluster: str, enforcement_mode: str, evaluation_mode: str, require_attestations_by: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param cluster: 
        :param enforcement_mode: The action when a pod creation is denied by the admission rule. Possible values: ["ENFORCED_BLOCK_AND_AUDIT_LOG", "DRYRUN_AUDIT_LOG_ONLY"]
        :param evaluation_mode: How this admission rule will be evaluated. Possible values: ["ALWAYS_ALLOW", "REQUIRE_ATTESTATION", "ALWAYS_DENY"]
        :param require_attestations_by: The resource names of the attestors that must attest to a container image. If the attestor is in a different project from the policy, it should be specified in the format 'projects/*/attestors/*'. Each attestor must exist before a policy can reference it. To add an attestor to a policy the principal issuing the policy change request must be able to read the attestor resource. Note: this field must be non-empty when the evaluation_mode field specifies REQUIRE_ATTESTATION, otherwise it must be empty.
        """
        self._values = {
            'cluster': cluster,
            'enforcement_mode': enforcement_mode,
            'evaluation_mode': evaluation_mode,
        }
        if require_attestations_by is not None: self._values["require_attestations_by"] = require_attestations_by

    @builtins.property
    def cluster(self) -> str:
        return self._values.get('cluster')

    @builtins.property
    def enforcement_mode(self) -> str:
        """The action when a pod creation is denied by the admission rule.

        Possible values: ["ENFORCED_BLOCK_AND_AUDIT_LOG", "DRYRUN_AUDIT_LOG_ONLY"]
        """
        return self._values.get('enforcement_mode')

    @builtins.property
    def evaluation_mode(self) -> str:
        """How this admission rule will be evaluated.

        Possible values: ["ALWAYS_ALLOW", "REQUIRE_ATTESTATION", "ALWAYS_DENY"]
        """
        return self._values.get('evaluation_mode')

    @builtins.property
    def require_attestations_by(self) -> typing.Optional[typing.List[str]]:
        """The resource names of the attestors that must attest to a container image.

        If the attestor is in a different project from the
        policy, it should be specified in the format 'projects/*/attestors/*'.
        Each attestor must exist before a policy can reference it. To add an
        attestor to a policy the principal issuing the policy change
        request must be able to read the attestor resource.

        Note: this field must be non-empty when the evaluation_mode field
        specifies REQUIRE_ATTESTATION, otherwise it must be empty.
        """
        return self._values.get('require_attestations_by')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationPolicyClusterAdmissionRules(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'default_admission_rule': 'defaultAdmissionRule', 'admission_whitelist_patterns': 'admissionWhitelistPatterns', 'cluster_admission_rules': 'clusterAdmissionRules', 'description': 'description', 'global_policy_evaluation_mode': 'globalPolicyEvaluationMode', 'project': 'project', 'timeouts': 'timeouts'})
class BinaryAuthorizationPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, default_admission_rule: typing.List["BinaryAuthorizationPolicyDefaultAdmissionRule"], admission_whitelist_patterns: typing.Optional[typing.List["BinaryAuthorizationPolicyAdmissionWhitelistPatterns"]]=None, cluster_admission_rules: typing.Optional[typing.List["BinaryAuthorizationPolicyClusterAdmissionRules"]]=None, description: typing.Optional[str]=None, global_policy_evaluation_mode: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["BinaryAuthorizationPolicyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param default_admission_rule: default_admission_rule block.
        :param admission_whitelist_patterns: admission_whitelist_patterns block.
        :param cluster_admission_rules: cluster_admission_rules block.
        :param description: A descriptive comment.
        :param global_policy_evaluation_mode: Controls the evaluation of a Google-maintained global admission policy for common system-level images. Images not covered by the global policy will be subject to the project admission policy. Possible values: ["ENABLE", "DISABLE"]
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = BinaryAuthorizationPolicyTimeouts(**timeouts)
        self._values = {
            'default_admission_rule': default_admission_rule,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if admission_whitelist_patterns is not None: self._values["admission_whitelist_patterns"] = admission_whitelist_patterns
        if cluster_admission_rules is not None: self._values["cluster_admission_rules"] = cluster_admission_rules
        if description is not None: self._values["description"] = description
        if global_policy_evaluation_mode is not None: self._values["global_policy_evaluation_mode"] = global_policy_evaluation_mode
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def default_admission_rule(self) -> typing.List["BinaryAuthorizationPolicyDefaultAdmissionRule"]:
        """default_admission_rule block."""
        return self._values.get('default_admission_rule')

    @builtins.property
    def admission_whitelist_patterns(self) -> typing.Optional[typing.List["BinaryAuthorizationPolicyAdmissionWhitelistPatterns"]]:
        """admission_whitelist_patterns block."""
        return self._values.get('admission_whitelist_patterns')

    @builtins.property
    def cluster_admission_rules(self) -> typing.Optional[typing.List["BinaryAuthorizationPolicyClusterAdmissionRules"]]:
        """cluster_admission_rules block."""
        return self._values.get('cluster_admission_rules')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A descriptive comment."""
        return self._values.get('description')

    @builtins.property
    def global_policy_evaluation_mode(self) -> typing.Optional[str]:
        """Controls the evaluation of a Google-maintained global admission policy for common system-level images.

        Images not covered by the global
        policy will be subject to the project admission policy. Possible values: ["ENABLE", "DISABLE"]
        """
        return self._values.get('global_policy_evaluation_mode')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["BinaryAuthorizationPolicyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationPolicyDefaultAdmissionRule", jsii_struct_bases=[], name_mapping={'enforcement_mode': 'enforcementMode', 'evaluation_mode': 'evaluationMode', 'require_attestations_by': 'requireAttestationsBy'})
class BinaryAuthorizationPolicyDefaultAdmissionRule():
    def __init__(self, *, enforcement_mode: str, evaluation_mode: str, require_attestations_by: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param enforcement_mode: The action when a pod creation is denied by the admission rule. Possible values: ["ENFORCED_BLOCK_AND_AUDIT_LOG", "DRYRUN_AUDIT_LOG_ONLY"]
        :param evaluation_mode: How this admission rule will be evaluated. Possible values: ["ALWAYS_ALLOW", "REQUIRE_ATTESTATION", "ALWAYS_DENY"]
        :param require_attestations_by: The resource names of the attestors that must attest to a container image. If the attestor is in a different project from the policy, it should be specified in the format 'projects/*/attestors/*'. Each attestor must exist before a policy can reference it. To add an attestor to a policy the principal issuing the policy change request must be able to read the attestor resource. Note: this field must be non-empty when the evaluation_mode field specifies REQUIRE_ATTESTATION, otherwise it must be empty.
        """
        self._values = {
            'enforcement_mode': enforcement_mode,
            'evaluation_mode': evaluation_mode,
        }
        if require_attestations_by is not None: self._values["require_attestations_by"] = require_attestations_by

    @builtins.property
    def enforcement_mode(self) -> str:
        """The action when a pod creation is denied by the admission rule.

        Possible values: ["ENFORCED_BLOCK_AND_AUDIT_LOG", "DRYRUN_AUDIT_LOG_ONLY"]
        """
        return self._values.get('enforcement_mode')

    @builtins.property
    def evaluation_mode(self) -> str:
        """How this admission rule will be evaluated.

        Possible values: ["ALWAYS_ALLOW", "REQUIRE_ATTESTATION", "ALWAYS_DENY"]
        """
        return self._values.get('evaluation_mode')

    @builtins.property
    def require_attestations_by(self) -> typing.Optional[typing.List[str]]:
        """The resource names of the attestors that must attest to a container image.

        If the attestor is in a different project from the
        policy, it should be specified in the format 'projects/*/attestors/*'.
        Each attestor must exist before a policy can reference it. To add an
        attestor to a policy the principal issuing the policy change
        request must be able to read the attestor resource.

        Note: this field must be non-empty when the evaluation_mode field
        specifies REQUIRE_ATTESTATION, otherwise it must be empty.
        """
        return self._values.get('require_attestations_by')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationPolicyDefaultAdmissionRule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.BinaryAuthorizationPolicyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class BinaryAuthorizationPolicyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'BinaryAuthorizationPolicyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudAssetFolderFeed(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudAssetFolderFeed"):
    def __init__(self, scope: constructs.Construct, id: str, *, billing_project: str, feed_id: str, feed_output_config: typing.List["CloudAssetFolderFeedFeedOutputConfig"], folder: str, asset_names: typing.Optional[typing.List[str]]=None, asset_types: typing.Optional[typing.List[str]]=None, content_type: typing.Optional[str]=None, timeouts: typing.Optional["CloudAssetFolderFeedTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param billing_project: The project whose identity will be used when sending messages to the destination pubsub topic. It also specifies the project for API enablement check, quota, and billing.
        :param feed_id: This is the client-assigned asset feed identifier and it needs to be unique under a specific parent.
        :param feed_output_config: feed_output_config block.
        :param folder: The folder this feed should be created in.
        :param asset_names: A list of the full names of the assets to receive updates. You must specify either or both of assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to the feed. For example: //compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1. See https://cloud.google.com/apis/design/resourceNames#fullResourceName for more info.
        :param asset_types: A list of types of the assets to receive updates. You must specify either or both of assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to the feed. For example: "compute.googleapis.com/Disk" See https://cloud.google.com/asset-inventory/docs/supported-asset-types for a list of all supported asset types.
        :param content_type: Asset content type. If not specified, no content but the asset name and type will be returned. Possible values: ["CONTENT_TYPE_UNSPECIFIED", "RESOURCE", "IAM_POLICY", "ORG_POLICY", "ACCESS_POLICY"]
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudAssetFolderFeedConfig(billing_project=billing_project, feed_id=feed_id, feed_output_config=feed_output_config, folder=folder, asset_names=asset_names, asset_types=asset_types, content_type=content_type, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudAssetFolderFeed, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="folderId")
    def folder_id(self) -> str:
        return jsii.get(self, "folderId")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="billingProject")
    def billing_project(self) -> str:
        return jsii.get(self, "billingProject")

    @billing_project.setter
    def billing_project(self, value: str) -> None:
        jsii.set(self, "billingProject", value)

    @builtins.property
    @jsii.member(jsii_name="feedId")
    def feed_id(self) -> str:
        return jsii.get(self, "feedId")

    @feed_id.setter
    def feed_id(self, value: str) -> None:
        jsii.set(self, "feedId", value)

    @builtins.property
    @jsii.member(jsii_name="feedOutputConfig")
    def feed_output_config(self) -> typing.List["CloudAssetFolderFeedFeedOutputConfig"]:
        return jsii.get(self, "feedOutputConfig")

    @feed_output_config.setter
    def feed_output_config(self, value: typing.List["CloudAssetFolderFeedFeedOutputConfig"]) -> None:
        jsii.set(self, "feedOutputConfig", value)

    @builtins.property
    @jsii.member(jsii_name="folder")
    def folder(self) -> str:
        return jsii.get(self, "folder")

    @folder.setter
    def folder(self, value: str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property
    @jsii.member(jsii_name="assetNames")
    def asset_names(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "assetNames")

    @asset_names.setter
    def asset_names(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "assetNames", value)

    @builtins.property
    @jsii.member(jsii_name="assetTypes")
    def asset_types(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "assetTypes")

    @asset_types.setter
    def asset_types(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "assetTypes", value)

    @builtins.property
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> typing.Optional[str]:
        return jsii.get(self, "contentType")

    @content_type.setter
    def content_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "contentType", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["CloudAssetFolderFeedTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["CloudAssetFolderFeedTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudAssetFolderFeedConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'billing_project': 'billingProject', 'feed_id': 'feedId', 'feed_output_config': 'feedOutputConfig', 'folder': 'folder', 'asset_names': 'assetNames', 'asset_types': 'assetTypes', 'content_type': 'contentType', 'timeouts': 'timeouts'})
class CloudAssetFolderFeedConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, billing_project: str, feed_id: str, feed_output_config: typing.List["CloudAssetFolderFeedFeedOutputConfig"], folder: str, asset_names: typing.Optional[typing.List[str]]=None, asset_types: typing.Optional[typing.List[str]]=None, content_type: typing.Optional[str]=None, timeouts: typing.Optional["CloudAssetFolderFeedTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param billing_project: The project whose identity will be used when sending messages to the destination pubsub topic. It also specifies the project for API enablement check, quota, and billing.
        :param feed_id: This is the client-assigned asset feed identifier and it needs to be unique under a specific parent.
        :param feed_output_config: feed_output_config block.
        :param folder: The folder this feed should be created in.
        :param asset_names: A list of the full names of the assets to receive updates. You must specify either or both of assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to the feed. For example: //compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1. See https://cloud.google.com/apis/design/resourceNames#fullResourceName for more info.
        :param asset_types: A list of types of the assets to receive updates. You must specify either or both of assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to the feed. For example: "compute.googleapis.com/Disk" See https://cloud.google.com/asset-inventory/docs/supported-asset-types for a list of all supported asset types.
        :param content_type: Asset content type. If not specified, no content but the asset name and type will be returned. Possible values: ["CONTENT_TYPE_UNSPECIFIED", "RESOURCE", "IAM_POLICY", "ORG_POLICY", "ACCESS_POLICY"]
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = CloudAssetFolderFeedTimeouts(**timeouts)
        self._values = {
            'billing_project': billing_project,
            'feed_id': feed_id,
            'feed_output_config': feed_output_config,
            'folder': folder,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if asset_names is not None: self._values["asset_names"] = asset_names
        if asset_types is not None: self._values["asset_types"] = asset_types
        if content_type is not None: self._values["content_type"] = content_type
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def billing_project(self) -> str:
        """The project whose identity will be used when sending messages to the destination pubsub topic.

        It also specifies the project for API
        enablement check, quota, and billing.
        """
        return self._values.get('billing_project')

    @builtins.property
    def feed_id(self) -> str:
        """This is the client-assigned asset feed identifier and it needs to be unique under a specific parent."""
        return self._values.get('feed_id')

    @builtins.property
    def feed_output_config(self) -> typing.List["CloudAssetFolderFeedFeedOutputConfig"]:
        """feed_output_config block."""
        return self._values.get('feed_output_config')

    @builtins.property
    def folder(self) -> str:
        """The folder this feed should be created in."""
        return self._values.get('folder')

    @builtins.property
    def asset_names(self) -> typing.Optional[typing.List[str]]:
        """A list of the full names of the assets to receive updates.

        You must specify either or both of
        assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are
        exported to the feed. For example: //compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1.
        See https://cloud.google.com/apis/design/resourceNames#fullResourceName for more info.
        """
        return self._values.get('asset_names')

    @builtins.property
    def asset_types(self) -> typing.Optional[typing.List[str]]:
        """A list of types of the assets to receive updates.

        You must specify either or both of assetNames
        and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to
        the feed. For example: "compute.googleapis.com/Disk"
        See https://cloud.google.com/asset-inventory/docs/supported-asset-types for a list of all
        supported asset types.
        """
        return self._values.get('asset_types')

    @builtins.property
    def content_type(self) -> typing.Optional[str]:
        """Asset content type.

        If not specified, no content but the asset name and type will be returned. Possible values: ["CONTENT_TYPE_UNSPECIFIED", "RESOURCE", "IAM_POLICY", "ORG_POLICY", "ACCESS_POLICY"]
        """
        return self._values.get('content_type')

    @builtins.property
    def timeouts(self) -> typing.Optional["CloudAssetFolderFeedTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudAssetFolderFeedConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudAssetFolderFeedFeedOutputConfig", jsii_struct_bases=[], name_mapping={'pubsub_destination': 'pubsubDestination'})
class CloudAssetFolderFeedFeedOutputConfig():
    def __init__(self, *, pubsub_destination: typing.List["CloudAssetFolderFeedFeedOutputConfigPubsubDestination"]) -> None:
        """
        :param pubsub_destination: pubsub_destination block.
        """
        self._values = {
            'pubsub_destination': pubsub_destination,
        }

    @builtins.property
    def pubsub_destination(self) -> typing.List["CloudAssetFolderFeedFeedOutputConfigPubsubDestination"]:
        """pubsub_destination block."""
        return self._values.get('pubsub_destination')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudAssetFolderFeedFeedOutputConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudAssetFolderFeedFeedOutputConfigPubsubDestination", jsii_struct_bases=[], name_mapping={'topic': 'topic'})
class CloudAssetFolderFeedFeedOutputConfigPubsubDestination():
    def __init__(self, *, topic: str) -> None:
        """
        :param topic: Destination on Cloud Pubsub topic.
        """
        self._values = {
            'topic': topic,
        }

    @builtins.property
    def topic(self) -> str:
        """Destination on Cloud Pubsub topic."""
        return self._values.get('topic')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudAssetFolderFeedFeedOutputConfigPubsubDestination(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudAssetFolderFeedTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class CloudAssetFolderFeedTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudAssetFolderFeedTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudAssetOrganizationFeed(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudAssetOrganizationFeed"):
    def __init__(self, scope: constructs.Construct, id: str, *, billing_project: str, feed_id: str, feed_output_config: typing.List["CloudAssetOrganizationFeedFeedOutputConfig"], org_id: str, asset_names: typing.Optional[typing.List[str]]=None, asset_types: typing.Optional[typing.List[str]]=None, content_type: typing.Optional[str]=None, timeouts: typing.Optional["CloudAssetOrganizationFeedTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param billing_project: The project whose identity will be used when sending messages to the destination pubsub topic. It also specifies the project for API enablement check, quota, and billing.
        :param feed_id: This is the client-assigned asset feed identifier and it needs to be unique under a specific parent.
        :param feed_output_config: feed_output_config block.
        :param org_id: The organization this feed should be created in.
        :param asset_names: A list of the full names of the assets to receive updates. You must specify either or both of assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to the feed. For example: //compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1. See https://cloud.google.com/apis/design/resourceNames#fullResourceName for more info.
        :param asset_types: A list of types of the assets to receive updates. You must specify either or both of assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to the feed. For example: "compute.googleapis.com/Disk" See https://cloud.google.com/asset-inventory/docs/supported-asset-types for a list of all supported asset types.
        :param content_type: Asset content type. If not specified, no content but the asset name and type will be returned. Possible values: ["CONTENT_TYPE_UNSPECIFIED", "RESOURCE", "IAM_POLICY", "ORG_POLICY", "ACCESS_POLICY"]
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudAssetOrganizationFeedConfig(billing_project=billing_project, feed_id=feed_id, feed_output_config=feed_output_config, org_id=org_id, asset_names=asset_names, asset_types=asset_types, content_type=content_type, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudAssetOrganizationFeed, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="billingProject")
    def billing_project(self) -> str:
        return jsii.get(self, "billingProject")

    @billing_project.setter
    def billing_project(self, value: str) -> None:
        jsii.set(self, "billingProject", value)

    @builtins.property
    @jsii.member(jsii_name="feedId")
    def feed_id(self) -> str:
        return jsii.get(self, "feedId")

    @feed_id.setter
    def feed_id(self, value: str) -> None:
        jsii.set(self, "feedId", value)

    @builtins.property
    @jsii.member(jsii_name="feedOutputConfig")
    def feed_output_config(self) -> typing.List["CloudAssetOrganizationFeedFeedOutputConfig"]:
        return jsii.get(self, "feedOutputConfig")

    @feed_output_config.setter
    def feed_output_config(self, value: typing.List["CloudAssetOrganizationFeedFeedOutputConfig"]) -> None:
        jsii.set(self, "feedOutputConfig", value)

    @builtins.property
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> str:
        return jsii.get(self, "orgId")

    @org_id.setter
    def org_id(self, value: str) -> None:
        jsii.set(self, "orgId", value)

    @builtins.property
    @jsii.member(jsii_name="assetNames")
    def asset_names(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "assetNames")

    @asset_names.setter
    def asset_names(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "assetNames", value)

    @builtins.property
    @jsii.member(jsii_name="assetTypes")
    def asset_types(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "assetTypes")

    @asset_types.setter
    def asset_types(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "assetTypes", value)

    @builtins.property
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> typing.Optional[str]:
        return jsii.get(self, "contentType")

    @content_type.setter
    def content_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "contentType", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["CloudAssetOrganizationFeedTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["CloudAssetOrganizationFeedTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudAssetOrganizationFeedConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'billing_project': 'billingProject', 'feed_id': 'feedId', 'feed_output_config': 'feedOutputConfig', 'org_id': 'orgId', 'asset_names': 'assetNames', 'asset_types': 'assetTypes', 'content_type': 'contentType', 'timeouts': 'timeouts'})
class CloudAssetOrganizationFeedConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, billing_project: str, feed_id: str, feed_output_config: typing.List["CloudAssetOrganizationFeedFeedOutputConfig"], org_id: str, asset_names: typing.Optional[typing.List[str]]=None, asset_types: typing.Optional[typing.List[str]]=None, content_type: typing.Optional[str]=None, timeouts: typing.Optional["CloudAssetOrganizationFeedTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param billing_project: The project whose identity will be used when sending messages to the destination pubsub topic. It also specifies the project for API enablement check, quota, and billing.
        :param feed_id: This is the client-assigned asset feed identifier and it needs to be unique under a specific parent.
        :param feed_output_config: feed_output_config block.
        :param org_id: The organization this feed should be created in.
        :param asset_names: A list of the full names of the assets to receive updates. You must specify either or both of assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to the feed. For example: //compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1. See https://cloud.google.com/apis/design/resourceNames#fullResourceName for more info.
        :param asset_types: A list of types of the assets to receive updates. You must specify either or both of assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to the feed. For example: "compute.googleapis.com/Disk" See https://cloud.google.com/asset-inventory/docs/supported-asset-types for a list of all supported asset types.
        :param content_type: Asset content type. If not specified, no content but the asset name and type will be returned. Possible values: ["CONTENT_TYPE_UNSPECIFIED", "RESOURCE", "IAM_POLICY", "ORG_POLICY", "ACCESS_POLICY"]
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = CloudAssetOrganizationFeedTimeouts(**timeouts)
        self._values = {
            'billing_project': billing_project,
            'feed_id': feed_id,
            'feed_output_config': feed_output_config,
            'org_id': org_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if asset_names is not None: self._values["asset_names"] = asset_names
        if asset_types is not None: self._values["asset_types"] = asset_types
        if content_type is not None: self._values["content_type"] = content_type
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def billing_project(self) -> str:
        """The project whose identity will be used when sending messages to the destination pubsub topic.

        It also specifies the project for API
        enablement check, quota, and billing.
        """
        return self._values.get('billing_project')

    @builtins.property
    def feed_id(self) -> str:
        """This is the client-assigned asset feed identifier and it needs to be unique under a specific parent."""
        return self._values.get('feed_id')

    @builtins.property
    def feed_output_config(self) -> typing.List["CloudAssetOrganizationFeedFeedOutputConfig"]:
        """feed_output_config block."""
        return self._values.get('feed_output_config')

    @builtins.property
    def org_id(self) -> str:
        """The organization this feed should be created in."""
        return self._values.get('org_id')

    @builtins.property
    def asset_names(self) -> typing.Optional[typing.List[str]]:
        """A list of the full names of the assets to receive updates.

        You must specify either or both of
        assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are
        exported to the feed. For example: //compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1.
        See https://cloud.google.com/apis/design/resourceNames#fullResourceName for more info.
        """
        return self._values.get('asset_names')

    @builtins.property
    def asset_types(self) -> typing.Optional[typing.List[str]]:
        """A list of types of the assets to receive updates.

        You must specify either or both of assetNames
        and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to
        the feed. For example: "compute.googleapis.com/Disk"
        See https://cloud.google.com/asset-inventory/docs/supported-asset-types for a list of all
        supported asset types.
        """
        return self._values.get('asset_types')

    @builtins.property
    def content_type(self) -> typing.Optional[str]:
        """Asset content type.

        If not specified, no content but the asset name and type will be returned. Possible values: ["CONTENT_TYPE_UNSPECIFIED", "RESOURCE", "IAM_POLICY", "ORG_POLICY", "ACCESS_POLICY"]
        """
        return self._values.get('content_type')

    @builtins.property
    def timeouts(self) -> typing.Optional["CloudAssetOrganizationFeedTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudAssetOrganizationFeedConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudAssetOrganizationFeedFeedOutputConfig", jsii_struct_bases=[], name_mapping={'pubsub_destination': 'pubsubDestination'})
class CloudAssetOrganizationFeedFeedOutputConfig():
    def __init__(self, *, pubsub_destination: typing.List["CloudAssetOrganizationFeedFeedOutputConfigPubsubDestination"]) -> None:
        """
        :param pubsub_destination: pubsub_destination block.
        """
        self._values = {
            'pubsub_destination': pubsub_destination,
        }

    @builtins.property
    def pubsub_destination(self) -> typing.List["CloudAssetOrganizationFeedFeedOutputConfigPubsubDestination"]:
        """pubsub_destination block."""
        return self._values.get('pubsub_destination')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudAssetOrganizationFeedFeedOutputConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudAssetOrganizationFeedFeedOutputConfigPubsubDestination", jsii_struct_bases=[], name_mapping={'topic': 'topic'})
class CloudAssetOrganizationFeedFeedOutputConfigPubsubDestination():
    def __init__(self, *, topic: str) -> None:
        """
        :param topic: Destination on Cloud Pubsub topic.
        """
        self._values = {
            'topic': topic,
        }

    @builtins.property
    def topic(self) -> str:
        """Destination on Cloud Pubsub topic."""
        return self._values.get('topic')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudAssetOrganizationFeedFeedOutputConfigPubsubDestination(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudAssetOrganizationFeedTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class CloudAssetOrganizationFeedTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudAssetOrganizationFeedTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudAssetProjectFeed(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudAssetProjectFeed"):
    def __init__(self, scope: constructs.Construct, id: str, *, feed_id: str, feed_output_config: typing.List["CloudAssetProjectFeedFeedOutputConfig"], asset_names: typing.Optional[typing.List[str]]=None, asset_types: typing.Optional[typing.List[str]]=None, billing_project: typing.Optional[str]=None, content_type: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["CloudAssetProjectFeedTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param feed_id: This is the client-assigned asset feed identifier and it needs to be unique under a specific parent.
        :param feed_output_config: feed_output_config block.
        :param asset_names: A list of the full names of the assets to receive updates. You must specify either or both of assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to the feed. For example: //compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1. See https://cloud.google.com/apis/design/resourceNames#fullResourceName for more info.
        :param asset_types: A list of types of the assets to receive updates. You must specify either or both of assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to the feed. For example: "compute.googleapis.com/Disk" See https://cloud.google.com/asset-inventory/docs/supported-asset-types for a list of all supported asset types.
        :param billing_project: The project whose identity will be used when sending messages to the destination pubsub topic. It also specifies the project for API enablement check, quota, and billing. If not specified, the resource's project will be used.
        :param content_type: Asset content type. If not specified, no content but the asset name and type will be returned. Possible values: ["CONTENT_TYPE_UNSPECIFIED", "RESOURCE", "IAM_POLICY", "ORG_POLICY", "ACCESS_POLICY"]
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudAssetProjectFeedConfig(feed_id=feed_id, feed_output_config=feed_output_config, asset_names=asset_names, asset_types=asset_types, billing_project=billing_project, content_type=content_type, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudAssetProjectFeed, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="feedId")
    def feed_id(self) -> str:
        return jsii.get(self, "feedId")

    @feed_id.setter
    def feed_id(self, value: str) -> None:
        jsii.set(self, "feedId", value)

    @builtins.property
    @jsii.member(jsii_name="feedOutputConfig")
    def feed_output_config(self) -> typing.List["CloudAssetProjectFeedFeedOutputConfig"]:
        return jsii.get(self, "feedOutputConfig")

    @feed_output_config.setter
    def feed_output_config(self, value: typing.List["CloudAssetProjectFeedFeedOutputConfig"]) -> None:
        jsii.set(self, "feedOutputConfig", value)

    @builtins.property
    @jsii.member(jsii_name="assetNames")
    def asset_names(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "assetNames")

    @asset_names.setter
    def asset_names(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "assetNames", value)

    @builtins.property
    @jsii.member(jsii_name="assetTypes")
    def asset_types(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "assetTypes")

    @asset_types.setter
    def asset_types(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "assetTypes", value)

    @builtins.property
    @jsii.member(jsii_name="billingProject")
    def billing_project(self) -> typing.Optional[str]:
        return jsii.get(self, "billingProject")

    @billing_project.setter
    def billing_project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "billingProject", value)

    @builtins.property
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> typing.Optional[str]:
        return jsii.get(self, "contentType")

    @content_type.setter
    def content_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "contentType", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["CloudAssetProjectFeedTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["CloudAssetProjectFeedTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudAssetProjectFeedConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'feed_id': 'feedId', 'feed_output_config': 'feedOutputConfig', 'asset_names': 'assetNames', 'asset_types': 'assetTypes', 'billing_project': 'billingProject', 'content_type': 'contentType', 'project': 'project', 'timeouts': 'timeouts'})
class CloudAssetProjectFeedConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, feed_id: str, feed_output_config: typing.List["CloudAssetProjectFeedFeedOutputConfig"], asset_names: typing.Optional[typing.List[str]]=None, asset_types: typing.Optional[typing.List[str]]=None, billing_project: typing.Optional[str]=None, content_type: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["CloudAssetProjectFeedTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param feed_id: This is the client-assigned asset feed identifier and it needs to be unique under a specific parent.
        :param feed_output_config: feed_output_config block.
        :param asset_names: A list of the full names of the assets to receive updates. You must specify either or both of assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to the feed. For example: //compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1. See https://cloud.google.com/apis/design/resourceNames#fullResourceName for more info.
        :param asset_types: A list of types of the assets to receive updates. You must specify either or both of assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to the feed. For example: "compute.googleapis.com/Disk" See https://cloud.google.com/asset-inventory/docs/supported-asset-types for a list of all supported asset types.
        :param billing_project: The project whose identity will be used when sending messages to the destination pubsub topic. It also specifies the project for API enablement check, quota, and billing. If not specified, the resource's project will be used.
        :param content_type: Asset content type. If not specified, no content but the asset name and type will be returned. Possible values: ["CONTENT_TYPE_UNSPECIFIED", "RESOURCE", "IAM_POLICY", "ORG_POLICY", "ACCESS_POLICY"]
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = CloudAssetProjectFeedTimeouts(**timeouts)
        self._values = {
            'feed_id': feed_id,
            'feed_output_config': feed_output_config,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if asset_names is not None: self._values["asset_names"] = asset_names
        if asset_types is not None: self._values["asset_types"] = asset_types
        if billing_project is not None: self._values["billing_project"] = billing_project
        if content_type is not None: self._values["content_type"] = content_type
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def feed_id(self) -> str:
        """This is the client-assigned asset feed identifier and it needs to be unique under a specific parent."""
        return self._values.get('feed_id')

    @builtins.property
    def feed_output_config(self) -> typing.List["CloudAssetProjectFeedFeedOutputConfig"]:
        """feed_output_config block."""
        return self._values.get('feed_output_config')

    @builtins.property
    def asset_names(self) -> typing.Optional[typing.List[str]]:
        """A list of the full names of the assets to receive updates.

        You must specify either or both of
        assetNames and assetTypes. Only asset updates matching specified assetNames and assetTypes are
        exported to the feed. For example: //compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1.
        See https://cloud.google.com/apis/design/resourceNames#fullResourceName for more info.
        """
        return self._values.get('asset_names')

    @builtins.property
    def asset_types(self) -> typing.Optional[typing.List[str]]:
        """A list of types of the assets to receive updates.

        You must specify either or both of assetNames
        and assetTypes. Only asset updates matching specified assetNames and assetTypes are exported to
        the feed. For example: "compute.googleapis.com/Disk"
        See https://cloud.google.com/asset-inventory/docs/supported-asset-types for a list of all
        supported asset types.
        """
        return self._values.get('asset_types')

    @builtins.property
    def billing_project(self) -> typing.Optional[str]:
        """The project whose identity will be used when sending messages to the destination pubsub topic.

        It also specifies the project for API
        enablement check, quota, and billing. If not specified, the resource's
        project will be used.
        """
        return self._values.get('billing_project')

    @builtins.property
    def content_type(self) -> typing.Optional[str]:
        """Asset content type.

        If not specified, no content but the asset name and type will be returned. Possible values: ["CONTENT_TYPE_UNSPECIFIED", "RESOURCE", "IAM_POLICY", "ORG_POLICY", "ACCESS_POLICY"]
        """
        return self._values.get('content_type')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["CloudAssetProjectFeedTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudAssetProjectFeedConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudAssetProjectFeedFeedOutputConfig", jsii_struct_bases=[], name_mapping={'pubsub_destination': 'pubsubDestination'})
class CloudAssetProjectFeedFeedOutputConfig():
    def __init__(self, *, pubsub_destination: typing.List["CloudAssetProjectFeedFeedOutputConfigPubsubDestination"]) -> None:
        """
        :param pubsub_destination: pubsub_destination block.
        """
        self._values = {
            'pubsub_destination': pubsub_destination,
        }

    @builtins.property
    def pubsub_destination(self) -> typing.List["CloudAssetProjectFeedFeedOutputConfigPubsubDestination"]:
        """pubsub_destination block."""
        return self._values.get('pubsub_destination')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudAssetProjectFeedFeedOutputConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudAssetProjectFeedFeedOutputConfigPubsubDestination", jsii_struct_bases=[], name_mapping={'topic': 'topic'})
class CloudAssetProjectFeedFeedOutputConfigPubsubDestination():
    def __init__(self, *, topic: str) -> None:
        """
        :param topic: Destination on Cloud Pubsub topic.
        """
        self._values = {
            'topic': topic,
        }

    @builtins.property
    def topic(self) -> str:
        """Destination on Cloud Pubsub topic."""
        return self._values.get('topic')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudAssetProjectFeedFeedOutputConfigPubsubDestination(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudAssetProjectFeedTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class CloudAssetProjectFeedTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudAssetProjectFeedTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudRunDomainMapping(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudRunDomainMapping"):
    def __init__(self, scope: constructs.Construct, id: str, *, location: str, metadata: typing.List["CloudRunDomainMappingMetadata"], name: str, spec: typing.List["CloudRunDomainMappingSpec"], project: typing.Optional[str]=None, timeouts: typing.Optional["CloudRunDomainMappingTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param location: The location of the cloud run instance. eg us-central1
        :param metadata: metadata block.
        :param name: Name should be a verified domain.
        :param spec: spec block.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudRunDomainMappingConfig(location=location, metadata=metadata, name=name, spec=spec, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudRunDomainMapping, self, [scope, id, config])

    @jsii.member(jsii_name="status")
    def status(self, index: str) -> "CloudRunDomainMappingStatus":
        """
        :param index: -
        """
        return jsii.invoke(self, "status", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: str) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.List["CloudRunDomainMappingMetadata"]:
        return jsii.get(self, "metadata")

    @metadata.setter
    def metadata(self, value: typing.List["CloudRunDomainMappingMetadata"]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="spec")
    def spec(self) -> typing.List["CloudRunDomainMappingSpec"]:
        return jsii.get(self, "spec")

    @spec.setter
    def spec(self, value: typing.List["CloudRunDomainMappingSpec"]) -> None:
        jsii.set(self, "spec", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["CloudRunDomainMappingTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["CloudRunDomainMappingTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunDomainMappingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'location': 'location', 'metadata': 'metadata', 'name': 'name', 'spec': 'spec', 'project': 'project', 'timeouts': 'timeouts'})
class CloudRunDomainMappingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, location: str, metadata: typing.List["CloudRunDomainMappingMetadata"], name: str, spec: typing.List["CloudRunDomainMappingSpec"], project: typing.Optional[str]=None, timeouts: typing.Optional["CloudRunDomainMappingTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: The location of the cloud run instance. eg us-central1
        :param metadata: metadata block.
        :param name: Name should be a verified domain.
        :param spec: spec block.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = CloudRunDomainMappingTimeouts(**timeouts)
        self._values = {
            'location': location,
            'metadata': metadata,
            'name': name,
            'spec': spec,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def location(self) -> str:
        """The location of the cloud run instance.

        eg us-central1
        """
        return self._values.get('location')

    @builtins.property
    def metadata(self) -> typing.List["CloudRunDomainMappingMetadata"]:
        """metadata block."""
        return self._values.get('metadata')

    @builtins.property
    def name(self) -> str:
        """Name should be a verified domain."""
        return self._values.get('name')

    @builtins.property
    def spec(self) -> typing.List["CloudRunDomainMappingSpec"]:
        """spec block."""
        return self._values.get('spec')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["CloudRunDomainMappingTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunDomainMappingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunDomainMappingMetadata", jsii_struct_bases=[], name_mapping={'namespace': 'namespace', 'annotations': 'annotations', 'labels': 'labels'})
class CloudRunDomainMappingMetadata():
    def __init__(self, *, namespace: str, annotations: typing.Optional[typing.Mapping[str, str]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param namespace: In Cloud Run the namespace must be equal to either the project ID or project number.
        :param annotations: Annotations is a key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. More info: http://kubernetes.io/docs/user-guide/annotations
        :param labels: Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and routes. More info: http://kubernetes.io/docs/user-guide/labels
        """
        self._values = {
            'namespace': namespace,
        }
        if annotations is not None: self._values["annotations"] = annotations
        if labels is not None: self._values["labels"] = labels

    @builtins.property
    def namespace(self) -> str:
        """In Cloud Run the namespace must be equal to either the project ID or project number."""
        return self._values.get('namespace')

    @builtins.property
    def annotations(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Annotations is a key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata.

        More
        info: http://kubernetes.io/docs/user-guide/annotations
        """
        return self._values.get('annotations')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Map of string keys and values that can be used to organize and categorize (scope and select) objects.

        May match selectors of replication controllers
        and routes.
        More info: http://kubernetes.io/docs/user-guide/labels
        """
        return self._values.get('labels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunDomainMappingMetadata(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunDomainMappingSpec", jsii_struct_bases=[], name_mapping={'route_name': 'routeName', 'certificate_mode': 'certificateMode', 'force_override': 'forceOverride'})
class CloudRunDomainMappingSpec():
    def __init__(self, *, route_name: str, certificate_mode: typing.Optional[str]=None, force_override: typing.Optional[bool]=None) -> None:
        """
        :param route_name: The name of the Cloud Run Service that this DomainMapping applies to. The route must exist.
        :param certificate_mode: The mode of the certificate. Default value: "AUTOMATIC" Possible values: ["NONE", "AUTOMATIC"]
        :param force_override: If set, the mapping will override any mapping set before this spec was set. It is recommended that the user leaves this empty to receive an error warning about a potential conflict and only set it once the respective UI has given such a warning.
        """
        self._values = {
            'route_name': route_name,
        }
        if certificate_mode is not None: self._values["certificate_mode"] = certificate_mode
        if force_override is not None: self._values["force_override"] = force_override

    @builtins.property
    def route_name(self) -> str:
        """The name of the Cloud Run Service that this DomainMapping applies to.

        The route must exist.
        """
        return self._values.get('route_name')

    @builtins.property
    def certificate_mode(self) -> typing.Optional[str]:
        """The mode of the certificate.

        Default value: "AUTOMATIC" Possible values: ["NONE", "AUTOMATIC"]
        """
        return self._values.get('certificate_mode')

    @builtins.property
    def force_override(self) -> typing.Optional[bool]:
        """If set, the mapping will override any mapping set before this spec was set.

        It is recommended that the user leaves this empty to receive an error
        warning about a potential conflict and only set it once the respective UI
        has given such a warning.
        """
        return self._values.get('force_override')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunDomainMappingSpec(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudRunDomainMappingStatus(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudRunDomainMappingStatus"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(CloudRunDomainMappingStatus, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="conditions")
    def conditions(self) -> typing.Any:
        return jsii.get(self, "conditions")

    @builtins.property
    @jsii.member(jsii_name="mappedRouteName")
    def mapped_route_name(self) -> str:
        return jsii.get(self, "mappedRouteName")

    @builtins.property
    @jsii.member(jsii_name="observedGeneration")
    def observed_generation(self) -> jsii.Number:
        return jsii.get(self, "observedGeneration")

    @builtins.property
    @jsii.member(jsii_name="resourceRecords")
    def resource_records(self) -> typing.Any:
        return jsii.get(self, "resourceRecords")


class CloudRunDomainMappingStatusConditions(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudRunDomainMappingStatusConditions"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(CloudRunDomainMappingStatusConditions, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="message")
    def message(self) -> str:
        return jsii.get(self, "message")

    @builtins.property
    @jsii.member(jsii_name="reason")
    def reason(self) -> str:
        return jsii.get(self, "reason")

    @builtins.property
    @jsii.member(jsii_name="status")
    def status(self) -> str:
        return jsii.get(self, "status")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")


class CloudRunDomainMappingStatusResourceRecords(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudRunDomainMappingStatusResourceRecords"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(CloudRunDomainMappingStatusResourceRecords, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="rrdata")
    def rrdata(self) -> str:
        return jsii.get(self, "rrdata")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunDomainMappingTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class CloudRunDomainMappingTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunDomainMappingTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudRunService(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudRunService"):
    def __init__(self, scope: constructs.Construct, id: str, *, location: str, name: str, autogenerate_revision_name: typing.Optional[bool]=None, metadata: typing.Optional[typing.List["CloudRunServiceMetadata"]]=None, project: typing.Optional[str]=None, template: typing.Optional[typing.List["CloudRunServiceTemplate"]]=None, timeouts: typing.Optional["CloudRunServiceTimeouts"]=None, traffic: typing.Optional[typing.List["CloudRunServiceTraffic"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param location: The location of the cloud run instance. eg us-central1
        :param name: Name must be unique within a namespace, within a Cloud Run region. Is required when creating resources. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names
        :param autogenerate_revision_name: 
        :param metadata: metadata block.
        :param project: 
        :param template: template block.
        :param timeouts: timeouts block.
        :param traffic: traffic block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudRunServiceConfig(location=location, name=name, autogenerate_revision_name=autogenerate_revision_name, metadata=metadata, project=project, template=template, timeouts=timeouts, traffic=traffic, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudRunService, self, [scope, id, config])

    @jsii.member(jsii_name="status")
    def status(self, index: str) -> "CloudRunServiceStatus":
        """
        :param index: -
        """
        return jsii.invoke(self, "status", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: str) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="autogenerateRevisionName")
    def autogenerate_revision_name(self) -> typing.Optional[bool]:
        return jsii.get(self, "autogenerateRevisionName")

    @autogenerate_revision_name.setter
    def autogenerate_revision_name(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "autogenerateRevisionName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Optional[typing.List["CloudRunServiceMetadata"]]:
        return jsii.get(self, "metadata")

    @metadata.setter
    def metadata(self, value: typing.Optional[typing.List["CloudRunServiceMetadata"]]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="template")
    def template(self) -> typing.Optional[typing.List["CloudRunServiceTemplate"]]:
        return jsii.get(self, "template")

    @template.setter
    def template(self, value: typing.Optional[typing.List["CloudRunServiceTemplate"]]) -> None:
        jsii.set(self, "template", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["CloudRunServiceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["CloudRunServiceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="traffic")
    def traffic(self) -> typing.Optional[typing.List["CloudRunServiceTraffic"]]:
        return jsii.get(self, "traffic")

    @traffic.setter
    def traffic(self, value: typing.Optional[typing.List["CloudRunServiceTraffic"]]) -> None:
        jsii.set(self, "traffic", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'location': 'location', 'name': 'name', 'autogenerate_revision_name': 'autogenerateRevisionName', 'metadata': 'metadata', 'project': 'project', 'template': 'template', 'timeouts': 'timeouts', 'traffic': 'traffic'})
class CloudRunServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, location: str, name: str, autogenerate_revision_name: typing.Optional[bool]=None, metadata: typing.Optional[typing.List["CloudRunServiceMetadata"]]=None, project: typing.Optional[str]=None, template: typing.Optional[typing.List["CloudRunServiceTemplate"]]=None, timeouts: typing.Optional["CloudRunServiceTimeouts"]=None, traffic: typing.Optional[typing.List["CloudRunServiceTraffic"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: The location of the cloud run instance. eg us-central1
        :param name: Name must be unique within a namespace, within a Cloud Run region. Is required when creating resources. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names
        :param autogenerate_revision_name: 
        :param metadata: metadata block.
        :param project: 
        :param template: template block.
        :param timeouts: timeouts block.
        :param traffic: traffic block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = CloudRunServiceTimeouts(**timeouts)
        self._values = {
            'location': location,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if autogenerate_revision_name is not None: self._values["autogenerate_revision_name"] = autogenerate_revision_name
        if metadata is not None: self._values["metadata"] = metadata
        if project is not None: self._values["project"] = project
        if template is not None: self._values["template"] = template
        if timeouts is not None: self._values["timeouts"] = timeouts
        if traffic is not None: self._values["traffic"] = traffic

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def location(self) -> str:
        """The location of the cloud run instance.

        eg us-central1
        """
        return self._values.get('location')

    @builtins.property
    def name(self) -> str:
        """Name must be unique within a namespace, within a Cloud Run region.

        Is required when creating resources. Name is primarily intended
        for creation idempotence and configuration definition. Cannot be updated.
        More info: http://kubernetes.io/docs/user-guide/identifiers#names
        """
        return self._values.get('name')

    @builtins.property
    def autogenerate_revision_name(self) -> typing.Optional[bool]:
        return self._values.get('autogenerate_revision_name')

    @builtins.property
    def metadata(self) -> typing.Optional[typing.List["CloudRunServiceMetadata"]]:
        """metadata block."""
        return self._values.get('metadata')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def template(self) -> typing.Optional[typing.List["CloudRunServiceTemplate"]]:
        """template block."""
        return self._values.get('template')

    @builtins.property
    def timeouts(self) -> typing.Optional["CloudRunServiceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def traffic(self) -> typing.Optional[typing.List["CloudRunServiceTraffic"]]:
        """traffic block."""
        return self._values.get('traffic')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudRunServiceIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudRunServiceIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], role: str, service: str, condition: typing.Optional[typing.List["CloudRunServiceIamBindingCondition"]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param role: 
        :param service: 
        :param condition: condition block.
        :param location: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudRunServiceIamBindingConfig(members=members, role=role, service=service, condition=condition, location=location, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudRunServiceIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["CloudRunServiceIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["CloudRunServiceIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class CloudRunServiceIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'role': 'role', 'service': 'service', 'condition': 'condition', 'location': 'location', 'project': 'project'})
class CloudRunServiceIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], role: str, service: str, condition: typing.Optional[typing.List["CloudRunServiceIamBindingCondition"]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param role: 
        :param service: 
        :param condition: condition block.
        :param location: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'role': role,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def service(self) -> str:
        return self._values.get('service')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["CloudRunServiceIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudRunServiceIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudRunServiceIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, role: str, service: str, condition: typing.Optional[typing.List["CloudRunServiceIamMemberCondition"]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param role: 
        :param service: 
        :param condition: condition block.
        :param location: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudRunServiceIamMemberConfig(member=member, role=role, service=service, condition=condition, location=location, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudRunServiceIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["CloudRunServiceIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["CloudRunServiceIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class CloudRunServiceIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'role': 'role', 'service': 'service', 'condition': 'condition', 'location': 'location', 'project': 'project'})
class CloudRunServiceIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, role: str, service: str, condition: typing.Optional[typing.List["CloudRunServiceIamMemberCondition"]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param role: 
        :param service: 
        :param condition: condition block.
        :param location: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'role': role,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def service(self) -> str:
        return self._values.get('service')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["CloudRunServiceIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudRunServiceIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudRunServiceIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_data: str, service: str, location: typing.Optional[str]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_data: 
        :param service: 
        :param location: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudRunServiceIamPolicyConfig(policy_data=policy_data, service=service, location=location, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudRunServiceIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_data': 'policyData', 'service': 'service', 'location': 'location', 'project': 'project'})
class CloudRunServiceIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_data: str, service: str, location: typing.Optional[str]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_data: 
        :param service: 
        :param location: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'policy_data': policy_data,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def service(self) -> str:
        return self._values.get('service')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceMetadata", jsii_struct_bases=[], name_mapping={'annotations': 'annotations', 'labels': 'labels', 'namespace': 'namespace'})
class CloudRunServiceMetadata():
    def __init__(self, *, annotations: typing.Optional[typing.Mapping[str, str]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, namespace: typing.Optional[str]=None) -> None:
        """
        :param annotations: Annotations is a key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. More info: http://kubernetes.io/docs/user-guide/annotations
        :param labels: Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and routes. More info: http://kubernetes.io/docs/user-guide/labels
        :param namespace: In Cloud Run the namespace must be equal to either the project ID or project number.
        """
        self._values = {
        }
        if annotations is not None: self._values["annotations"] = annotations
        if labels is not None: self._values["labels"] = labels
        if namespace is not None: self._values["namespace"] = namespace

    @builtins.property
    def annotations(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Annotations is a key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata.

        More
        info: http://kubernetes.io/docs/user-guide/annotations
        """
        return self._values.get('annotations')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Map of string keys and values that can be used to organize and categorize (scope and select) objects.

        May match selectors of replication controllers
        and routes.
        More info: http://kubernetes.io/docs/user-guide/labels
        """
        return self._values.get('labels')

    @builtins.property
    def namespace(self) -> typing.Optional[str]:
        """In Cloud Run the namespace must be equal to either the project ID or project number."""
        return self._values.get('namespace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceMetadata(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudRunServiceStatus(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudRunServiceStatus"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(CloudRunServiceStatus, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="conditions")
    def conditions(self) -> typing.Any:
        return jsii.get(self, "conditions")

    @builtins.property
    @jsii.member(jsii_name="latestCreatedRevisionName")
    def latest_created_revision_name(self) -> str:
        return jsii.get(self, "latestCreatedRevisionName")

    @builtins.property
    @jsii.member(jsii_name="latestReadyRevisionName")
    def latest_ready_revision_name(self) -> str:
        return jsii.get(self, "latestReadyRevisionName")

    @builtins.property
    @jsii.member(jsii_name="observedGeneration")
    def observed_generation(self) -> jsii.Number:
        return jsii.get(self, "observedGeneration")

    @builtins.property
    @jsii.member(jsii_name="url")
    def url(self) -> str:
        return jsii.get(self, "url")


class CloudRunServiceStatusConditions(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudRunServiceStatusConditions"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(CloudRunServiceStatusConditions, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="message")
    def message(self) -> str:
        return jsii.get(self, "message")

    @builtins.property
    @jsii.member(jsii_name="reason")
    def reason(self) -> str:
        return jsii.get(self, "reason")

    @builtins.property
    @jsii.member(jsii_name="status")
    def status(self) -> str:
        return jsii.get(self, "status")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTemplate", jsii_struct_bases=[], name_mapping={'metadata': 'metadata', 'spec': 'spec'})
class CloudRunServiceTemplate():
    def __init__(self, *, metadata: typing.Optional[typing.List["CloudRunServiceTemplateMetadata"]]=None, spec: typing.Optional[typing.List["CloudRunServiceTemplateSpec"]]=None) -> None:
        """
        :param metadata: metadata block.
        :param spec: spec block.
        """
        self._values = {
        }
        if metadata is not None: self._values["metadata"] = metadata
        if spec is not None: self._values["spec"] = spec

    @builtins.property
    def metadata(self) -> typing.Optional[typing.List["CloudRunServiceTemplateMetadata"]]:
        """metadata block."""
        return self._values.get('metadata')

    @builtins.property
    def spec(self) -> typing.Optional[typing.List["CloudRunServiceTemplateSpec"]]:
        """spec block."""
        return self._values.get('spec')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTemplate(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTemplateMetadata", jsii_struct_bases=[], name_mapping={'annotations': 'annotations', 'labels': 'labels', 'name': 'name', 'namespace': 'namespace'})
class CloudRunServiceTemplateMetadata():
    def __init__(self, *, annotations: typing.Optional[typing.Mapping[str, str]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, name: typing.Optional[str]=None, namespace: typing.Optional[str]=None) -> None:
        """
        :param annotations: Annotations is a key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. More info: http://kubernetes.io/docs/user-guide/annotations
        :param labels: Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and routes. More info: http://kubernetes.io/docs/user-guide/labels
        :param name: Name must be unique within a namespace, within a Cloud Run region. Is required when creating resources. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names
        :param namespace: In Cloud Run the namespace must be equal to either the project ID or project number. It will default to the resource's project.
        """
        self._values = {
        }
        if annotations is not None: self._values["annotations"] = annotations
        if labels is not None: self._values["labels"] = labels
        if name is not None: self._values["name"] = name
        if namespace is not None: self._values["namespace"] = namespace

    @builtins.property
    def annotations(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Annotations is a key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata.

        More
        info: http://kubernetes.io/docs/user-guide/annotations
        """
        return self._values.get('annotations')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Map of string keys and values that can be used to organize and categorize (scope and select) objects.

        May match selectors of replication controllers
        and routes.
        More info: http://kubernetes.io/docs/user-guide/labels
        """
        return self._values.get('labels')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Name must be unique within a namespace, within a Cloud Run region.

        Is required when creating resources. Name is primarily intended
        for creation idempotence and configuration definition. Cannot be updated.
        More info: http://kubernetes.io/docs/user-guide/identifiers#names
        """
        return self._values.get('name')

    @builtins.property
    def namespace(self) -> typing.Optional[str]:
        """In Cloud Run the namespace must be equal to either the project ID or project number.

        It will default to the resource's project.
        """
        return self._values.get('namespace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTemplateMetadata(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTemplateSpec", jsii_struct_bases=[], name_mapping={'container_concurrency': 'containerConcurrency', 'containers': 'containers', 'service_account_name': 'serviceAccountName', 'timeout_seconds': 'timeoutSeconds'})
class CloudRunServiceTemplateSpec():
    def __init__(self, *, container_concurrency: typing.Optional[jsii.Number]=None, containers: typing.Optional[typing.List["CloudRunServiceTemplateSpecContainers"]]=None, service_account_name: typing.Optional[str]=None, timeout_seconds: typing.Optional[jsii.Number]=None) -> None:
        """
        :param container_concurrency: ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container of the Revision. Values are: - '0' thread-safe, the system should manage the max concurrency. This is the default value. - '1' not-thread-safe. Single concurrency - '2-N' thread-safe, max concurrency of N
        :param containers: containers block.
        :param service_account_name: Email address of the IAM service account associated with the revision of the service. The service account represents the identity of the running revision, and determines what permissions the revision has. If not provided, the revision will use the project's default service account.
        :param timeout_seconds: TimeoutSeconds holds the max duration the instance is allowed for responding to a request.
        """
        self._values = {
        }
        if container_concurrency is not None: self._values["container_concurrency"] = container_concurrency
        if containers is not None: self._values["containers"] = containers
        if service_account_name is not None: self._values["service_account_name"] = service_account_name
        if timeout_seconds is not None: self._values["timeout_seconds"] = timeout_seconds

    @builtins.property
    def container_concurrency(self) -> typing.Optional[jsii.Number]:
        """ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container of the Revision.

        Values are:

        - '0' thread-safe, the system should manage the max concurrency. This is
          the default value.
        - '1' not-thread-safe. Single concurrency
        - '2-N' thread-safe, max concurrency of N
        """
        return self._values.get('container_concurrency')

    @builtins.property
    def containers(self) -> typing.Optional[typing.List["CloudRunServiceTemplateSpecContainers"]]:
        """containers block."""
        return self._values.get('containers')

    @builtins.property
    def service_account_name(self) -> typing.Optional[str]:
        """Email address of the IAM service account associated with the revision of the service.

        The service account represents the identity of the running revision,
        and determines what permissions the revision has. If not provided, the revision
        will use the project's default service account.
        """
        return self._values.get('service_account_name')

    @builtins.property
    def timeout_seconds(self) -> typing.Optional[jsii.Number]:
        """TimeoutSeconds holds the max duration the instance is allowed for responding to a request."""
        return self._values.get('timeout_seconds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTemplateSpec(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTemplateSpecContainers", jsii_struct_bases=[], name_mapping={'image': 'image', 'args': 'args', 'command': 'command', 'env': 'env', 'env_from': 'envFrom', 'ports': 'ports', 'resources': 'resources', 'working_dir': 'workingDir'})
class CloudRunServiceTemplateSpecContainers():
    def __init__(self, *, image: str, args: typing.Optional[typing.List[str]]=None, command: typing.Optional[typing.List[str]]=None, env: typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersEnv"]]=None, env_from: typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersEnvFrom"]]=None, ports: typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersPorts"]]=None, resources: typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersResources"]]=None, working_dir: typing.Optional[str]=None) -> None:
        """
        :param image: Docker image name. This is most often a reference to a container located in the container registry, such as gcr.io/cloudrun/hello More info: https://kubernetes.io/docs/concepts/containers/images
        :param args: Arguments to the entrypoint. The docker image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
        :param command: Entrypoint array. Not executed within a shell. The docker image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
        :param env: env block.
        :param env_from: env_from block.
        :param ports: ports block.
        :param resources: resources block.
        :param working_dir: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image.
        """
        self._values = {
            'image': image,
        }
        if args is not None: self._values["args"] = args
        if command is not None: self._values["command"] = command
        if env is not None: self._values["env"] = env
        if env_from is not None: self._values["env_from"] = env_from
        if ports is not None: self._values["ports"] = ports
        if resources is not None: self._values["resources"] = resources
        if working_dir is not None: self._values["working_dir"] = working_dir

    @builtins.property
    def image(self) -> str:
        """Docker image name.

        This is most often a reference to a container located
        in the container registry, such as gcr.io/cloudrun/hello
        More info: https://kubernetes.io/docs/concepts/containers/images
        """
        return self._values.get('image')

    @builtins.property
    def args(self) -> typing.Optional[typing.List[str]]:
        """Arguments to the entrypoint.

        The docker image's CMD is used if this is not provided.
        Variable references $(VAR_NAME) are expanded using the container's
        environment. If a variable cannot be resolved, the reference in the input
        string will be unchanged. The $(VAR_NAME) syntax can be escaped with a
        double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
        regardless of whether the variable exists or not.
        More info:
        https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
        """
        return self._values.get('args')

    @builtins.property
    def command(self) -> typing.Optional[typing.List[str]]:
        """Entrypoint array.

        Not executed within a shell.
        The docker image's ENTRYPOINT is used if this is not provided.
        Variable references $(VAR_NAME) are expanded using the container's
        environment. If a variable cannot be resolved, the reference in the input
        string will be unchanged. The $(VAR_NAME) syntax can be escaped with a
        double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
        regardless of whether the variable exists or not.
        More info:
        https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
        """
        return self._values.get('command')

    @builtins.property
    def env(self) -> typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersEnv"]]:
        """env block."""
        return self._values.get('env')

    @builtins.property
    def env_from(self) -> typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersEnvFrom"]]:
        """env_from block."""
        return self._values.get('env_from')

    @builtins.property
    def ports(self) -> typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersPorts"]]:
        """ports block."""
        return self._values.get('ports')

    @builtins.property
    def resources(self) -> typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersResources"]]:
        """resources block."""
        return self._values.get('resources')

    @builtins.property
    def working_dir(self) -> typing.Optional[str]:
        """Container's working directory.

        If not specified, the container runtime's default will be used, which
        might be configured in the container image.
        """
        return self._values.get('working_dir')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTemplateSpecContainers(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTemplateSpecContainersEnv", jsii_struct_bases=[], name_mapping={'name': 'name', 'value': 'value'})
class CloudRunServiceTemplateSpecContainersEnv():
    def __init__(self, *, name: typing.Optional[str]=None, value: typing.Optional[str]=None) -> None:
        """
        :param name: Name of the environment variable.
        :param value: Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any route environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".
        """
        self._values = {
        }
        if name is not None: self._values["name"] = name
        if value is not None: self._values["value"] = value

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Name of the environment variable."""
        return self._values.get('name')

    @builtins.property
    def value(self) -> typing.Optional[str]:
        """Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any route environment variables.

        If a variable cannot be resolved,
        the reference in the input string will be unchanged. The $(VAR_NAME)
        syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped
        references will never be expanded, regardless of whether the variable
        exists or not.
        Defaults to "".
        """
        return self._values.get('value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTemplateSpecContainersEnv(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTemplateSpecContainersEnvFrom", jsii_struct_bases=[], name_mapping={'config_map_ref': 'configMapRef', 'prefix': 'prefix', 'secret_ref': 'secretRef'})
class CloudRunServiceTemplateSpecContainersEnvFrom():
    def __init__(self, *, config_map_ref: typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersEnvFromConfigMapRef"]]=None, prefix: typing.Optional[str]=None, secret_ref: typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersEnvFromSecretRef"]]=None) -> None:
        """
        :param config_map_ref: config_map_ref block.
        :param prefix: An optional identifier to prepend to each key in the ConfigMap.
        :param secret_ref: secret_ref block.
        """
        self._values = {
        }
        if config_map_ref is not None: self._values["config_map_ref"] = config_map_ref
        if prefix is not None: self._values["prefix"] = prefix
        if secret_ref is not None: self._values["secret_ref"] = secret_ref

    @builtins.property
    def config_map_ref(self) -> typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersEnvFromConfigMapRef"]]:
        """config_map_ref block."""
        return self._values.get('config_map_ref')

    @builtins.property
    def prefix(self) -> typing.Optional[str]:
        """An optional identifier to prepend to each key in the ConfigMap."""
        return self._values.get('prefix')

    @builtins.property
    def secret_ref(self) -> typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersEnvFromSecretRef"]]:
        """secret_ref block."""
        return self._values.get('secret_ref')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTemplateSpecContainersEnvFrom(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTemplateSpecContainersEnvFromConfigMapRef", jsii_struct_bases=[], name_mapping={'local_object_reference': 'localObjectReference', 'optional': 'optional'})
class CloudRunServiceTemplateSpecContainersEnvFromConfigMapRef():
    def __init__(self, *, local_object_reference: typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersEnvFromConfigMapRefLocalObjectReference"]]=None, optional: typing.Optional[bool]=None) -> None:
        """
        :param local_object_reference: local_object_reference block.
        :param optional: Specify whether the ConfigMap must be defined.
        """
        self._values = {
        }
        if local_object_reference is not None: self._values["local_object_reference"] = local_object_reference
        if optional is not None: self._values["optional"] = optional

    @builtins.property
    def local_object_reference(self) -> typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersEnvFromConfigMapRefLocalObjectReference"]]:
        """local_object_reference block."""
        return self._values.get('local_object_reference')

    @builtins.property
    def optional(self) -> typing.Optional[bool]:
        """Specify whether the ConfigMap must be defined."""
        return self._values.get('optional')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTemplateSpecContainersEnvFromConfigMapRef(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTemplateSpecContainersEnvFromConfigMapRefLocalObjectReference", jsii_struct_bases=[], name_mapping={'name': 'name'})
class CloudRunServiceTemplateSpecContainersEnvFromConfigMapRefLocalObjectReference():
    def __init__(self, *, name: str) -> None:
        """
        :param name: Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
        """
        self._values = {
            'name': name,
        }

    @builtins.property
    def name(self) -> str:
        """Name of the referent.

        More info:
        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
        """
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTemplateSpecContainersEnvFromConfigMapRefLocalObjectReference(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTemplateSpecContainersEnvFromSecretRef", jsii_struct_bases=[], name_mapping={'local_object_reference': 'localObjectReference', 'optional': 'optional'})
class CloudRunServiceTemplateSpecContainersEnvFromSecretRef():
    def __init__(self, *, local_object_reference: typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersEnvFromSecretRefLocalObjectReference"]]=None, optional: typing.Optional[bool]=None) -> None:
        """
        :param local_object_reference: local_object_reference block.
        :param optional: Specify whether the Secret must be defined.
        """
        self._values = {
        }
        if local_object_reference is not None: self._values["local_object_reference"] = local_object_reference
        if optional is not None: self._values["optional"] = optional

    @builtins.property
    def local_object_reference(self) -> typing.Optional[typing.List["CloudRunServiceTemplateSpecContainersEnvFromSecretRefLocalObjectReference"]]:
        """local_object_reference block."""
        return self._values.get('local_object_reference')

    @builtins.property
    def optional(self) -> typing.Optional[bool]:
        """Specify whether the Secret must be defined."""
        return self._values.get('optional')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTemplateSpecContainersEnvFromSecretRef(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTemplateSpecContainersEnvFromSecretRefLocalObjectReference", jsii_struct_bases=[], name_mapping={'name': 'name'})
class CloudRunServiceTemplateSpecContainersEnvFromSecretRefLocalObjectReference():
    def __init__(self, *, name: str) -> None:
        """
        :param name: Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
        """
        self._values = {
            'name': name,
        }

    @builtins.property
    def name(self) -> str:
        """Name of the referent.

        More info:
        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
        """
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTemplateSpecContainersEnvFromSecretRefLocalObjectReference(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTemplateSpecContainersPorts", jsii_struct_bases=[], name_mapping={'container_port': 'containerPort', 'name': 'name', 'protocol': 'protocol'})
class CloudRunServiceTemplateSpecContainersPorts():
    def __init__(self, *, container_port: jsii.Number, name: typing.Optional[str]=None, protocol: typing.Optional[str]=None) -> None:
        """
        :param container_port: Port number.
        :param name: Name of the port.
        :param protocol: Protocol used on port. Defaults to TCP.
        """
        self._values = {
            'container_port': container_port,
        }
        if name is not None: self._values["name"] = name
        if protocol is not None: self._values["protocol"] = protocol

    @builtins.property
    def container_port(self) -> jsii.Number:
        """Port number."""
        return self._values.get('container_port')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Name of the port."""
        return self._values.get('name')

    @builtins.property
    def protocol(self) -> typing.Optional[str]:
        """Protocol used on port.

        Defaults to TCP.
        """
        return self._values.get('protocol')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTemplateSpecContainersPorts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTemplateSpecContainersResources", jsii_struct_bases=[], name_mapping={'limits': 'limits', 'requests': 'requests'})
class CloudRunServiceTemplateSpecContainersResources():
    def __init__(self, *, limits: typing.Optional[typing.Mapping[str, str]]=None, requests: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param limits: Limits describes the maximum amount of compute resources allowed. The values of the map is string form of the 'quantity' k8s type: https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
        :param requests: Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. The values of the map is string form of the 'quantity' k8s type: https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
        """
        self._values = {
        }
        if limits is not None: self._values["limits"] = limits
        if requests is not None: self._values["requests"] = requests

    @builtins.property
    def limits(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Limits describes the maximum amount of compute resources allowed.

        The values of the map is string form of the 'quantity' k8s type:
        https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
        """
        return self._values.get('limits')

    @builtins.property
    def requests(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Requests describes the minimum amount of compute resources required.

        If Requests is omitted for a container, it defaults to Limits if that is
        explicitly specified, otherwise to an implementation-defined value.
        The values of the map is string form of the 'quantity' k8s type:
        https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
        """
        return self._values.get('requests')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTemplateSpecContainersResources(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class CloudRunServiceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudRunServiceTraffic", jsii_struct_bases=[], name_mapping={'percent': 'percent', 'latest_revision': 'latestRevision', 'revision_name': 'revisionName'})
class CloudRunServiceTraffic():
    def __init__(self, *, percent: jsii.Number, latest_revision: typing.Optional[bool]=None, revision_name: typing.Optional[str]=None) -> None:
        """
        :param percent: Percent specifies percent of the traffic to this Revision or Configuration.
        :param latest_revision: LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
        :param revision_name: RevisionName of a specific revision to which to send this portion of traffic.
        """
        self._values = {
            'percent': percent,
        }
        if latest_revision is not None: self._values["latest_revision"] = latest_revision
        if revision_name is not None: self._values["revision_name"] = revision_name

    @builtins.property
    def percent(self) -> jsii.Number:
        """Percent specifies percent of the traffic to this Revision or Configuration."""
        return self._values.get('percent')

    @builtins.property
    def latest_revision(self) -> typing.Optional[bool]:
        """LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target.

        When
        provided LatestRevision must be true if RevisionName is empty; it must be
        false when RevisionName is non-empty.
        """
        return self._values.get('latest_revision')

    @builtins.property
    def revision_name(self) -> typing.Optional[str]:
        """RevisionName of a specific revision to which to send this portion of traffic."""
        return self._values.get('revision_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudRunServiceTraffic(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudSchedulerJob(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudSchedulerJob"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, app_engine_http_target: typing.Optional[typing.List["CloudSchedulerJobAppEngineHttpTarget"]]=None, attempt_deadline: typing.Optional[str]=None, description: typing.Optional[str]=None, http_target: typing.Optional[typing.List["CloudSchedulerJobHttpTarget"]]=None, project: typing.Optional[str]=None, pubsub_target: typing.Optional[typing.List["CloudSchedulerJobPubsubTarget"]]=None, region: typing.Optional[str]=None, retry_config: typing.Optional[typing.List["CloudSchedulerJobRetryConfig"]]=None, schedule: typing.Optional[str]=None, timeouts: typing.Optional["CloudSchedulerJobTimeouts"]=None, time_zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the job.
        :param app_engine_http_target: app_engine_http_target block.
        :param attempt_deadline: The deadline for job attempts. If the request handler does not respond by this deadline then the request is cancelled and the attempt is marked as a DEADLINE_EXCEEDED failure. The failed attempt can be viewed in execution logs. Cloud Scheduler will retry the job according to the RetryConfig. The allowed duration for this deadline is: For HTTP targets, between 15 seconds and 30 minutes. For App Engine HTTP targets, between 15 seconds and 24 hours. A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s"
        :param description: A human-readable description for the job. This string must not contain more than 500 characters.
        :param http_target: http_target block.
        :param project: 
        :param pubsub_target: pubsub_target block.
        :param region: Region where the scheduler job resides. If it is not provided, Terraform will use the provider default.
        :param retry_config: retry_config block.
        :param schedule: Describes the schedule on which the job will be executed.
        :param timeouts: timeouts block.
        :param time_zone: Specifies the time zone to be used in interpreting schedule. The value of this field must be a time zone name from the tz database.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudSchedulerJobConfig(name=name, app_engine_http_target=app_engine_http_target, attempt_deadline=attempt_deadline, description=description, http_target=http_target, project=project, pubsub_target=pubsub_target, region=region, retry_config=retry_config, schedule=schedule, timeouts=timeouts, time_zone=time_zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudSchedulerJob, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="appEngineHttpTarget")
    def app_engine_http_target(self) -> typing.Optional[typing.List["CloudSchedulerJobAppEngineHttpTarget"]]:
        return jsii.get(self, "appEngineHttpTarget")

    @app_engine_http_target.setter
    def app_engine_http_target(self, value: typing.Optional[typing.List["CloudSchedulerJobAppEngineHttpTarget"]]) -> None:
        jsii.set(self, "appEngineHttpTarget", value)

    @builtins.property
    @jsii.member(jsii_name="attemptDeadline")
    def attempt_deadline(self) -> typing.Optional[str]:
        return jsii.get(self, "attemptDeadline")

    @attempt_deadline.setter
    def attempt_deadline(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "attemptDeadline", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="httpTarget")
    def http_target(self) -> typing.Optional[typing.List["CloudSchedulerJobHttpTarget"]]:
        return jsii.get(self, "httpTarget")

    @http_target.setter
    def http_target(self, value: typing.Optional[typing.List["CloudSchedulerJobHttpTarget"]]) -> None:
        jsii.set(self, "httpTarget", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="pubsubTarget")
    def pubsub_target(self) -> typing.Optional[typing.List["CloudSchedulerJobPubsubTarget"]]:
        return jsii.get(self, "pubsubTarget")

    @pubsub_target.setter
    def pubsub_target(self, value: typing.Optional[typing.List["CloudSchedulerJobPubsubTarget"]]) -> None:
        jsii.set(self, "pubsubTarget", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="retryConfig")
    def retry_config(self) -> typing.Optional[typing.List["CloudSchedulerJobRetryConfig"]]:
        return jsii.get(self, "retryConfig")

    @retry_config.setter
    def retry_config(self, value: typing.Optional[typing.List["CloudSchedulerJobRetryConfig"]]) -> None:
        jsii.set(self, "retryConfig", value)

    @builtins.property
    @jsii.member(jsii_name="schedule")
    def schedule(self) -> typing.Optional[str]:
        return jsii.get(self, "schedule")

    @schedule.setter
    def schedule(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "schedule", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["CloudSchedulerJobTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["CloudSchedulerJobTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="timeZone")
    def time_zone(self) -> typing.Optional[str]:
        return jsii.get(self, "timeZone")

    @time_zone.setter
    def time_zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "timeZone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudSchedulerJobAppEngineHttpTarget", jsii_struct_bases=[], name_mapping={'relative_uri': 'relativeUri', 'app_engine_routing': 'appEngineRouting', 'body': 'body', 'headers': 'headers', 'http_method': 'httpMethod'})
class CloudSchedulerJobAppEngineHttpTarget():
    def __init__(self, *, relative_uri: str, app_engine_routing: typing.Optional[typing.List["CloudSchedulerJobAppEngineHttpTargetAppEngineRouting"]]=None, body: typing.Optional[str]=None, headers: typing.Optional[typing.Mapping[str, str]]=None, http_method: typing.Optional[str]=None) -> None:
        """
        :param relative_uri: The relative URI. The relative URL must begin with "/" and must be a valid HTTP relative URL. It can contain a path, query string arguments, and # fragments. If the relative URL is empty, then the root path "/" will be used. No spaces are allowed, and the maximum length allowed is 2083 characters
        :param app_engine_routing: app_engine_routing block.
        :param body: HTTP request body. A request body is allowed only if the HTTP method is POST or PUT. It will result in invalid argument error to set a body on a job with an incompatible HttpMethod.
        :param headers: HTTP request headers. This map contains the header field names and values. Headers can be set when the job is created.
        :param http_method: Which HTTP method to use for the request.
        """
        self._values = {
            'relative_uri': relative_uri,
        }
        if app_engine_routing is not None: self._values["app_engine_routing"] = app_engine_routing
        if body is not None: self._values["body"] = body
        if headers is not None: self._values["headers"] = headers
        if http_method is not None: self._values["http_method"] = http_method

    @builtins.property
    def relative_uri(self) -> str:
        """The relative URI.

        The relative URL must begin with "/" and must be a valid HTTP relative URL.
        It can contain a path, query string arguments, and # fragments.
        If the relative URL is empty, then the root path "/" will be used.
        No spaces are allowed, and the maximum length allowed is 2083 characters
        """
        return self._values.get('relative_uri')

    @builtins.property
    def app_engine_routing(self) -> typing.Optional[typing.List["CloudSchedulerJobAppEngineHttpTargetAppEngineRouting"]]:
        """app_engine_routing block."""
        return self._values.get('app_engine_routing')

    @builtins.property
    def body(self) -> typing.Optional[str]:
        """HTTP request body.

        A request body is allowed only if the HTTP method is POST or PUT.
        It will result in invalid argument error to set a body on a job with an incompatible HttpMethod.
        """
        return self._values.get('body')

    @builtins.property
    def headers(self) -> typing.Optional[typing.Mapping[str, str]]:
        """HTTP request headers.

        This map contains the header field names and values.
        Headers can be set when the job is created.
        """
        return self._values.get('headers')

    @builtins.property
    def http_method(self) -> typing.Optional[str]:
        """Which HTTP method to use for the request."""
        return self._values.get('http_method')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudSchedulerJobAppEngineHttpTarget(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudSchedulerJobAppEngineHttpTargetAppEngineRouting", jsii_struct_bases=[], name_mapping={'instance': 'instance', 'service': 'service', 'version': 'version'})
class CloudSchedulerJobAppEngineHttpTargetAppEngineRouting():
    def __init__(self, *, instance: typing.Optional[str]=None, service: typing.Optional[str]=None, version: typing.Optional[str]=None) -> None:
        """
        :param instance: App instance. By default, the job is sent to an instance which is available when the job is attempted.
        :param service: App service. By default, the job is sent to the service which is the default service when the job is attempted.
        :param version: App version. By default, the job is sent to the version which is the default version when the job is attempted.
        """
        self._values = {
        }
        if instance is not None: self._values["instance"] = instance
        if service is not None: self._values["service"] = service
        if version is not None: self._values["version"] = version

    @builtins.property
    def instance(self) -> typing.Optional[str]:
        """App instance.

        By default, the job is sent to an instance which is available when the job is attempted.
        """
        return self._values.get('instance')

    @builtins.property
    def service(self) -> typing.Optional[str]:
        """App service.

        By default, the job is sent to the service which is the default service when the job is attempted.
        """
        return self._values.get('service')

    @builtins.property
    def version(self) -> typing.Optional[str]:
        """App version.

        By default, the job is sent to the version which is the default version when the job is attempted.
        """
        return self._values.get('version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudSchedulerJobAppEngineHttpTargetAppEngineRouting(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudSchedulerJobConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'app_engine_http_target': 'appEngineHttpTarget', 'attempt_deadline': 'attemptDeadline', 'description': 'description', 'http_target': 'httpTarget', 'project': 'project', 'pubsub_target': 'pubsubTarget', 'region': 'region', 'retry_config': 'retryConfig', 'schedule': 'schedule', 'timeouts': 'timeouts', 'time_zone': 'timeZone'})
class CloudSchedulerJobConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, app_engine_http_target: typing.Optional[typing.List["CloudSchedulerJobAppEngineHttpTarget"]]=None, attempt_deadline: typing.Optional[str]=None, description: typing.Optional[str]=None, http_target: typing.Optional[typing.List["CloudSchedulerJobHttpTarget"]]=None, project: typing.Optional[str]=None, pubsub_target: typing.Optional[typing.List["CloudSchedulerJobPubsubTarget"]]=None, region: typing.Optional[str]=None, retry_config: typing.Optional[typing.List["CloudSchedulerJobRetryConfig"]]=None, schedule: typing.Optional[str]=None, timeouts: typing.Optional["CloudSchedulerJobTimeouts"]=None, time_zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the job.
        :param app_engine_http_target: app_engine_http_target block.
        :param attempt_deadline: The deadline for job attempts. If the request handler does not respond by this deadline then the request is cancelled and the attempt is marked as a DEADLINE_EXCEEDED failure. The failed attempt can be viewed in execution logs. Cloud Scheduler will retry the job according to the RetryConfig. The allowed duration for this deadline is: For HTTP targets, between 15 seconds and 30 minutes. For App Engine HTTP targets, between 15 seconds and 24 hours. A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s"
        :param description: A human-readable description for the job. This string must not contain more than 500 characters.
        :param http_target: http_target block.
        :param project: 
        :param pubsub_target: pubsub_target block.
        :param region: Region where the scheduler job resides. If it is not provided, Terraform will use the provider default.
        :param retry_config: retry_config block.
        :param schedule: Describes the schedule on which the job will be executed.
        :param timeouts: timeouts block.
        :param time_zone: Specifies the time zone to be used in interpreting schedule. The value of this field must be a time zone name from the tz database.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = CloudSchedulerJobTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if app_engine_http_target is not None: self._values["app_engine_http_target"] = app_engine_http_target
        if attempt_deadline is not None: self._values["attempt_deadline"] = attempt_deadline
        if description is not None: self._values["description"] = description
        if http_target is not None: self._values["http_target"] = http_target
        if project is not None: self._values["project"] = project
        if pubsub_target is not None: self._values["pubsub_target"] = pubsub_target
        if region is not None: self._values["region"] = region
        if retry_config is not None: self._values["retry_config"] = retry_config
        if schedule is not None: self._values["schedule"] = schedule
        if timeouts is not None: self._values["timeouts"] = timeouts
        if time_zone is not None: self._values["time_zone"] = time_zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name of the job."""
        return self._values.get('name')

    @builtins.property
    def app_engine_http_target(self) -> typing.Optional[typing.List["CloudSchedulerJobAppEngineHttpTarget"]]:
        """app_engine_http_target block."""
        return self._values.get('app_engine_http_target')

    @builtins.property
    def attempt_deadline(self) -> typing.Optional[str]:
        """The deadline for job attempts.

        If the request handler does not respond by this deadline then the request is
        cancelled and the attempt is marked as a DEADLINE_EXCEEDED failure. The failed attempt can be viewed in
        execution logs. Cloud Scheduler will retry the job according to the RetryConfig.
        The allowed duration for this deadline is:
        For HTTP targets, between 15 seconds and 30 minutes.
        For App Engine HTTP targets, between 15 seconds and 24 hours.
        A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s"
        """
        return self._values.get('attempt_deadline')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A human-readable description for the job.

        This string must not contain more than 500 characters.
        """
        return self._values.get('description')

    @builtins.property
    def http_target(self) -> typing.Optional[typing.List["CloudSchedulerJobHttpTarget"]]:
        """http_target block."""
        return self._values.get('http_target')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def pubsub_target(self) -> typing.Optional[typing.List["CloudSchedulerJobPubsubTarget"]]:
        """pubsub_target block."""
        return self._values.get('pubsub_target')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """Region where the scheduler job resides.

        If it is not provided, Terraform will use the provider default.
        """
        return self._values.get('region')

    @builtins.property
    def retry_config(self) -> typing.Optional[typing.List["CloudSchedulerJobRetryConfig"]]:
        """retry_config block."""
        return self._values.get('retry_config')

    @builtins.property
    def schedule(self) -> typing.Optional[str]:
        """Describes the schedule on which the job will be executed."""
        return self._values.get('schedule')

    @builtins.property
    def timeouts(self) -> typing.Optional["CloudSchedulerJobTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def time_zone(self) -> typing.Optional[str]:
        """Specifies the time zone to be used in interpreting schedule.

        The value of this field must be a time zone name from the tz database.
        """
        return self._values.get('time_zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudSchedulerJobConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudSchedulerJobHttpTarget", jsii_struct_bases=[], name_mapping={'uri': 'uri', 'body': 'body', 'headers': 'headers', 'http_method': 'httpMethod', 'oauth_token': 'oauthToken', 'oidc_token': 'oidcToken'})
class CloudSchedulerJobHttpTarget():
    def __init__(self, *, uri: str, body: typing.Optional[str]=None, headers: typing.Optional[typing.Mapping[str, str]]=None, http_method: typing.Optional[str]=None, oauth_token: typing.Optional[typing.List["CloudSchedulerJobHttpTargetOauthToken"]]=None, oidc_token: typing.Optional[typing.List["CloudSchedulerJobHttpTargetOidcToken"]]=None) -> None:
        """
        :param uri: The full URI path that the request will be sent to.
        :param body: HTTP request body. A request body is allowed only if the HTTP method is POST, PUT, or PATCH. It is an error to set body on a job with an incompatible HttpMethod.
        :param headers: This map contains the header field names and values. Repeated headers are not supported, but a header value can contain commas.
        :param http_method: Which HTTP method to use for the request.
        :param oauth_token: oauth_token block.
        :param oidc_token: oidc_token block.
        """
        self._values = {
            'uri': uri,
        }
        if body is not None: self._values["body"] = body
        if headers is not None: self._values["headers"] = headers
        if http_method is not None: self._values["http_method"] = http_method
        if oauth_token is not None: self._values["oauth_token"] = oauth_token
        if oidc_token is not None: self._values["oidc_token"] = oidc_token

    @builtins.property
    def uri(self) -> str:
        """The full URI path that the request will be sent to."""
        return self._values.get('uri')

    @builtins.property
    def body(self) -> typing.Optional[str]:
        """HTTP request body.

        A request body is allowed only if the HTTP method is POST, PUT, or PATCH.
        It is an error to set body on a job with an incompatible HttpMethod.
        """
        return self._values.get('body')

    @builtins.property
    def headers(self) -> typing.Optional[typing.Mapping[str, str]]:
        """This map contains the header field names and values.

        Repeated headers are not supported, but a header value can contain commas.
        """
        return self._values.get('headers')

    @builtins.property
    def http_method(self) -> typing.Optional[str]:
        """Which HTTP method to use for the request."""
        return self._values.get('http_method')

    @builtins.property
    def oauth_token(self) -> typing.Optional[typing.List["CloudSchedulerJobHttpTargetOauthToken"]]:
        """oauth_token block."""
        return self._values.get('oauth_token')

    @builtins.property
    def oidc_token(self) -> typing.Optional[typing.List["CloudSchedulerJobHttpTargetOidcToken"]]:
        """oidc_token block."""
        return self._values.get('oidc_token')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudSchedulerJobHttpTarget(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudSchedulerJobHttpTargetOauthToken", jsii_struct_bases=[], name_mapping={'service_account_email': 'serviceAccountEmail', 'scope': 'scope'})
class CloudSchedulerJobHttpTargetOauthToken():
    def __init__(self, *, service_account_email: str, scope: typing.Optional[str]=None) -> None:
        """
        :param service_account_email: Service account email to be used for generating OAuth token. The service account must be within the same project as the job.
        :param scope: OAuth scope to be used for generating OAuth access token. If not specified, "https://www.googleapis.com/auth/cloud-platform" will be used.
        """
        self._values = {
            'service_account_email': service_account_email,
        }
        if scope is not None: self._values["scope"] = scope

    @builtins.property
    def service_account_email(self) -> str:
        """Service account email to be used for generating OAuth token.

        The service account must be within the same project as the job.
        """
        return self._values.get('service_account_email')

    @builtins.property
    def scope(self) -> typing.Optional[str]:
        """OAuth scope to be used for generating OAuth access token.

        If not specified,
        "https://www.googleapis.com/auth/cloud-platform" will be used.
        """
        return self._values.get('scope')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudSchedulerJobHttpTargetOauthToken(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudSchedulerJobHttpTargetOidcToken", jsii_struct_bases=[], name_mapping={'service_account_email': 'serviceAccountEmail', 'audience': 'audience'})
class CloudSchedulerJobHttpTargetOidcToken():
    def __init__(self, *, service_account_email: str, audience: typing.Optional[str]=None) -> None:
        """
        :param service_account_email: Service account email to be used for generating OAuth token. The service account must be within the same project as the job.
        :param audience: Audience to be used when generating OIDC token. If not specified, the URI specified in target will be used.
        """
        self._values = {
            'service_account_email': service_account_email,
        }
        if audience is not None: self._values["audience"] = audience

    @builtins.property
    def service_account_email(self) -> str:
        """Service account email to be used for generating OAuth token.

        The service account must be within the same project as the job.
        """
        return self._values.get('service_account_email')

    @builtins.property
    def audience(self) -> typing.Optional[str]:
        """Audience to be used when generating OIDC token.

        If not specified,
        the URI specified in target will be used.
        """
        return self._values.get('audience')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudSchedulerJobHttpTargetOidcToken(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudSchedulerJobPubsubTarget", jsii_struct_bases=[], name_mapping={'topic_name': 'topicName', 'attributes': 'attributes', 'data': 'data'})
class CloudSchedulerJobPubsubTarget():
    def __init__(self, *, topic_name: str, attributes: typing.Optional[typing.Mapping[str, str]]=None, data: typing.Optional[str]=None) -> None:
        """
        :param topic_name: The full resource name for the Cloud Pub/Sub topic to which messages will be published when a job is delivered. ~>**NOTE:** The topic name must be in the same format as required by PubSub's PublishRequest.name, e.g. 'projects/my-project/topics/my-topic'.
        :param attributes: Attributes for PubsubMessage. Pubsub message must contain either non-empty data, or at least one attribute.
        :param data: The message payload for PubsubMessage. Pubsub message must contain either non-empty data, or at least one attribute.
        """
        self._values = {
            'topic_name': topic_name,
        }
        if attributes is not None: self._values["attributes"] = attributes
        if data is not None: self._values["data"] = data

    @builtins.property
    def topic_name(self) -> str:
        """The full resource name for the Cloud Pub/Sub topic to which messages will be published when a job is delivered.

        ~>**NOTE:**
        The topic name must be in the same format as required by PubSub's
        PublishRequest.name, e.g. 'projects/my-project/topics/my-topic'.
        """
        return self._values.get('topic_name')

    @builtins.property
    def attributes(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Attributes for PubsubMessage.

        Pubsub message must contain either non-empty data, or at least one attribute.
        """
        return self._values.get('attributes')

    @builtins.property
    def data(self) -> typing.Optional[str]:
        """The message payload for PubsubMessage.

        Pubsub message must contain either non-empty data, or at least one attribute.
        """
        return self._values.get('data')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudSchedulerJobPubsubTarget(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudSchedulerJobRetryConfig", jsii_struct_bases=[], name_mapping={'max_backoff_duration': 'maxBackoffDuration', 'max_doublings': 'maxDoublings', 'max_retry_duration': 'maxRetryDuration', 'min_backoff_duration': 'minBackoffDuration', 'retry_count': 'retryCount'})
class CloudSchedulerJobRetryConfig():
    def __init__(self, *, max_backoff_duration: typing.Optional[str]=None, max_doublings: typing.Optional[jsii.Number]=None, max_retry_duration: typing.Optional[str]=None, min_backoff_duration: typing.Optional[str]=None, retry_count: typing.Optional[jsii.Number]=None) -> None:
        """
        :param max_backoff_duration: The maximum amount of time to wait before retrying a job after it fails. A duration in seconds with up to nine fractional digits, terminated by 's'.
        :param max_doublings: The time between retries will double maxDoublings times. A job's retry interval starts at minBackoffDuration, then doubles maxDoublings times, then increases linearly, and finally retries retries at intervals of maxBackoffDuration up to retryCount times.
        :param max_retry_duration: The time limit for retrying a failed job, measured from time when an execution was first attempted. If specified with retryCount, the job will be retried until both limits are reached. A duration in seconds with up to nine fractional digits, terminated by 's'.
        :param min_backoff_duration: The minimum amount of time to wait before retrying a job after it fails. A duration in seconds with up to nine fractional digits, terminated by 's'.
        :param retry_count: The number of attempts that the system will make to run a job using the exponential backoff procedure described by maxDoublings. Values greater than 5 and negative values are not allowed.
        """
        self._values = {
        }
        if max_backoff_duration is not None: self._values["max_backoff_duration"] = max_backoff_duration
        if max_doublings is not None: self._values["max_doublings"] = max_doublings
        if max_retry_duration is not None: self._values["max_retry_duration"] = max_retry_duration
        if min_backoff_duration is not None: self._values["min_backoff_duration"] = min_backoff_duration
        if retry_count is not None: self._values["retry_count"] = retry_count

    @builtins.property
    def max_backoff_duration(self) -> typing.Optional[str]:
        """The maximum amount of time to wait before retrying a job after it fails.

        A duration in seconds with up to nine fractional digits, terminated by 's'.
        """
        return self._values.get('max_backoff_duration')

    @builtins.property
    def max_doublings(self) -> typing.Optional[jsii.Number]:
        """The time between retries will double maxDoublings times.

        A job's retry interval starts at minBackoffDuration,
        then doubles maxDoublings times, then increases linearly,
        and finally retries retries at intervals of maxBackoffDuration up to retryCount times.
        """
        return self._values.get('max_doublings')

    @builtins.property
    def max_retry_duration(self) -> typing.Optional[str]:
        """The time limit for retrying a failed job, measured from time when an execution was first attempted.

        If specified with retryCount, the job will be retried until both limits are reached.
        A duration in seconds with up to nine fractional digits, terminated by 's'.
        """
        return self._values.get('max_retry_duration')

    @builtins.property
    def min_backoff_duration(self) -> typing.Optional[str]:
        """The minimum amount of time to wait before retrying a job after it fails.

        A duration in seconds with up to nine fractional digits, terminated by 's'.
        """
        return self._values.get('min_backoff_duration')

    @builtins.property
    def retry_count(self) -> typing.Optional[jsii.Number]:
        """The number of attempts that the system will make to run a  job using the exponential backoff procedure described by maxDoublings.

        Values greater than 5 and negative values are not allowed.
        """
        return self._values.get('retry_count')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudSchedulerJobRetryConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudSchedulerJobTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class CloudSchedulerJobTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudSchedulerJobTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudTasksQueue(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudTasksQueue"):
    def __init__(self, scope: constructs.Construct, id: str, *, location: str, app_engine_routing_override: typing.Optional[typing.List["CloudTasksQueueAppEngineRoutingOverride"]]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, rate_limits: typing.Optional[typing.List["CloudTasksQueueRateLimits"]]=None, retry_config: typing.Optional[typing.List["CloudTasksQueueRetryConfig"]]=None, timeouts: typing.Optional["CloudTasksQueueTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param location: The location of the queue.
        :param app_engine_routing_override: app_engine_routing_override block.
        :param name: The queue name.
        :param project: 
        :param rate_limits: rate_limits block.
        :param retry_config: retry_config block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudTasksQueueConfig(location=location, app_engine_routing_override=app_engine_routing_override, name=name, project=project, rate_limits=rate_limits, retry_config=retry_config, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudTasksQueue, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: str) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="appEngineRoutingOverride")
    def app_engine_routing_override(self) -> typing.Optional[typing.List["CloudTasksQueueAppEngineRoutingOverride"]]:
        return jsii.get(self, "appEngineRoutingOverride")

    @app_engine_routing_override.setter
    def app_engine_routing_override(self, value: typing.Optional[typing.List["CloudTasksQueueAppEngineRoutingOverride"]]) -> None:
        jsii.set(self, "appEngineRoutingOverride", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="rateLimits")
    def rate_limits(self) -> typing.Optional[typing.List["CloudTasksQueueRateLimits"]]:
        return jsii.get(self, "rateLimits")

    @rate_limits.setter
    def rate_limits(self, value: typing.Optional[typing.List["CloudTasksQueueRateLimits"]]) -> None:
        jsii.set(self, "rateLimits", value)

    @builtins.property
    @jsii.member(jsii_name="retryConfig")
    def retry_config(self) -> typing.Optional[typing.List["CloudTasksQueueRetryConfig"]]:
        return jsii.get(self, "retryConfig")

    @retry_config.setter
    def retry_config(self, value: typing.Optional[typing.List["CloudTasksQueueRetryConfig"]]) -> None:
        jsii.set(self, "retryConfig", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["CloudTasksQueueTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["CloudTasksQueueTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudTasksQueueAppEngineRoutingOverride", jsii_struct_bases=[], name_mapping={'instance': 'instance', 'service': 'service', 'version': 'version'})
class CloudTasksQueueAppEngineRoutingOverride():
    def __init__(self, *, instance: typing.Optional[str]=None, service: typing.Optional[str]=None, version: typing.Optional[str]=None) -> None:
        """
        :param instance: App instance. By default, the task is sent to an instance which is available when the task is attempted.
        :param service: App service. By default, the task is sent to the service which is the default service when the task is attempted.
        :param version: App version. By default, the task is sent to the version which is the default version when the task is attempted.
        """
        self._values = {
        }
        if instance is not None: self._values["instance"] = instance
        if service is not None: self._values["service"] = service
        if version is not None: self._values["version"] = version

    @builtins.property
    def instance(self) -> typing.Optional[str]:
        """App instance.

        By default, the task is sent to an instance which is available when the task is attempted.
        """
        return self._values.get('instance')

    @builtins.property
    def service(self) -> typing.Optional[str]:
        """App service.

        By default, the task is sent to the service which is the default service when the task is attempted.
        """
        return self._values.get('service')

    @builtins.property
    def version(self) -> typing.Optional[str]:
        """App version.

        By default, the task is sent to the version which is the default version when the task is attempted.
        """
        return self._values.get('version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudTasksQueueAppEngineRoutingOverride(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudTasksQueueConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'location': 'location', 'app_engine_routing_override': 'appEngineRoutingOverride', 'name': 'name', 'project': 'project', 'rate_limits': 'rateLimits', 'retry_config': 'retryConfig', 'timeouts': 'timeouts'})
class CloudTasksQueueConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, location: str, app_engine_routing_override: typing.Optional[typing.List["CloudTasksQueueAppEngineRoutingOverride"]]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, rate_limits: typing.Optional[typing.List["CloudTasksQueueRateLimits"]]=None, retry_config: typing.Optional[typing.List["CloudTasksQueueRetryConfig"]]=None, timeouts: typing.Optional["CloudTasksQueueTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: The location of the queue.
        :param app_engine_routing_override: app_engine_routing_override block.
        :param name: The queue name.
        :param project: 
        :param rate_limits: rate_limits block.
        :param retry_config: retry_config block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = CloudTasksQueueTimeouts(**timeouts)
        self._values = {
            'location': location,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if app_engine_routing_override is not None: self._values["app_engine_routing_override"] = app_engine_routing_override
        if name is not None: self._values["name"] = name
        if project is not None: self._values["project"] = project
        if rate_limits is not None: self._values["rate_limits"] = rate_limits
        if retry_config is not None: self._values["retry_config"] = retry_config
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def location(self) -> str:
        """The location of the queue."""
        return self._values.get('location')

    @builtins.property
    def app_engine_routing_override(self) -> typing.Optional[typing.List["CloudTasksQueueAppEngineRoutingOverride"]]:
        """app_engine_routing_override block."""
        return self._values.get('app_engine_routing_override')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """The queue name."""
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def rate_limits(self) -> typing.Optional[typing.List["CloudTasksQueueRateLimits"]]:
        """rate_limits block."""
        return self._values.get('rate_limits')

    @builtins.property
    def retry_config(self) -> typing.Optional[typing.List["CloudTasksQueueRetryConfig"]]:
        """retry_config block."""
        return self._values.get('retry_config')

    @builtins.property
    def timeouts(self) -> typing.Optional["CloudTasksQueueTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudTasksQueueConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudTasksQueueRateLimits", jsii_struct_bases=[], name_mapping={'max_concurrent_dispatches': 'maxConcurrentDispatches', 'max_dispatches_per_second': 'maxDispatchesPerSecond'})
class CloudTasksQueueRateLimits():
    def __init__(self, *, max_concurrent_dispatches: typing.Optional[jsii.Number]=None, max_dispatches_per_second: typing.Optional[jsii.Number]=None) -> None:
        """
        :param max_concurrent_dispatches: The maximum number of concurrent tasks that Cloud Tasks allows to be dispatched for this queue. After this threshold has been reached, Cloud Tasks stops dispatching tasks until the number of concurrent requests decreases.
        :param max_dispatches_per_second: The maximum rate at which tasks are dispatched from this queue. If unspecified when the queue is created, Cloud Tasks will pick the default.
        """
        self._values = {
        }
        if max_concurrent_dispatches is not None: self._values["max_concurrent_dispatches"] = max_concurrent_dispatches
        if max_dispatches_per_second is not None: self._values["max_dispatches_per_second"] = max_dispatches_per_second

    @builtins.property
    def max_concurrent_dispatches(self) -> typing.Optional[jsii.Number]:
        """The maximum number of concurrent tasks that Cloud Tasks allows to be dispatched for this queue.

        After this threshold has been
        reached, Cloud Tasks stops dispatching tasks until the number of
        concurrent requests decreases.
        """
        return self._values.get('max_concurrent_dispatches')

    @builtins.property
    def max_dispatches_per_second(self) -> typing.Optional[jsii.Number]:
        """The maximum rate at which tasks are dispatched from this queue.

        If unspecified when the queue is created, Cloud Tasks will pick the default.
        """
        return self._values.get('max_dispatches_per_second')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudTasksQueueRateLimits(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudTasksQueueRetryConfig", jsii_struct_bases=[], name_mapping={'max_attempts': 'maxAttempts', 'max_backoff': 'maxBackoff', 'max_doublings': 'maxDoublings', 'max_retry_duration': 'maxRetryDuration', 'min_backoff': 'minBackoff'})
class CloudTasksQueueRetryConfig():
    def __init__(self, *, max_attempts: typing.Optional[jsii.Number]=None, max_backoff: typing.Optional[str]=None, max_doublings: typing.Optional[jsii.Number]=None, max_retry_duration: typing.Optional[str]=None, min_backoff: typing.Optional[str]=None) -> None:
        """
        :param max_attempts: Number of attempts per task. Cloud Tasks will attempt the task maxAttempts times (that is, if the first attempt fails, then there will be maxAttempts - 1 retries). Must be >= -1. If unspecified when the queue is created, Cloud Tasks will pick the default. -1 indicates unlimited attempts.
        :param max_backoff: A task will be scheduled for retry between minBackoff and maxBackoff duration after it fails, if the queue's RetryConfig specifies that the task should be retried.
        :param max_doublings: The time between retries will double maxDoublings times. A task's retry interval starts at minBackoff, then doubles maxDoublings times, then increases linearly, and finally retries retries at intervals of maxBackoff up to maxAttempts times.
        :param max_retry_duration: If positive, maxRetryDuration specifies the time limit for retrying a failed task, measured from when the task was first attempted. Once maxRetryDuration time has passed and the task has been attempted maxAttempts times, no further attempts will be made and the task will be deleted. If zero, then the task age is unlimited.
        :param min_backoff: A task will be scheduled for retry between minBackoff and maxBackoff duration after it fails, if the queue's RetryConfig specifies that the task should be retried.
        """
        self._values = {
        }
        if max_attempts is not None: self._values["max_attempts"] = max_attempts
        if max_backoff is not None: self._values["max_backoff"] = max_backoff
        if max_doublings is not None: self._values["max_doublings"] = max_doublings
        if max_retry_duration is not None: self._values["max_retry_duration"] = max_retry_duration
        if min_backoff is not None: self._values["min_backoff"] = min_backoff

    @builtins.property
    def max_attempts(self) -> typing.Optional[jsii.Number]:
        """Number of attempts per task.

        Cloud Tasks will attempt the task maxAttempts times (that is, if
        the first attempt fails, then there will be maxAttempts - 1
        retries). Must be >= -1.

        If unspecified when the queue is created, Cloud Tasks will pick
        the default.

        -1 indicates unlimited attempts.
        """
        return self._values.get('max_attempts')

    @builtins.property
    def max_backoff(self) -> typing.Optional[str]:
        """A task will be scheduled for retry between minBackoff and maxBackoff duration after it fails, if the queue's RetryConfig specifies that the task should be retried."""
        return self._values.get('max_backoff')

    @builtins.property
    def max_doublings(self) -> typing.Optional[jsii.Number]:
        """The time between retries will double maxDoublings times.

        A task's retry interval starts at minBackoff, then doubles maxDoublings times,
        then increases linearly, and finally retries retries at intervals of maxBackoff
        up to maxAttempts times.
        """
        return self._values.get('max_doublings')

    @builtins.property
    def max_retry_duration(self) -> typing.Optional[str]:
        """If positive, maxRetryDuration specifies the time limit for retrying a failed task, measured from when the task was first attempted.

        Once maxRetryDuration time has passed and the task has
        been attempted maxAttempts times, no further attempts will be
        made and the task will be deleted.

        If zero, then the task age is unlimited.
        """
        return self._values.get('max_retry_duration')

    @builtins.property
    def min_backoff(self) -> typing.Optional[str]:
        """A task will be scheduled for retry between minBackoff and maxBackoff duration after it fails, if the queue's RetryConfig specifies that the task should be retried."""
        return self._values.get('min_backoff')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudTasksQueueRetryConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudTasksQueueTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class CloudTasksQueueTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudTasksQueueTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudbuildTrigger(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudbuildTrigger"):
    def __init__(self, scope: constructs.Construct, id: str, *, build_attribute: typing.Optional[typing.List["CloudbuildTriggerBuild"]]=None, description: typing.Optional[str]=None, disabled: typing.Optional[bool]=None, filename: typing.Optional[str]=None, ignored_files: typing.Optional[typing.List[str]]=None, included_files: typing.Optional[typing.List[str]]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, substitutions: typing.Optional[typing.Mapping[str, str]]=None, tags: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["CloudbuildTriggerTimeouts"]=None, trigger_template: typing.Optional[typing.List["CloudbuildTriggerTriggerTemplate"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param build_attribute: build block.
        :param description: Human-readable description of the trigger.
        :param disabled: Whether the trigger is disabled or not. If true, the trigger will never result in a build.
        :param filename: Path, from the source root, to a file whose contents is used for the template. Either a filename or build template must be provided.
        :param ignored_files: ignoredFiles and includedFiles are file glob matches using https://golang.org/pkg/path/filepath/#Match extended with support for '**'. If ignoredFiles and changed files are both empty, then they are not used to determine whether or not to trigger a build. If ignoredFiles is not empty, then we ignore any files that match any of the ignored_file globs. If the change has no files that are outside of the ignoredFiles globs, then we do not trigger a build.
        :param included_files: ignoredFiles and includedFiles are file glob matches using https://golang.org/pkg/path/filepath/#Match extended with support for '**'. If any of the files altered in the commit pass the ignoredFiles filter and includedFiles is empty, then as far as this filter is concerned, we should trigger the build. If any of the files altered in the commit pass the ignoredFiles filter and includedFiles is not empty, then we make sure that at least one of those files matches a includedFiles glob. If not, then we do not trigger a build.
        :param name: Name of the trigger. Must be unique within the project.
        :param project: 
        :param substitutions: Substitutions data for Build resource.
        :param tags: Tags for annotation of a BuildTrigger.
        :param timeouts: timeouts block.
        :param trigger_template: trigger_template block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudbuildTriggerConfig(build_attribute=build_attribute, description=description, disabled=disabled, filename=filename, ignored_files=ignored_files, included_files=included_files, name=name, project=project, substitutions=substitutions, tags=tags, timeouts=timeouts, trigger_template=trigger_template, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudbuildTrigger, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="triggerId")
    def trigger_id(self) -> str:
        return jsii.get(self, "triggerId")

    @builtins.property
    @jsii.member(jsii_name="buildAttribute")
    def build_attribute(self) -> typing.Optional[typing.List["CloudbuildTriggerBuild"]]:
        return jsii.get(self, "buildAttribute")

    @build_attribute.setter
    def build_attribute(self, value: typing.Optional[typing.List["CloudbuildTriggerBuild"]]) -> None:
        jsii.set(self, "buildAttribute", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="disabled")
    def disabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "disabled")

    @disabled.setter
    def disabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "disabled", value)

    @builtins.property
    @jsii.member(jsii_name="filename")
    def filename(self) -> typing.Optional[str]:
        return jsii.get(self, "filename")

    @filename.setter
    def filename(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "filename", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="ignoredFiles")
    def ignored_files(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "ignoredFiles")

    @ignored_files.setter
    def ignored_files(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "ignoredFiles", value)

    @builtins.property
    @jsii.member(jsii_name="includedFiles")
    def included_files(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "includedFiles")

    @included_files.setter
    def included_files(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "includedFiles", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="substitutions")
    def substitutions(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "substitutions")

    @substitutions.setter
    def substitutions(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "substitutions", value)

    @builtins.property
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "tags")

    @tags.setter
    def tags(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["CloudbuildTriggerTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["CloudbuildTriggerTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="triggerTemplate")
    def trigger_template(self) -> typing.Optional[typing.List["CloudbuildTriggerTriggerTemplate"]]:
        return jsii.get(self, "triggerTemplate")

    @trigger_template.setter
    def trigger_template(self, value: typing.Optional[typing.List["CloudbuildTriggerTriggerTemplate"]]) -> None:
        jsii.set(self, "triggerTemplate", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudbuildTriggerBuild", jsii_struct_bases=[], name_mapping={'step': 'step', 'images': 'images', 'logs_bucket': 'logsBucket', 'queue_ttl': 'queueTtl', 'secret': 'secret', 'source': 'source', 'substitutions': 'substitutions', 'tags': 'tags', 'timeout': 'timeout'})
class CloudbuildTriggerBuild():
    def __init__(self, *, step: typing.List["CloudbuildTriggerBuildStep"], images: typing.Optional[typing.List[str]]=None, logs_bucket: typing.Optional[str]=None, queue_ttl: typing.Optional[str]=None, secret: typing.Optional[typing.List["CloudbuildTriggerBuildSecret"]]=None, source: typing.Optional[typing.List["CloudbuildTriggerBuildSource"]]=None, substitutions: typing.Optional[typing.Mapping[str, str]]=None, tags: typing.Optional[typing.List[str]]=None, timeout: typing.Optional[str]=None) -> None:
        """
        :param step: step block.
        :param images: A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account's credentials. The digests of the pushed images will be stored in the Build resource's results field. If any of the images fail to be pushed, the build status is marked FAILURE.
        :param logs_bucket: Google Cloud Storage bucket where logs should be written. Logs file names will be of the format ${logsBucket}/log-${build_id}.txt.
        :param queue_ttl: TTL in queue for this build. If provided and the build is enqueued longer than this value, the build will expire and the build status will be EXPIRED. The TTL starts ticking from createTime. A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s".
        :param secret: secret block.
        :param source: source block.
        :param substitutions: Substitutions data for Build resource.
        :param tags: Tags for annotation of a Build. These are not docker tags.
        :param timeout: Amount of time that this build should be allowed to run, to second granularity. If this amount of time elapses, work on the build will cease and the build status will be TIMEOUT. This timeout must be equal to or greater than the sum of the timeouts for build steps within the build. The expected format is the number of seconds followed by s. Default time is ten minutes (600s).
        """
        self._values = {
            'step': step,
        }
        if images is not None: self._values["images"] = images
        if logs_bucket is not None: self._values["logs_bucket"] = logs_bucket
        if queue_ttl is not None: self._values["queue_ttl"] = queue_ttl
        if secret is not None: self._values["secret"] = secret
        if source is not None: self._values["source"] = source
        if substitutions is not None: self._values["substitutions"] = substitutions
        if tags is not None: self._values["tags"] = tags
        if timeout is not None: self._values["timeout"] = timeout

    @builtins.property
    def step(self) -> typing.List["CloudbuildTriggerBuildStep"]:
        """step block."""
        return self._values.get('step')

    @builtins.property
    def images(self) -> typing.Optional[typing.List[str]]:
        """A list of images to be pushed upon the successful completion of all build steps.

        The images are pushed using the builder service account's credentials.
        The digests of the pushed images will be stored in the Build resource's results field.
        If any of the images fail to be pushed, the build status is marked FAILURE.
        """
        return self._values.get('images')

    @builtins.property
    def logs_bucket(self) -> typing.Optional[str]:
        """Google Cloud Storage bucket where logs should be written.

        Logs file names will be of the format ${logsBucket}/log-${build_id}.txt.
        """
        return self._values.get('logs_bucket')

    @builtins.property
    def queue_ttl(self) -> typing.Optional[str]:
        """TTL in queue for this build.

        If provided and the build is enqueued longer than this value,
        the build will expire and the build status will be EXPIRED.
        The TTL starts ticking from createTime.
        A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s".
        """
        return self._values.get('queue_ttl')

    @builtins.property
    def secret(self) -> typing.Optional[typing.List["CloudbuildTriggerBuildSecret"]]:
        """secret block."""
        return self._values.get('secret')

    @builtins.property
    def source(self) -> typing.Optional[typing.List["CloudbuildTriggerBuildSource"]]:
        """source block."""
        return self._values.get('source')

    @builtins.property
    def substitutions(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Substitutions data for Build resource."""
        return self._values.get('substitutions')

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[str]]:
        """Tags for annotation of a Build.

        These are not docker tags.
        """
        return self._values.get('tags')

    @builtins.property
    def timeout(self) -> typing.Optional[str]:
        """Amount of time that this build should be allowed to run, to second granularity.

        If this amount of time elapses, work on the build will cease and the build status will be TIMEOUT.
        This timeout must be equal to or greater than the sum of the timeouts for build steps within the build.
        The expected format is the number of seconds followed by s.
        Default time is ten minutes (600s).
        """
        return self._values.get('timeout')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudbuildTriggerBuild(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudbuildTriggerBuildSecret", jsii_struct_bases=[], name_mapping={'kms_key_name': 'kmsKeyName', 'secret_env': 'secretEnv'})
class CloudbuildTriggerBuildSecret():
    def __init__(self, *, kms_key_name: str, secret_env: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param kms_key_name: Cloud KMS key name to use to decrypt these envs.
        :param secret_env: Map of environment variable name to its encrypted value. Secret environment variables must be unique across all of a build's secrets, and must be used by at least one build step. Values can be at most 64 KB in size. There can be at most 100 secret values across all of a build's secrets.
        """
        self._values = {
            'kms_key_name': kms_key_name,
        }
        if secret_env is not None: self._values["secret_env"] = secret_env

    @builtins.property
    def kms_key_name(self) -> str:
        """Cloud KMS key name to use to decrypt these envs."""
        return self._values.get('kms_key_name')

    @builtins.property
    def secret_env(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Map of environment variable name to its encrypted value.

        Secret environment variables must be unique across all of a build's secrets,
        and must be used by at least one build step. Values can be at most 64 KB in size.
        There can be at most 100 secret values across all of a build's secrets.
        """
        return self._values.get('secret_env')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudbuildTriggerBuildSecret(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudbuildTriggerBuildSource", jsii_struct_bases=[], name_mapping={'repo_source': 'repoSource', 'storage_source': 'storageSource'})
class CloudbuildTriggerBuildSource():
    def __init__(self, *, repo_source: typing.Optional[typing.List["CloudbuildTriggerBuildSourceRepoSource"]]=None, storage_source: typing.Optional[typing.List["CloudbuildTriggerBuildSourceStorageSource"]]=None) -> None:
        """
        :param repo_source: repo_source block.
        :param storage_source: storage_source block.
        """
        self._values = {
        }
        if repo_source is not None: self._values["repo_source"] = repo_source
        if storage_source is not None: self._values["storage_source"] = storage_source

    @builtins.property
    def repo_source(self) -> typing.Optional[typing.List["CloudbuildTriggerBuildSourceRepoSource"]]:
        """repo_source block."""
        return self._values.get('repo_source')

    @builtins.property
    def storage_source(self) -> typing.Optional[typing.List["CloudbuildTriggerBuildSourceStorageSource"]]:
        """storage_source block."""
        return self._values.get('storage_source')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudbuildTriggerBuildSource(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudbuildTriggerBuildSourceRepoSource", jsii_struct_bases=[], name_mapping={'repo_name': 'repoName', 'branch_name': 'branchName', 'commit_sha': 'commitSha', 'dir': 'dir', 'invert_regex': 'invertRegex', 'project_id': 'projectId', 'substitutions': 'substitutions', 'tag_name': 'tagName'})
class CloudbuildTriggerBuildSourceRepoSource():
    def __init__(self, *, repo_name: str, branch_name: typing.Optional[str]=None, commit_sha: typing.Optional[str]=None, dir: typing.Optional[str]=None, invert_regex: typing.Optional[bool]=None, project_id: typing.Optional[str]=None, substitutions: typing.Optional[typing.Mapping[str, str]]=None, tag_name: typing.Optional[str]=None) -> None:
        """
        :param repo_name: Name of the Cloud Source Repository.
        :param branch_name: Regex matching branches to build. Exactly one a of branch name, tag, or commit SHA must be provided. The syntax of the regular expressions accepted is the syntax accepted by RE2 and described at https://github.com/google/re2/wiki/Syntax
        :param commit_sha: Explicit commit SHA to build. Exactly one a of branch name, tag, or commit SHA must be provided.
        :param dir: Directory, relative to the source root, in which to run the build. This must be a relative path. If a step's dir is specified and is an absolute path, this value is ignored for that step's execution.
        :param invert_regex: Only trigger a build if the revision regex does NOT match the revision regex.
        :param project_id: ID of the project that owns the Cloud Source Repository. If omitted, the project ID requesting the build is assumed.
        :param substitutions: Substitutions to use in a triggered build. Should only be used with triggers.run
        :param tag_name: Regex matching tags to build. Exactly one a of branch name, tag, or commit SHA must be provided. The syntax of the regular expressions accepted is the syntax accepted by RE2 and described at https://github.com/google/re2/wiki/Syntax
        """
        self._values = {
            'repo_name': repo_name,
        }
        if branch_name is not None: self._values["branch_name"] = branch_name
        if commit_sha is not None: self._values["commit_sha"] = commit_sha
        if dir is not None: self._values["dir"] = dir
        if invert_regex is not None: self._values["invert_regex"] = invert_regex
        if project_id is not None: self._values["project_id"] = project_id
        if substitutions is not None: self._values["substitutions"] = substitutions
        if tag_name is not None: self._values["tag_name"] = tag_name

    @builtins.property
    def repo_name(self) -> str:
        """Name of the Cloud Source Repository."""
        return self._values.get('repo_name')

    @builtins.property
    def branch_name(self) -> typing.Optional[str]:
        """Regex matching branches to build.

        Exactly one a of branch name, tag, or commit SHA must be provided.
        The syntax of the regular expressions accepted is the syntax accepted by RE2 and
        described at https://github.com/google/re2/wiki/Syntax
        """
        return self._values.get('branch_name')

    @builtins.property
    def commit_sha(self) -> typing.Optional[str]:
        """Explicit commit SHA to build.

        Exactly one a of branch name, tag, or commit SHA must be provided.
        """
        return self._values.get('commit_sha')

    @builtins.property
    def dir(self) -> typing.Optional[str]:
        """Directory, relative to the source root, in which to run the build.

        This must be a relative path. If a step's dir is specified and is an absolute path,
        this value is ignored for that step's execution.
        """
        return self._values.get('dir')

    @builtins.property
    def invert_regex(self) -> typing.Optional[bool]:
        """Only trigger a build if the revision regex does NOT match the revision regex."""
        return self._values.get('invert_regex')

    @builtins.property
    def project_id(self) -> typing.Optional[str]:
        """ID of the project that owns the Cloud Source Repository.

        If omitted, the project ID requesting the build is assumed.
        """
        return self._values.get('project_id')

    @builtins.property
    def substitutions(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Substitutions to use in a triggered build.

        Should only be used with triggers.run
        """
        return self._values.get('substitutions')

    @builtins.property
    def tag_name(self) -> typing.Optional[str]:
        """Regex matching tags to build.

        Exactly one a of branch name, tag, or commit SHA must be provided.
        The syntax of the regular expressions accepted is the syntax accepted by RE2 and
        described at https://github.com/google/re2/wiki/Syntax
        """
        return self._values.get('tag_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudbuildTriggerBuildSourceRepoSource(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudbuildTriggerBuildSourceStorageSource", jsii_struct_bases=[], name_mapping={'bucket': 'bucket', 'object': 'object', 'generation': 'generation'})
class CloudbuildTriggerBuildSourceStorageSource():
    def __init__(self, *, bucket: str, object: str, generation: typing.Optional[str]=None) -> None:
        """
        :param bucket: Google Cloud Storage bucket containing the source.
        :param object: Google Cloud Storage object containing the source. This object must be a gzipped archive file (.tar.gz) containing source to build.
        :param generation: Google Cloud Storage generation for the object. If the generation is omitted, the latest generation will be used
        """
        self._values = {
            'bucket': bucket,
            'object': object,
        }
        if generation is not None: self._values["generation"] = generation

    @builtins.property
    def bucket(self) -> str:
        """Google Cloud Storage bucket containing the source."""
        return self._values.get('bucket')

    @builtins.property
    def object(self) -> str:
        """Google Cloud Storage object containing the source.

        This object must be a gzipped archive file (.tar.gz) containing source to build.
        """
        return self._values.get('object')

    @builtins.property
    def generation(self) -> typing.Optional[str]:
        """Google Cloud Storage generation for the object.

        If the generation is omitted, the latest generation will be used
        """
        return self._values.get('generation')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudbuildTriggerBuildSourceStorageSource(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudbuildTriggerBuildStep", jsii_struct_bases=[], name_mapping={'name': 'name', 'args': 'args', 'dir': 'dir', 'entrypoint': 'entrypoint', 'env': 'env', 'id': 'id', 'secret_env': 'secretEnv', 'timeout': 'timeout', 'timing': 'timing', 'volumes': 'volumes', 'wait_for': 'waitFor'})
class CloudbuildTriggerBuildStep():
    def __init__(self, *, name: str, args: typing.Optional[typing.List[str]]=None, dir: typing.Optional[str]=None, entrypoint: typing.Optional[str]=None, env: typing.Optional[typing.List[str]]=None, id: typing.Optional[str]=None, secret_env: typing.Optional[typing.List[str]]=None, timeout: typing.Optional[str]=None, timing: typing.Optional[str]=None, volumes: typing.Optional[typing.List["CloudbuildTriggerBuildStepVolumes"]]=None, wait_for: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param name: The name of the container image that will run this particular build step. If the image is available in the host's Docker daemon's cache, it will be run directly. If not, the host will attempt to pull the image first, using the builder service account's credentials if necessary. The Docker daemon's cache will already have the latest versions of all of the officially supported build steps (https://github.com/GoogleCloudPlatform/cloud-builders). The Docker daemon will also have cached many of the layers for some popular images, like "ubuntu", "debian", but they will be refreshed at the time you attempt to use them. If you built an image in a previous build step, it will be stored in the host's Docker daemon's cache and is available to use as the name for a later build step.
        :param args: A list of arguments that will be presented to the step when it is started. If the image used to run the step's container has an entrypoint, the args are used as arguments to that entrypoint. If the image does not define an entrypoint, the first element in args is used as the entrypoint, and the remainder will be used as arguments.
        :param dir: Working directory to use when running this step's container. If this value is a relative path, it is relative to the build's working directory. If this value is absolute, it may be outside the build's working directory, in which case the contents of the path may not be persisted across build step executions, unless a 'volume' for that path is specified. If the build specifies a 'RepoSource' with 'dir' and a step with a 'dir', which specifies an absolute path, the 'RepoSource' 'dir' is ignored for the step's execution.
        :param entrypoint: Entrypoint to be used instead of the build step image's default entrypoint. If unset, the image's default entrypoint is used
        :param env: A list of environment variable definitions to be used when running a step. The elements are of the form "KEY=VALUE" for the environment variable "KEY" being given the value "VALUE".
        :param id: Unique identifier for this build step, used in 'wait_for' to reference this build step as a dependency.
        :param secret_env: A list of environment variables which are encrypted using a Cloud Key Management Service crypto key. These values must be specified in the build's 'Secret'.
        :param timeout: Time limit for executing this build step. If not defined, the step has no time limit and will be allowed to continue to run until either it completes or the build itself times out.
        :param timing: Output only. Stores timing information for executing this build step.
        :param volumes: volumes block.
        :param wait_for: The ID(s) of the step(s) that this build step depends on. This build step will not start until all the build steps in 'wait_for' have completed successfully. If 'wait_for' is empty, this build step will start when all previous build steps in the 'Build.Steps' list have completed successfully.
        """
        self._values = {
            'name': name,
        }
        if args is not None: self._values["args"] = args
        if dir is not None: self._values["dir"] = dir
        if entrypoint is not None: self._values["entrypoint"] = entrypoint
        if env is not None: self._values["env"] = env
        if id is not None: self._values["id"] = id
        if secret_env is not None: self._values["secret_env"] = secret_env
        if timeout is not None: self._values["timeout"] = timeout
        if timing is not None: self._values["timing"] = timing
        if volumes is not None: self._values["volumes"] = volumes
        if wait_for is not None: self._values["wait_for"] = wait_for

    @builtins.property
    def name(self) -> str:
        """The name of the container image that will run this particular build step.

        If the image is available in the host's Docker daemon's cache, it will be
        run directly. If not, the host will attempt to pull the image first, using
        the builder service account's credentials if necessary.

        The Docker daemon's cache will already have the latest versions of all of
        the officially supported build steps (https://github.com/GoogleCloudPlatform/cloud-builders).
        The Docker daemon will also have cached many of the layers for some popular
        images, like "ubuntu", "debian", but they will be refreshed at the time
        you attempt to use them.

        If you built an image in a previous build step, it will be stored in the
        host's Docker daemon's cache and is available to use as the name for a
        later build step.
        """
        return self._values.get('name')

    @builtins.property
    def args(self) -> typing.Optional[typing.List[str]]:
        """A list of arguments that will be presented to the step when it is started.

        If the image used to run the step's container has an entrypoint, the args
        are used as arguments to that entrypoint. If the image does not define an
        entrypoint, the first element in args is used as the entrypoint, and the
        remainder will be used as arguments.
        """
        return self._values.get('args')

    @builtins.property
    def dir(self) -> typing.Optional[str]:
        """Working directory to use when running this step's container.

        If this value is a relative path, it is relative to the build's working
        directory. If this value is absolute, it may be outside the build's working
        directory, in which case the contents of the path may not be persisted
        across build step executions, unless a 'volume' for that path is specified.

        If the build specifies a 'RepoSource' with 'dir' and a step with a
        'dir',
        which specifies an absolute path, the 'RepoSource' 'dir' is ignored
        for the step's execution.
        """
        return self._values.get('dir')

    @builtins.property
    def entrypoint(self) -> typing.Optional[str]:
        """Entrypoint to be used instead of the build step image's default entrypoint.

        If unset, the image's default entrypoint is used
        """
        return self._values.get('entrypoint')

    @builtins.property
    def env(self) -> typing.Optional[typing.List[str]]:
        """A list of environment variable definitions to be used when running a step.

        The elements are of the form "KEY=VALUE" for the environment variable
        "KEY" being given the value "VALUE".
        """
        return self._values.get('env')

    @builtins.property
    def id(self) -> typing.Optional[str]:
        """Unique identifier for this build step, used in 'wait_for' to reference this build step as a dependency."""
        return self._values.get('id')

    @builtins.property
    def secret_env(self) -> typing.Optional[typing.List[str]]:
        """A list of environment variables which are encrypted using a Cloud Key Management Service crypto key.

        These values must be specified in
        the build's 'Secret'.
        """
        return self._values.get('secret_env')

    @builtins.property
    def timeout(self) -> typing.Optional[str]:
        """Time limit for executing this build step.

        If not defined,
        the step has no
        time limit and will be allowed to continue to run until either it
        completes or the build itself times out.
        """
        return self._values.get('timeout')

    @builtins.property
    def timing(self) -> typing.Optional[str]:
        """Output only.

        Stores timing information for executing this
        build step.
        """
        return self._values.get('timing')

    @builtins.property
    def volumes(self) -> typing.Optional[typing.List["CloudbuildTriggerBuildStepVolumes"]]:
        """volumes block."""
        return self._values.get('volumes')

    @builtins.property
    def wait_for(self) -> typing.Optional[typing.List[str]]:
        """The ID(s) of the step(s) that this build step depends on.

        This build step will not start until all the build steps in 'wait_for'
        have completed successfully. If 'wait_for' is empty, this build step
        will start when all previous build steps in the 'Build.Steps' list
        have completed successfully.
        """
        return self._values.get('wait_for')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudbuildTriggerBuildStep(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudbuildTriggerBuildStepVolumes", jsii_struct_bases=[], name_mapping={'name': 'name', 'path': 'path'})
class CloudbuildTriggerBuildStepVolumes():
    def __init__(self, *, name: str, path: str) -> None:
        """
        :param name: Name of the volume to mount. Volume names must be unique per build step and must be valid names for Docker volumes. Each named volume must be used by at least two build steps.
        :param path: Path at which to mount the volume. Paths must be absolute and cannot conflict with other volume paths on the same build step or with certain reserved volume paths.
        """
        self._values = {
            'name': name,
            'path': path,
        }

    @builtins.property
    def name(self) -> str:
        """Name of the volume to mount.

        Volume names must be unique per build step and must be valid names for
        Docker volumes. Each named volume must be used by at least two build steps.
        """
        return self._values.get('name')

    @builtins.property
    def path(self) -> str:
        """Path at which to mount the volume.

        Paths must be absolute and cannot conflict with other volume paths on
        the same build step or with certain reserved volume paths.
        """
        return self._values.get('path')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudbuildTriggerBuildStepVolumes(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudbuildTriggerConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'build_attribute': 'buildAttribute', 'description': 'description', 'disabled': 'disabled', 'filename': 'filename', 'ignored_files': 'ignoredFiles', 'included_files': 'includedFiles', 'name': 'name', 'project': 'project', 'substitutions': 'substitutions', 'tags': 'tags', 'timeouts': 'timeouts', 'trigger_template': 'triggerTemplate'})
class CloudbuildTriggerConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, build_attribute: typing.Optional[typing.List["CloudbuildTriggerBuild"]]=None, description: typing.Optional[str]=None, disabled: typing.Optional[bool]=None, filename: typing.Optional[str]=None, ignored_files: typing.Optional[typing.List[str]]=None, included_files: typing.Optional[typing.List[str]]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, substitutions: typing.Optional[typing.Mapping[str, str]]=None, tags: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["CloudbuildTriggerTimeouts"]=None, trigger_template: typing.Optional[typing.List["CloudbuildTriggerTriggerTemplate"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param build_attribute: build block.
        :param description: Human-readable description of the trigger.
        :param disabled: Whether the trigger is disabled or not. If true, the trigger will never result in a build.
        :param filename: Path, from the source root, to a file whose contents is used for the template. Either a filename or build template must be provided.
        :param ignored_files: ignoredFiles and includedFiles are file glob matches using https://golang.org/pkg/path/filepath/#Match extended with support for '**'. If ignoredFiles and changed files are both empty, then they are not used to determine whether or not to trigger a build. If ignoredFiles is not empty, then we ignore any files that match any of the ignored_file globs. If the change has no files that are outside of the ignoredFiles globs, then we do not trigger a build.
        :param included_files: ignoredFiles and includedFiles are file glob matches using https://golang.org/pkg/path/filepath/#Match extended with support for '**'. If any of the files altered in the commit pass the ignoredFiles filter and includedFiles is empty, then as far as this filter is concerned, we should trigger the build. If any of the files altered in the commit pass the ignoredFiles filter and includedFiles is not empty, then we make sure that at least one of those files matches a includedFiles glob. If not, then we do not trigger a build.
        :param name: Name of the trigger. Must be unique within the project.
        :param project: 
        :param substitutions: Substitutions data for Build resource.
        :param tags: Tags for annotation of a BuildTrigger.
        :param timeouts: timeouts block.
        :param trigger_template: trigger_template block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = CloudbuildTriggerTimeouts(**timeouts)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if build_attribute is not None: self._values["build_attribute"] = build_attribute
        if description is not None: self._values["description"] = description
        if disabled is not None: self._values["disabled"] = disabled
        if filename is not None: self._values["filename"] = filename
        if ignored_files is not None: self._values["ignored_files"] = ignored_files
        if included_files is not None: self._values["included_files"] = included_files
        if name is not None: self._values["name"] = name
        if project is not None: self._values["project"] = project
        if substitutions is not None: self._values["substitutions"] = substitutions
        if tags is not None: self._values["tags"] = tags
        if timeouts is not None: self._values["timeouts"] = timeouts
        if trigger_template is not None: self._values["trigger_template"] = trigger_template

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def build_attribute(self) -> typing.Optional[typing.List["CloudbuildTriggerBuild"]]:
        """build block."""
        return self._values.get('build_attribute')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Human-readable description of the trigger."""
        return self._values.get('description')

    @builtins.property
    def disabled(self) -> typing.Optional[bool]:
        """Whether the trigger is disabled or not.

        If true, the trigger will never result in a build.
        """
        return self._values.get('disabled')

    @builtins.property
    def filename(self) -> typing.Optional[str]:
        """Path, from the source root, to a file whose contents is used for the template.

        Either a filename or build template must be provided.
        """
        return self._values.get('filename')

    @builtins.property
    def ignored_files(self) -> typing.Optional[typing.List[str]]:
        """ignoredFiles and includedFiles are file glob matches using https://golang.org/pkg/path/filepath/#Match extended with support for '**'.

        If ignoredFiles and changed files are both empty, then they are not
        used to determine whether or not to trigger a build.

        If ignoredFiles is not empty, then we ignore any files that match any
        of the ignored_file globs. If the change has no files that are outside
        of the ignoredFiles globs, then we do not trigger a build.
        """
        return self._values.get('ignored_files')

    @builtins.property
    def included_files(self) -> typing.Optional[typing.List[str]]:
        """ignoredFiles and includedFiles are file glob matches using https://golang.org/pkg/path/filepath/#Match extended with support for '**'.

        If any of the files altered in the commit pass the ignoredFiles filter
        and includedFiles is empty, then as far as this filter is concerned, we
        should trigger the build.

        If any of the files altered in the commit pass the ignoredFiles filter
        and includedFiles is not empty, then we make sure that at least one of
        those files matches a includedFiles glob. If not, then we do not trigger
        a build.
        """
        return self._values.get('included_files')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Name of the trigger.

        Must be unique within the project.
        """
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def substitutions(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Substitutions data for Build resource."""
        return self._values.get('substitutions')

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[str]]:
        """Tags for annotation of a BuildTrigger."""
        return self._values.get('tags')

    @builtins.property
    def timeouts(self) -> typing.Optional["CloudbuildTriggerTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def trigger_template(self) -> typing.Optional[typing.List["CloudbuildTriggerTriggerTemplate"]]:
        """trigger_template block."""
        return self._values.get('trigger_template')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudbuildTriggerConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudbuildTriggerTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class CloudbuildTriggerTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudbuildTriggerTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudbuildTriggerTriggerTemplate", jsii_struct_bases=[], name_mapping={'branch_name': 'branchName', 'commit_sha': 'commitSha', 'dir': 'dir', 'invert_regex': 'invertRegex', 'project_id': 'projectId', 'repo_name': 'repoName', 'tag_name': 'tagName'})
class CloudbuildTriggerTriggerTemplate():
    def __init__(self, *, branch_name: typing.Optional[str]=None, commit_sha: typing.Optional[str]=None, dir: typing.Optional[str]=None, invert_regex: typing.Optional[bool]=None, project_id: typing.Optional[str]=None, repo_name: typing.Optional[str]=None, tag_name: typing.Optional[str]=None) -> None:
        """
        :param branch_name: Name of the branch to build. Exactly one a of branch name, tag, or commit SHA must be provided. This field is a regular expression.
        :param commit_sha: Explicit commit SHA to build. Exactly one of a branch name, tag, or commit SHA must be provided.
        :param dir: Directory, relative to the source root, in which to run the build. This must be a relative path. If a step's dir is specified and is an absolute path, this value is ignored for that step's execution.
        :param invert_regex: Only trigger a build if the revision regex does NOT match the revision regex.
        :param project_id: ID of the project that owns the Cloud Source Repository. If omitted, the project ID requesting the build is assumed.
        :param repo_name: Name of the Cloud Source Repository. If omitted, the name "default" is assumed.
        :param tag_name: Name of the tag to build. Exactly one of a branch name, tag, or commit SHA must be provided. This field is a regular expression.
        """
        self._values = {
        }
        if branch_name is not None: self._values["branch_name"] = branch_name
        if commit_sha is not None: self._values["commit_sha"] = commit_sha
        if dir is not None: self._values["dir"] = dir
        if invert_regex is not None: self._values["invert_regex"] = invert_regex
        if project_id is not None: self._values["project_id"] = project_id
        if repo_name is not None: self._values["repo_name"] = repo_name
        if tag_name is not None: self._values["tag_name"] = tag_name

    @builtins.property
    def branch_name(self) -> typing.Optional[str]:
        """Name of the branch to build.

        Exactly one a of branch name, tag, or commit SHA must be provided.
        This field is a regular expression.
        """
        return self._values.get('branch_name')

    @builtins.property
    def commit_sha(self) -> typing.Optional[str]:
        """Explicit commit SHA to build.

        Exactly one of a branch name, tag, or commit SHA must be provided.
        """
        return self._values.get('commit_sha')

    @builtins.property
    def dir(self) -> typing.Optional[str]:
        """Directory, relative to the source root, in which to run the build.

        This must be a relative path. If a step's dir is specified and
        is an absolute path, this value is ignored for that step's
        execution.
        """
        return self._values.get('dir')

    @builtins.property
    def invert_regex(self) -> typing.Optional[bool]:
        """Only trigger a build if the revision regex does NOT match the revision regex."""
        return self._values.get('invert_regex')

    @builtins.property
    def project_id(self) -> typing.Optional[str]:
        """ID of the project that owns the Cloud Source Repository.

        If
        omitted, the project ID requesting the build is assumed.
        """
        return self._values.get('project_id')

    @builtins.property
    def repo_name(self) -> typing.Optional[str]:
        """Name of the Cloud Source Repository.

        If omitted, the name "default" is assumed.
        """
        return self._values.get('repo_name')

    @builtins.property
    def tag_name(self) -> typing.Optional[str]:
        """Name of the tag to build.

        Exactly one of a branch name, tag, or commit SHA must be provided.
        This field is a regular expression.
        """
        return self._values.get('tag_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudbuildTriggerTriggerTemplate(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudfunctionsFunction(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudfunctionsFunction"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, runtime: str, available_memory_mb: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, entry_point: typing.Optional[str]=None, environment_variables: typing.Optional[typing.Mapping[str, str]]=None, event_trigger: typing.Optional[typing.List["CloudfunctionsFunctionEventTrigger"]]=None, https_trigger_url: typing.Optional[str]=None, ingress_settings: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, max_instances: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, service_account_email: typing.Optional[str]=None, source_archive_bucket: typing.Optional[str]=None, source_archive_object: typing.Optional[str]=None, source_repository: typing.Optional[typing.List["CloudfunctionsFunctionSourceRepository"]]=None, timeout: typing.Optional[jsii.Number]=None, timeouts: typing.Optional["CloudfunctionsFunctionTimeouts"]=None, trigger_http: typing.Optional[bool]=None, vpc_connector: typing.Optional[str]=None, vpc_connector_egress_settings: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: A user-defined name of the function. Function names must be unique globally.
        :param runtime: The runtime in which the function is going to run. Eg. "nodejs8", "nodejs10", "python37", "go111".
        :param available_memory_mb: Memory (in MB), available to the function. Default value is 256MB. Allowed values are: 128MB, 256MB, 512MB, 1024MB, and 2048MB.
        :param description: Description of the function.
        :param entry_point: Name of the function that will be executed when the Google Cloud Function is triggered.
        :param environment_variables: A set of key/value environment variable pairs to assign to the function.
        :param event_trigger: event_trigger block.
        :param https_trigger_url: URL which triggers function execution. Returned only if trigger_http is used.
        :param ingress_settings: String value that controls what traffic can reach the function. Allowed values are ALLOW_ALL and ALLOW_INTERNAL_ONLY. Changes to this field will recreate the cloud function.
        :param labels: A set of key/value label pairs to assign to the function. Label keys must follow the requirements at https://cloud.google.com/resource-manager/docs/creating-managing-labels#requirements.
        :param max_instances: The limit on the maximum number of function instances that may coexist at a given time.
        :param project: Project of the function. If it is not provided, the provider project is used.
        :param region: Region of function. Currently can be only "us-central1". If it is not provided, the provider region is used.
        :param service_account_email: If provided, the self-provided service account to run the function with.
        :param source_archive_bucket: The GCS bucket containing the zip archive which contains the function.
        :param source_archive_object: The source archive object (file) in archive bucket.
        :param source_repository: source_repository block.
        :param timeout: Timeout (in seconds) for the function. Default value is 60 seconds. Cannot be more than 540 seconds.
        :param timeouts: timeouts block.
        :param trigger_http: Boolean variable. Any HTTP request (of a supported type) to the endpoint will trigger function execution. Supported HTTP request types are: POST, PUT, GET, DELETE, and OPTIONS. Endpoint is returned as https_trigger_url. Cannot be used with trigger_bucket and trigger_topic.
        :param vpc_connector: The VPC Network Connector that this cloud function can connect to. It can be either the fully-qualified URI, or the short name of the network connector resource. The format of this field is projects/*/locations/*/connectors/*.
        :param vpc_connector_egress_settings: The egress settings for the connector, controlling what traffic is diverted through it. Allowed values are ALL_TRAFFIC and PRIVATE_RANGES_ONLY. Defaults to PRIVATE_RANGES_ONLY. If unset, this field preserves the previously set value.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudfunctionsFunctionConfig(name=name, runtime=runtime, available_memory_mb=available_memory_mb, description=description, entry_point=entry_point, environment_variables=environment_variables, event_trigger=event_trigger, https_trigger_url=https_trigger_url, ingress_settings=ingress_settings, labels=labels, max_instances=max_instances, project=project, region=region, service_account_email=service_account_email, source_archive_bucket=source_archive_bucket, source_archive_object=source_archive_object, source_repository=source_repository, timeout=timeout, timeouts=timeouts, trigger_http=trigger_http, vpc_connector=vpc_connector, vpc_connector_egress_settings=vpc_connector_egress_settings, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudfunctionsFunction, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="runtime")
    def runtime(self) -> str:
        return jsii.get(self, "runtime")

    @runtime.setter
    def runtime(self, value: str) -> None:
        jsii.set(self, "runtime", value)

    @builtins.property
    @jsii.member(jsii_name="availableMemoryMb")
    def available_memory_mb(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "availableMemoryMb")

    @available_memory_mb.setter
    def available_memory_mb(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "availableMemoryMb", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="entryPoint")
    def entry_point(self) -> typing.Optional[str]:
        return jsii.get(self, "entryPoint")

    @entry_point.setter
    def entry_point(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "entryPoint", value)

    @builtins.property
    @jsii.member(jsii_name="environmentVariables")
    def environment_variables(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "environmentVariables")

    @environment_variables.setter
    def environment_variables(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "environmentVariables", value)

    @builtins.property
    @jsii.member(jsii_name="eventTrigger")
    def event_trigger(self) -> typing.Optional[typing.List["CloudfunctionsFunctionEventTrigger"]]:
        return jsii.get(self, "eventTrigger")

    @event_trigger.setter
    def event_trigger(self, value: typing.Optional[typing.List["CloudfunctionsFunctionEventTrigger"]]) -> None:
        jsii.set(self, "eventTrigger", value)

    @builtins.property
    @jsii.member(jsii_name="httpsTriggerUrl")
    def https_trigger_url(self) -> typing.Optional[str]:
        return jsii.get(self, "httpsTriggerUrl")

    @https_trigger_url.setter
    def https_trigger_url(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "httpsTriggerUrl", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="ingressSettings")
    def ingress_settings(self) -> typing.Optional[str]:
        return jsii.get(self, "ingressSettings")

    @ingress_settings.setter
    def ingress_settings(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "ingressSettings", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="maxInstances")
    def max_instances(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxInstances")

    @max_instances.setter
    def max_instances(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "maxInstances", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="serviceAccountEmail")
    def service_account_email(self) -> typing.Optional[str]:
        return jsii.get(self, "serviceAccountEmail")

    @service_account_email.setter
    def service_account_email(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "serviceAccountEmail", value)

    @builtins.property
    @jsii.member(jsii_name="sourceArchiveBucket")
    def source_archive_bucket(self) -> typing.Optional[str]:
        return jsii.get(self, "sourceArchiveBucket")

    @source_archive_bucket.setter
    def source_archive_bucket(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sourceArchiveBucket", value)

    @builtins.property
    @jsii.member(jsii_name="sourceArchiveObject")
    def source_archive_object(self) -> typing.Optional[str]:
        return jsii.get(self, "sourceArchiveObject")

    @source_archive_object.setter
    def source_archive_object(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sourceArchiveObject", value)

    @builtins.property
    @jsii.member(jsii_name="sourceRepository")
    def source_repository(self) -> typing.Optional[typing.List["CloudfunctionsFunctionSourceRepository"]]:
        return jsii.get(self, "sourceRepository")

    @source_repository.setter
    def source_repository(self, value: typing.Optional[typing.List["CloudfunctionsFunctionSourceRepository"]]) -> None:
        jsii.set(self, "sourceRepository", value)

    @builtins.property
    @jsii.member(jsii_name="timeout")
    def timeout(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "timeout")

    @timeout.setter
    def timeout(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "timeout", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["CloudfunctionsFunctionTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["CloudfunctionsFunctionTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="triggerHttp")
    def trigger_http(self) -> typing.Optional[bool]:
        return jsii.get(self, "triggerHttp")

    @trigger_http.setter
    def trigger_http(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "triggerHttp", value)

    @builtins.property
    @jsii.member(jsii_name="vpcConnector")
    def vpc_connector(self) -> typing.Optional[str]:
        return jsii.get(self, "vpcConnector")

    @vpc_connector.setter
    def vpc_connector(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "vpcConnector", value)

    @builtins.property
    @jsii.member(jsii_name="vpcConnectorEgressSettings")
    def vpc_connector_egress_settings(self) -> typing.Optional[str]:
        return jsii.get(self, "vpcConnectorEgressSettings")

    @vpc_connector_egress_settings.setter
    def vpc_connector_egress_settings(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "vpcConnectorEgressSettings", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudfunctionsFunctionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'runtime': 'runtime', 'available_memory_mb': 'availableMemoryMb', 'description': 'description', 'entry_point': 'entryPoint', 'environment_variables': 'environmentVariables', 'event_trigger': 'eventTrigger', 'https_trigger_url': 'httpsTriggerUrl', 'ingress_settings': 'ingressSettings', 'labels': 'labels', 'max_instances': 'maxInstances', 'project': 'project', 'region': 'region', 'service_account_email': 'serviceAccountEmail', 'source_archive_bucket': 'sourceArchiveBucket', 'source_archive_object': 'sourceArchiveObject', 'source_repository': 'sourceRepository', 'timeout': 'timeout', 'timeouts': 'timeouts', 'trigger_http': 'triggerHttp', 'vpc_connector': 'vpcConnector', 'vpc_connector_egress_settings': 'vpcConnectorEgressSettings'})
class CloudfunctionsFunctionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, runtime: str, available_memory_mb: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, entry_point: typing.Optional[str]=None, environment_variables: typing.Optional[typing.Mapping[str, str]]=None, event_trigger: typing.Optional[typing.List["CloudfunctionsFunctionEventTrigger"]]=None, https_trigger_url: typing.Optional[str]=None, ingress_settings: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, max_instances: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, service_account_email: typing.Optional[str]=None, source_archive_bucket: typing.Optional[str]=None, source_archive_object: typing.Optional[str]=None, source_repository: typing.Optional[typing.List["CloudfunctionsFunctionSourceRepository"]]=None, timeout: typing.Optional[jsii.Number]=None, timeouts: typing.Optional["CloudfunctionsFunctionTimeouts"]=None, trigger_http: typing.Optional[bool]=None, vpc_connector: typing.Optional[str]=None, vpc_connector_egress_settings: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: A user-defined name of the function. Function names must be unique globally.
        :param runtime: The runtime in which the function is going to run. Eg. "nodejs8", "nodejs10", "python37", "go111".
        :param available_memory_mb: Memory (in MB), available to the function. Default value is 256MB. Allowed values are: 128MB, 256MB, 512MB, 1024MB, and 2048MB.
        :param description: Description of the function.
        :param entry_point: Name of the function that will be executed when the Google Cloud Function is triggered.
        :param environment_variables: A set of key/value environment variable pairs to assign to the function.
        :param event_trigger: event_trigger block.
        :param https_trigger_url: URL which triggers function execution. Returned only if trigger_http is used.
        :param ingress_settings: String value that controls what traffic can reach the function. Allowed values are ALLOW_ALL and ALLOW_INTERNAL_ONLY. Changes to this field will recreate the cloud function.
        :param labels: A set of key/value label pairs to assign to the function. Label keys must follow the requirements at https://cloud.google.com/resource-manager/docs/creating-managing-labels#requirements.
        :param max_instances: The limit on the maximum number of function instances that may coexist at a given time.
        :param project: Project of the function. If it is not provided, the provider project is used.
        :param region: Region of function. Currently can be only "us-central1". If it is not provided, the provider region is used.
        :param service_account_email: If provided, the self-provided service account to run the function with.
        :param source_archive_bucket: The GCS bucket containing the zip archive which contains the function.
        :param source_archive_object: The source archive object (file) in archive bucket.
        :param source_repository: source_repository block.
        :param timeout: Timeout (in seconds) for the function. Default value is 60 seconds. Cannot be more than 540 seconds.
        :param timeouts: timeouts block.
        :param trigger_http: Boolean variable. Any HTTP request (of a supported type) to the endpoint will trigger function execution. Supported HTTP request types are: POST, PUT, GET, DELETE, and OPTIONS. Endpoint is returned as https_trigger_url. Cannot be used with trigger_bucket and trigger_topic.
        :param vpc_connector: The VPC Network Connector that this cloud function can connect to. It can be either the fully-qualified URI, or the short name of the network connector resource. The format of this field is projects/*/locations/*/connectors/*.
        :param vpc_connector_egress_settings: The egress settings for the connector, controlling what traffic is diverted through it. Allowed values are ALL_TRAFFIC and PRIVATE_RANGES_ONLY. Defaults to PRIVATE_RANGES_ONLY. If unset, this field preserves the previously set value.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = CloudfunctionsFunctionTimeouts(**timeouts)
        self._values = {
            'name': name,
            'runtime': runtime,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if available_memory_mb is not None: self._values["available_memory_mb"] = available_memory_mb
        if description is not None: self._values["description"] = description
        if entry_point is not None: self._values["entry_point"] = entry_point
        if environment_variables is not None: self._values["environment_variables"] = environment_variables
        if event_trigger is not None: self._values["event_trigger"] = event_trigger
        if https_trigger_url is not None: self._values["https_trigger_url"] = https_trigger_url
        if ingress_settings is not None: self._values["ingress_settings"] = ingress_settings
        if labels is not None: self._values["labels"] = labels
        if max_instances is not None: self._values["max_instances"] = max_instances
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if service_account_email is not None: self._values["service_account_email"] = service_account_email
        if source_archive_bucket is not None: self._values["source_archive_bucket"] = source_archive_bucket
        if source_archive_object is not None: self._values["source_archive_object"] = source_archive_object
        if source_repository is not None: self._values["source_repository"] = source_repository
        if timeout is not None: self._values["timeout"] = timeout
        if timeouts is not None: self._values["timeouts"] = timeouts
        if trigger_http is not None: self._values["trigger_http"] = trigger_http
        if vpc_connector is not None: self._values["vpc_connector"] = vpc_connector
        if vpc_connector_egress_settings is not None: self._values["vpc_connector_egress_settings"] = vpc_connector_egress_settings

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """A user-defined name of the function.

        Function names must be unique globally.
        """
        return self._values.get('name')

    @builtins.property
    def runtime(self) -> str:
        """The runtime in which the function is going to run.

        Eg. "nodejs8", "nodejs10", "python37", "go111".
        """
        return self._values.get('runtime')

    @builtins.property
    def available_memory_mb(self) -> typing.Optional[jsii.Number]:
        """Memory (in MB), available to the function.

        Default value is 256MB. Allowed values are: 128MB, 256MB, 512MB, 1024MB, and 2048MB.
        """
        return self._values.get('available_memory_mb')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Description of the function."""
        return self._values.get('description')

    @builtins.property
    def entry_point(self) -> typing.Optional[str]:
        """Name of the function that will be executed when the Google Cloud Function is triggered."""
        return self._values.get('entry_point')

    @builtins.property
    def environment_variables(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value environment variable pairs to assign to the function."""
        return self._values.get('environment_variables')

    @builtins.property
    def event_trigger(self) -> typing.Optional[typing.List["CloudfunctionsFunctionEventTrigger"]]:
        """event_trigger block."""
        return self._values.get('event_trigger')

    @builtins.property
    def https_trigger_url(self) -> typing.Optional[str]:
        """URL which triggers function execution.

        Returned only if trigger_http is used.
        """
        return self._values.get('https_trigger_url')

    @builtins.property
    def ingress_settings(self) -> typing.Optional[str]:
        """String value that controls what traffic can reach the function.

        Allowed values are ALLOW_ALL and ALLOW_INTERNAL_ONLY. Changes to this field will recreate the cloud function.
        """
        return self._values.get('ingress_settings')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value label pairs to assign to the function.

        Label keys must follow the requirements at https://cloud.google.com/resource-manager/docs/creating-managing-labels#requirements.
        """
        return self._values.get('labels')

    @builtins.property
    def max_instances(self) -> typing.Optional[jsii.Number]:
        """The limit on the maximum number of function instances that may coexist at a given time."""
        return self._values.get('max_instances')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """Project of the function.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """Region of function.

        Currently can be only "us-central1". If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    @builtins.property
    def service_account_email(self) -> typing.Optional[str]:
        """If provided, the self-provided service account to run the function with."""
        return self._values.get('service_account_email')

    @builtins.property
    def source_archive_bucket(self) -> typing.Optional[str]:
        """The GCS bucket containing the zip archive which contains the function."""
        return self._values.get('source_archive_bucket')

    @builtins.property
    def source_archive_object(self) -> typing.Optional[str]:
        """The source archive object (file) in archive bucket."""
        return self._values.get('source_archive_object')

    @builtins.property
    def source_repository(self) -> typing.Optional[typing.List["CloudfunctionsFunctionSourceRepository"]]:
        """source_repository block."""
        return self._values.get('source_repository')

    @builtins.property
    def timeout(self) -> typing.Optional[jsii.Number]:
        """Timeout (in seconds) for the function.

        Default value is 60 seconds. Cannot be more than 540 seconds.
        """
        return self._values.get('timeout')

    @builtins.property
    def timeouts(self) -> typing.Optional["CloudfunctionsFunctionTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def trigger_http(self) -> typing.Optional[bool]:
        """Boolean variable.

        Any HTTP request (of a supported type) to the endpoint will trigger function execution. Supported HTTP request types are: POST, PUT, GET, DELETE, and OPTIONS. Endpoint is returned as https_trigger_url. Cannot be used with trigger_bucket and trigger_topic.
        """
        return self._values.get('trigger_http')

    @builtins.property
    def vpc_connector(self) -> typing.Optional[str]:
        """The VPC Network Connector that this cloud function can connect to.

        It can be either the fully-qualified URI, or the short name of the network connector resource. The format of this field is projects/*/locations/*/connectors/*.
        """
        return self._values.get('vpc_connector')

    @builtins.property
    def vpc_connector_egress_settings(self) -> typing.Optional[str]:
        """The egress settings for the connector, controlling what traffic is diverted through it.

        Allowed values are ALL_TRAFFIC and PRIVATE_RANGES_ONLY. Defaults to PRIVATE_RANGES_ONLY. If unset, this field preserves the previously set value.
        """
        return self._values.get('vpc_connector_egress_settings')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudfunctionsFunctionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudfunctionsFunctionEventTrigger", jsii_struct_bases=[], name_mapping={'event_type': 'eventType', 'resource': 'resource', 'failure_policy': 'failurePolicy'})
class CloudfunctionsFunctionEventTrigger():
    def __init__(self, *, event_type: str, resource: str, failure_policy: typing.Optional[typing.List["CloudfunctionsFunctionEventTriggerFailurePolicy"]]=None) -> None:
        """
        :param event_type: The type of event to observe. For example: "google.storage.object.finalize". See the documentation on calling Cloud Functions for a full reference of accepted triggers.
        :param resource: The name or partial URI of the resource from which to observe events. For example, "myBucket" or "projects/my-project/topics/my-topic"
        :param failure_policy: failure_policy block.
        """
        self._values = {
            'event_type': event_type,
            'resource': resource,
        }
        if failure_policy is not None: self._values["failure_policy"] = failure_policy

    @builtins.property
    def event_type(self) -> str:
        """The type of event to observe.

        For example: "google.storage.object.finalize". See the documentation on calling Cloud Functions for a full reference of accepted triggers.
        """
        return self._values.get('event_type')

    @builtins.property
    def resource(self) -> str:
        """The name or partial URI of the resource from which to observe events.

        For example, "myBucket" or "projects/my-project/topics/my-topic"
        """
        return self._values.get('resource')

    @builtins.property
    def failure_policy(self) -> typing.Optional[typing.List["CloudfunctionsFunctionEventTriggerFailurePolicy"]]:
        """failure_policy block."""
        return self._values.get('failure_policy')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudfunctionsFunctionEventTrigger(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudfunctionsFunctionEventTriggerFailurePolicy", jsii_struct_bases=[], name_mapping={'retry': 'retry'})
class CloudfunctionsFunctionEventTriggerFailurePolicy():
    def __init__(self, *, retry: bool) -> None:
        """
        :param retry: Whether the function should be retried on failure. Defaults to false.
        """
        self._values = {
            'retry': retry,
        }

    @builtins.property
    def retry(self) -> bool:
        """Whether the function should be retried on failure.

        Defaults to false.
        """
        return self._values.get('retry')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudfunctionsFunctionEventTriggerFailurePolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudfunctionsFunctionIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudfunctionsFunctionIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, cloud_function: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["CloudfunctionsFunctionIamBindingCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param cloud_function: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudfunctionsFunctionIamBindingConfig(cloud_function=cloud_function, members=members, role=role, condition=condition, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudfunctionsFunctionIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="cloudFunction")
    def cloud_function(self) -> str:
        return jsii.get(self, "cloudFunction")

    @cloud_function.setter
    def cloud_function(self, value: str) -> None:
        jsii.set(self, "cloudFunction", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["CloudfunctionsFunctionIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["CloudfunctionsFunctionIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudfunctionsFunctionIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class CloudfunctionsFunctionIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudfunctionsFunctionIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudfunctionsFunctionIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'cloud_function': 'cloudFunction', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project', 'region': 'region'})
class CloudfunctionsFunctionIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, cloud_function: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["CloudfunctionsFunctionIamBindingCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cloud_function: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'cloud_function': cloud_function,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def cloud_function(self) -> str:
        return self._values.get('cloud_function')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["CloudfunctionsFunctionIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudfunctionsFunctionIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudfunctionsFunctionIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudfunctionsFunctionIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, cloud_function: str, member: str, role: str, condition: typing.Optional[typing.List["CloudfunctionsFunctionIamMemberCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param cloud_function: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudfunctionsFunctionIamMemberConfig(cloud_function=cloud_function, member=member, role=role, condition=condition, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudfunctionsFunctionIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="cloudFunction")
    def cloud_function(self) -> str:
        return jsii.get(self, "cloudFunction")

    @cloud_function.setter
    def cloud_function(self, value: str) -> None:
        jsii.set(self, "cloudFunction", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["CloudfunctionsFunctionIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["CloudfunctionsFunctionIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudfunctionsFunctionIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class CloudfunctionsFunctionIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudfunctionsFunctionIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudfunctionsFunctionIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'cloud_function': 'cloudFunction', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project', 'region': 'region'})
class CloudfunctionsFunctionIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, cloud_function: str, member: str, role: str, condition: typing.Optional[typing.List["CloudfunctionsFunctionIamMemberCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cloud_function: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'cloud_function': cloud_function,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def cloud_function(self) -> str:
        return self._values.get('cloud_function')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["CloudfunctionsFunctionIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudfunctionsFunctionIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudfunctionsFunctionIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudfunctionsFunctionIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, cloud_function: str, policy_data: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param cloud_function: 
        :param policy_data: 
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudfunctionsFunctionIamPolicyConfig(cloud_function=cloud_function, policy_data=policy_data, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudfunctionsFunctionIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="cloudFunction")
    def cloud_function(self) -> str:
        return jsii.get(self, "cloudFunction")

    @cloud_function.setter
    def cloud_function(self, value: str) -> None:
        jsii.set(self, "cloudFunction", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudfunctionsFunctionIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'cloud_function': 'cloudFunction', 'policy_data': 'policyData', 'project': 'project', 'region': 'region'})
class CloudfunctionsFunctionIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, cloud_function: str, policy_data: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cloud_function: 
        :param policy_data: 
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'cloud_function': cloud_function,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def cloud_function(self) -> str:
        return self._values.get('cloud_function')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudfunctionsFunctionIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudfunctionsFunctionSourceRepository", jsii_struct_bases=[], name_mapping={'url': 'url'})
class CloudfunctionsFunctionSourceRepository():
    def __init__(self, *, url: str) -> None:
        """
        :param url: The URL pointing to the hosted repository where the function is defined.
        """
        self._values = {
            'url': url,
        }

    @builtins.property
    def url(self) -> str:
        """The URL pointing to the hosted repository where the function is defined."""
        return self._values.get('url')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudfunctionsFunctionSourceRepository(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudfunctionsFunctionTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'read': 'read', 'update': 'update'})
class CloudfunctionsFunctionTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, read: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param read: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if read is not None: self._values["read"] = read
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def read(self) -> typing.Optional[str]:
        return self._values.get('read')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudfunctionsFunctionTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudiotDevice(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudiotDevice"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, registry: str, blocked: typing.Optional[bool]=None, credentials: typing.Optional[typing.List["CloudiotDeviceCredentials"]]=None, gateway_config: typing.Optional[typing.List["CloudiotDeviceGatewayConfig"]]=None, log_level: typing.Optional[str]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, timeouts: typing.Optional["CloudiotDeviceTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: A unique name for the resource.
        :param registry: The name of the device registry where this device should be created.
        :param blocked: If a device is blocked, connections or requests from this device will fail.
        :param credentials: credentials block.
        :param gateway_config: gateway_config block.
        :param log_level: The logging verbosity for device activity. Possible values: ["NONE", "ERROR", "INFO", "DEBUG"]
        :param metadata: The metadata key-value pairs assigned to the device.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudiotDeviceConfig(name=name, registry=registry, blocked=blocked, credentials=credentials, gateway_config=gateway_config, log_level=log_level, metadata=metadata, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudiotDevice, self, [scope, id, config])

    @jsii.member(jsii_name="config")
    def config(self, index: str) -> "CloudiotDeviceConfigA":
        """
        :param index: -
        """
        return jsii.invoke(self, "config", [index])

    @jsii.member(jsii_name="lastErrorStatus")
    def last_error_status(self, index: str) -> "CloudiotDeviceLastErrorStatus":
        """
        :param index: -
        """
        return jsii.invoke(self, "lastErrorStatus", [index])

    @jsii.member(jsii_name="state")
    def state(self, index: str) -> "CloudiotDeviceState":
        """
        :param index: -
        """
        return jsii.invoke(self, "state", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="lastConfigAckTime")
    def last_config_ack_time(self) -> str:
        return jsii.get(self, "lastConfigAckTime")

    @builtins.property
    @jsii.member(jsii_name="lastConfigSendTime")
    def last_config_send_time(self) -> str:
        return jsii.get(self, "lastConfigSendTime")

    @builtins.property
    @jsii.member(jsii_name="lastErrorTime")
    def last_error_time(self) -> str:
        return jsii.get(self, "lastErrorTime")

    @builtins.property
    @jsii.member(jsii_name="lastEventTime")
    def last_event_time(self) -> str:
        return jsii.get(self, "lastEventTime")

    @builtins.property
    @jsii.member(jsii_name="lastHeartbeatTime")
    def last_heartbeat_time(self) -> str:
        return jsii.get(self, "lastHeartbeatTime")

    @builtins.property
    @jsii.member(jsii_name="lastStateTime")
    def last_state_time(self) -> str:
        return jsii.get(self, "lastStateTime")

    @builtins.property
    @jsii.member(jsii_name="numId")
    def num_id(self) -> str:
        return jsii.get(self, "numId")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="registry")
    def registry(self) -> str:
        return jsii.get(self, "registry")

    @registry.setter
    def registry(self, value: str) -> None:
        jsii.set(self, "registry", value)

    @builtins.property
    @jsii.member(jsii_name="blocked")
    def blocked(self) -> typing.Optional[bool]:
        return jsii.get(self, "blocked")

    @blocked.setter
    def blocked(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "blocked", value)

    @builtins.property
    @jsii.member(jsii_name="credentials")
    def credentials(self) -> typing.Optional[typing.List["CloudiotDeviceCredentials"]]:
        return jsii.get(self, "credentials")

    @credentials.setter
    def credentials(self, value: typing.Optional[typing.List["CloudiotDeviceCredentials"]]) -> None:
        jsii.set(self, "credentials", value)

    @builtins.property
    @jsii.member(jsii_name="gatewayConfig")
    def gateway_config(self) -> typing.Optional[typing.List["CloudiotDeviceGatewayConfig"]]:
        return jsii.get(self, "gatewayConfig")

    @gateway_config.setter
    def gateway_config(self, value: typing.Optional[typing.List["CloudiotDeviceGatewayConfig"]]) -> None:
        jsii.set(self, "gatewayConfig", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="logLevel")
    def log_level(self) -> typing.Optional[str]:
        return jsii.get(self, "logLevel")

    @log_level.setter
    def log_level(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "logLevel", value)

    @builtins.property
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "metadata")

    @metadata.setter
    def metadata(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["CloudiotDeviceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["CloudiotDeviceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudiotDeviceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'registry': 'registry', 'blocked': 'blocked', 'credentials': 'credentials', 'gateway_config': 'gatewayConfig', 'log_level': 'logLevel', 'metadata': 'metadata', 'timeouts': 'timeouts'})
class CloudiotDeviceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, registry: str, blocked: typing.Optional[bool]=None, credentials: typing.Optional[typing.List["CloudiotDeviceCredentials"]]=None, gateway_config: typing.Optional[typing.List["CloudiotDeviceGatewayConfig"]]=None, log_level: typing.Optional[str]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, timeouts: typing.Optional["CloudiotDeviceTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: A unique name for the resource.
        :param registry: The name of the device registry where this device should be created.
        :param blocked: If a device is blocked, connections or requests from this device will fail.
        :param credentials: credentials block.
        :param gateway_config: gateway_config block.
        :param log_level: The logging verbosity for device activity. Possible values: ["NONE", "ERROR", "INFO", "DEBUG"]
        :param metadata: The metadata key-value pairs assigned to the device.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = CloudiotDeviceTimeouts(**timeouts)
        self._values = {
            'name': name,
            'registry': registry,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if blocked is not None: self._values["blocked"] = blocked
        if credentials is not None: self._values["credentials"] = credentials
        if gateway_config is not None: self._values["gateway_config"] = gateway_config
        if log_level is not None: self._values["log_level"] = log_level
        if metadata is not None: self._values["metadata"] = metadata
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """A unique name for the resource."""
        return self._values.get('name')

    @builtins.property
    def registry(self) -> str:
        """The name of the device registry where this device should be created."""
        return self._values.get('registry')

    @builtins.property
    def blocked(self) -> typing.Optional[bool]:
        """If a device is blocked, connections or requests from this device will fail."""
        return self._values.get('blocked')

    @builtins.property
    def credentials(self) -> typing.Optional[typing.List["CloudiotDeviceCredentials"]]:
        """credentials block."""
        return self._values.get('credentials')

    @builtins.property
    def gateway_config(self) -> typing.Optional[typing.List["CloudiotDeviceGatewayConfig"]]:
        """gateway_config block."""
        return self._values.get('gateway_config')

    @builtins.property
    def log_level(self) -> typing.Optional[str]:
        """The logging verbosity for device activity.

        Possible values: ["NONE", "ERROR", "INFO", "DEBUG"]
        """
        return self._values.get('log_level')

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        """The metadata key-value pairs assigned to the device."""
        return self._values.get('metadata')

    @builtins.property
    def timeouts(self) -> typing.Optional["CloudiotDeviceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudiotDeviceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudiotDeviceConfigA(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudiotDeviceConfigA"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(CloudiotDeviceConfigA, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="binaryData")
    def binary_data(self) -> str:
        return jsii.get(self, "binaryData")

    @builtins.property
    @jsii.member(jsii_name="cloudUpdateTime")
    def cloud_update_time(self) -> str:
        return jsii.get(self, "cloudUpdateTime")

    @builtins.property
    @jsii.member(jsii_name="deviceAckTime")
    def device_ack_time(self) -> str:
        return jsii.get(self, "deviceAckTime")

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> str:
        return jsii.get(self, "version")


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudiotDeviceCredentials", jsii_struct_bases=[], name_mapping={'public_key': 'publicKey', 'expiration_time': 'expirationTime'})
class CloudiotDeviceCredentials():
    def __init__(self, *, public_key: typing.List["CloudiotDeviceCredentialsPublicKey"], expiration_time: typing.Optional[str]=None) -> None:
        """
        :param public_key: public_key block.
        :param expiration_time: The time at which this credential becomes invalid.
        """
        self._values = {
            'public_key': public_key,
        }
        if expiration_time is not None: self._values["expiration_time"] = expiration_time

    @builtins.property
    def public_key(self) -> typing.List["CloudiotDeviceCredentialsPublicKey"]:
        """public_key block."""
        return self._values.get('public_key')

    @builtins.property
    def expiration_time(self) -> typing.Optional[str]:
        """The time at which this credential becomes invalid."""
        return self._values.get('expiration_time')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudiotDeviceCredentials(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudiotDeviceCredentialsPublicKey", jsii_struct_bases=[], name_mapping={'format': 'format', 'key': 'key'})
class CloudiotDeviceCredentialsPublicKey():
    def __init__(self, *, format: str, key: str) -> None:
        """
        :param format: The format of the key. Possible values: ["RSA_PEM", "RSA_X509_PEM", "ES256_PEM", "ES256_X509_PEM"]
        :param key: The key data.
        """
        self._values = {
            'format': format,
            'key': key,
        }

    @builtins.property
    def format(self) -> str:
        """The format of the key.

        Possible values: ["RSA_PEM", "RSA_X509_PEM", "ES256_PEM", "ES256_X509_PEM"]
        """
        return self._values.get('format')

    @builtins.property
    def key(self) -> str:
        """The key data."""
        return self._values.get('key')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudiotDeviceCredentialsPublicKey(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudiotDeviceGatewayConfig", jsii_struct_bases=[], name_mapping={'gateway_auth_method': 'gatewayAuthMethod', 'gateway_type': 'gatewayType'})
class CloudiotDeviceGatewayConfig():
    def __init__(self, *, gateway_auth_method: typing.Optional[str]=None, gateway_type: typing.Optional[str]=None) -> None:
        """
        :param gateway_auth_method: Indicates whether the device is a gateway. Possible values: ["ASSOCIATION_ONLY", "DEVICE_AUTH_TOKEN_ONLY", "ASSOCIATION_AND_DEVICE_AUTH_TOKEN"]
        :param gateway_type: Indicates whether the device is a gateway. Default value: "NON_GATEWAY" Possible values: ["GATEWAY", "NON_GATEWAY"]
        """
        self._values = {
        }
        if gateway_auth_method is not None: self._values["gateway_auth_method"] = gateway_auth_method
        if gateway_type is not None: self._values["gateway_type"] = gateway_type

    @builtins.property
    def gateway_auth_method(self) -> typing.Optional[str]:
        """Indicates whether the device is a gateway.

        Possible values: ["ASSOCIATION_ONLY", "DEVICE_AUTH_TOKEN_ONLY", "ASSOCIATION_AND_DEVICE_AUTH_TOKEN"]
        """
        return self._values.get('gateway_auth_method')

    @builtins.property
    def gateway_type(self) -> typing.Optional[str]:
        """Indicates whether the device is a gateway.

        Default value: "NON_GATEWAY" Possible values: ["GATEWAY", "NON_GATEWAY"]
        """
        return self._values.get('gateway_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudiotDeviceGatewayConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudiotDeviceLastErrorStatus(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudiotDeviceLastErrorStatus"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(CloudiotDeviceLastErrorStatus, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="details")
    def details(self) -> typing.Any:
        return jsii.get(self, "details")

    @builtins.property
    @jsii.member(jsii_name="message")
    def message(self) -> str:
        return jsii.get(self, "message")

    @builtins.property
    @jsii.member(jsii_name="number")
    def number(self) -> jsii.Number:
        return jsii.get(self, "number")


class CloudiotDeviceState(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudiotDeviceState"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(CloudiotDeviceState, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="binaryData")
    def binary_data(self) -> str:
        return jsii.get(self, "binaryData")

    @builtins.property
    @jsii.member(jsii_name="updateTime")
    def update_time(self) -> str:
        return jsii.get(self, "updateTime")


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudiotDeviceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class CloudiotDeviceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudiotDeviceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class CloudiotRegistry(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.CloudiotRegistry"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, credentials: typing.Optional[typing.List["CloudiotRegistryCredentials"]]=None, event_notification_configs: typing.Optional[typing.List["CloudiotRegistryEventNotificationConfigs"]]=None, http_config: typing.Optional[typing.Mapping[str, str]]=None, log_level: typing.Optional[str]=None, mqtt_config: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, state_notification_config: typing.Optional[typing.Mapping[str, str]]=None, timeouts: typing.Optional["CloudiotRegistryTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: A unique name for the resource, required by device registry.
        :param credentials: credentials block.
        :param event_notification_configs: event_notification_configs block.
        :param http_config: Activate or deactivate HTTP.
        :param log_level: The default logging verbosity for activity from devices in this registry. Specifies which events should be written to logs. For example, if the LogLevel is ERROR, only events that terminate in errors will be logged. LogLevel is inclusive; enabling INFO logging will also enable ERROR logging. Default value: "NONE" Possible values: ["NONE", "ERROR", "INFO", "DEBUG"]
        :param mqtt_config: Activate or deactivate MQTT.
        :param project: 
        :param region: The region in which the created registry should reside. If it is not provided, the provider region is used.
        :param state_notification_config: A PubSub topic to publish device state updates.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = CloudiotRegistryConfig(name=name, credentials=credentials, event_notification_configs=event_notification_configs, http_config=http_config, log_level=log_level, mqtt_config=mqtt_config, project=project, region=region, state_notification_config=state_notification_config, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(CloudiotRegistry, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="credentials")
    def credentials(self) -> typing.Optional[typing.List["CloudiotRegistryCredentials"]]:
        return jsii.get(self, "credentials")

    @credentials.setter
    def credentials(self, value: typing.Optional[typing.List["CloudiotRegistryCredentials"]]) -> None:
        jsii.set(self, "credentials", value)

    @builtins.property
    @jsii.member(jsii_name="eventNotificationConfigs")
    def event_notification_configs(self) -> typing.Optional[typing.List["CloudiotRegistryEventNotificationConfigs"]]:
        return jsii.get(self, "eventNotificationConfigs")

    @event_notification_configs.setter
    def event_notification_configs(self, value: typing.Optional[typing.List["CloudiotRegistryEventNotificationConfigs"]]) -> None:
        jsii.set(self, "eventNotificationConfigs", value)

    @builtins.property
    @jsii.member(jsii_name="httpConfig")
    def http_config(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "httpConfig")

    @http_config.setter
    def http_config(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "httpConfig", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="logLevel")
    def log_level(self) -> typing.Optional[str]:
        return jsii.get(self, "logLevel")

    @log_level.setter
    def log_level(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "logLevel", value)

    @builtins.property
    @jsii.member(jsii_name="mqttConfig")
    def mqtt_config(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "mqttConfig")

    @mqtt_config.setter
    def mqtt_config(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "mqttConfig", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="stateNotificationConfig")
    def state_notification_config(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "stateNotificationConfig")

    @state_notification_config.setter
    def state_notification_config(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "stateNotificationConfig", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["CloudiotRegistryTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["CloudiotRegistryTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudiotRegistryConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'credentials': 'credentials', 'event_notification_configs': 'eventNotificationConfigs', 'http_config': 'httpConfig', 'log_level': 'logLevel', 'mqtt_config': 'mqttConfig', 'project': 'project', 'region': 'region', 'state_notification_config': 'stateNotificationConfig', 'timeouts': 'timeouts'})
class CloudiotRegistryConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, credentials: typing.Optional[typing.List["CloudiotRegistryCredentials"]]=None, event_notification_configs: typing.Optional[typing.List["CloudiotRegistryEventNotificationConfigs"]]=None, http_config: typing.Optional[typing.Mapping[str, str]]=None, log_level: typing.Optional[str]=None, mqtt_config: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, state_notification_config: typing.Optional[typing.Mapping[str, str]]=None, timeouts: typing.Optional["CloudiotRegistryTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: A unique name for the resource, required by device registry.
        :param credentials: credentials block.
        :param event_notification_configs: event_notification_configs block.
        :param http_config: Activate or deactivate HTTP.
        :param log_level: The default logging verbosity for activity from devices in this registry. Specifies which events should be written to logs. For example, if the LogLevel is ERROR, only events that terminate in errors will be logged. LogLevel is inclusive; enabling INFO logging will also enable ERROR logging. Default value: "NONE" Possible values: ["NONE", "ERROR", "INFO", "DEBUG"]
        :param mqtt_config: Activate or deactivate MQTT.
        :param project: 
        :param region: The region in which the created registry should reside. If it is not provided, the provider region is used.
        :param state_notification_config: A PubSub topic to publish device state updates.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = CloudiotRegistryTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if credentials is not None: self._values["credentials"] = credentials
        if event_notification_configs is not None: self._values["event_notification_configs"] = event_notification_configs
        if http_config is not None: self._values["http_config"] = http_config
        if log_level is not None: self._values["log_level"] = log_level
        if mqtt_config is not None: self._values["mqtt_config"] = mqtt_config
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if state_notification_config is not None: self._values["state_notification_config"] = state_notification_config
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """A unique name for the resource, required by device registry."""
        return self._values.get('name')

    @builtins.property
    def credentials(self) -> typing.Optional[typing.List["CloudiotRegistryCredentials"]]:
        """credentials block."""
        return self._values.get('credentials')

    @builtins.property
    def event_notification_configs(self) -> typing.Optional[typing.List["CloudiotRegistryEventNotificationConfigs"]]:
        """event_notification_configs block."""
        return self._values.get('event_notification_configs')

    @builtins.property
    def http_config(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Activate or deactivate HTTP."""
        return self._values.get('http_config')

    @builtins.property
    def log_level(self) -> typing.Optional[str]:
        """The default logging verbosity for activity from devices in this registry.

        Specifies which events should be written to logs. For
        example, if the LogLevel is ERROR, only events that terminate in
        errors will be logged. LogLevel is inclusive; enabling INFO logging
        will also enable ERROR logging. Default value: "NONE" Possible values: ["NONE", "ERROR", "INFO", "DEBUG"]
        """
        return self._values.get('log_level')

    @builtins.property
    def mqtt_config(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Activate or deactivate MQTT."""
        return self._values.get('mqtt_config')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The region in which the created registry should reside.

        If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    @builtins.property
    def state_notification_config(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A PubSub topic to publish device state updates."""
        return self._values.get('state_notification_config')

    @builtins.property
    def timeouts(self) -> typing.Optional["CloudiotRegistryTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudiotRegistryConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudiotRegistryCredentials", jsii_struct_bases=[], name_mapping={'public_key_certificate': 'publicKeyCertificate'})
class CloudiotRegistryCredentials():
    def __init__(self, *, public_key_certificate: typing.Mapping[str, str]) -> None:
        """
        :param public_key_certificate: A public key certificate format and data.
        """
        self._values = {
            'public_key_certificate': public_key_certificate,
        }

    @builtins.property
    def public_key_certificate(self) -> typing.Mapping[str, str]:
        """A public key certificate format and data."""
        return self._values.get('public_key_certificate')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudiotRegistryCredentials(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudiotRegistryEventNotificationConfigs", jsii_struct_bases=[], name_mapping={'pubsub_topic_name': 'pubsubTopicName', 'subfolder_matches': 'subfolderMatches'})
class CloudiotRegistryEventNotificationConfigs():
    def __init__(self, *, pubsub_topic_name: str, subfolder_matches: typing.Optional[str]=None) -> None:
        """
        :param pubsub_topic_name: PubSub topic name to publish device events.
        :param subfolder_matches: If the subfolder name matches this string exactly, this configuration will be used. The string must not include the leading '/' character. If empty, all strings are matched. Empty value can only be used for the last 'event_notification_configs' item.
        """
        self._values = {
            'pubsub_topic_name': pubsub_topic_name,
        }
        if subfolder_matches is not None: self._values["subfolder_matches"] = subfolder_matches

    @builtins.property
    def pubsub_topic_name(self) -> str:
        """PubSub topic name to publish device events."""
        return self._values.get('pubsub_topic_name')

    @builtins.property
    def subfolder_matches(self) -> typing.Optional[str]:
        """If the subfolder name matches this string exactly, this configuration will be used.

        The string must not include the
        leading '/' character. If empty, all strings are matched. Empty
        value can only be used for the last 'event_notification_configs'
        item.
        """
        return self._values.get('subfolder_matches')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudiotRegistryEventNotificationConfigs(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.CloudiotRegistryTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class CloudiotRegistryTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'CloudiotRegistryTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComposerEnvironment(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComposerEnvironment"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, config: typing.Optional[typing.List["ComposerEnvironmentConfigA"]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComposerEnvironmentTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the environment.
        :param config: config block.
        :param labels: User-defined labels for this environment. The labels map can contain no more than 64 entries. Entries of the labels map are UTF8 strings that comply with the following restrictions: Label keys must be between 1 and 63 characters long and must conform to the following regular expression: `a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?. Label values must be between 0 and 63 characters long and must conform to the regular expression (`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?)?. No more than 64 labels can be associated with a given environment. Both keys and values must be <= 128 bytes in size.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param region: The location or Compute Engine region for the environment.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config_ = ComposerEnvironmentConfig(name=name, config=config, labels=labels, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComposerEnvironment, self, [scope, id, config_])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="config")
    def config(self) -> typing.Optional[typing.List["ComposerEnvironmentConfigA"]]:
        return jsii.get(self, "config")

    @config.setter
    def config(self, value: typing.Optional[typing.List["ComposerEnvironmentConfigA"]]) -> None:
        jsii.set(self, "config", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComposerEnvironmentTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComposerEnvironmentTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComposerEnvironmentConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'config': 'config', 'labels': 'labels', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class ComposerEnvironmentConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, config: typing.Optional[typing.List["ComposerEnvironmentConfigA"]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComposerEnvironmentTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the environment.
        :param config: config block.
        :param labels: User-defined labels for this environment. The labels map can contain no more than 64 entries. Entries of the labels map are UTF8 strings that comply with the following restrictions: Label keys must be between 1 and 63 characters long and must conform to the following regular expression: `a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?. Label values must be between 0 and 63 characters long and must conform to the regular expression (`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?)?. No more than 64 labels can be associated with a given environment. Both keys and values must be <= 128 bytes in size.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param region: The location or Compute Engine region for the environment.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComposerEnvironmentTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if config is not None: self._values["config"] = config
        if labels is not None: self._values["labels"] = labels
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the environment."""
        return self._values.get('name')

    @builtins.property
    def config(self) -> typing.Optional[typing.List["ComposerEnvironmentConfigA"]]:
        """config block."""
        return self._values.get('config')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """User-defined labels for this environment.

        The labels map can contain no more than 64 entries. Entries of the labels map are UTF8 strings that comply with the following restrictions: Label keys must be between 1 and 63 characters long and must conform to the following regular expression: `a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?. Label values must be between 0 and 63 characters long and must conform to the regular expression (`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?)?. No more than 64 labels can be associated with a given environment. Both keys and values must be <= 128 bytes in size.
        """
        return self._values.get('labels')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The location or Compute Engine region for the environment."""
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComposerEnvironmentTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComposerEnvironmentConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComposerEnvironmentConfigA", jsii_struct_bases=[], name_mapping={'node_config': 'nodeConfig', 'node_count': 'nodeCount', 'private_environment_config': 'privateEnvironmentConfig', 'software_config': 'softwareConfig'})
class ComposerEnvironmentConfigA():
    def __init__(self, *, node_config: typing.Optional[typing.List["ComposerEnvironmentConfigNodeConfig"]]=None, node_count: typing.Optional[jsii.Number]=None, private_environment_config: typing.Optional[typing.List["ComposerEnvironmentConfigPrivateEnvironmentConfig"]]=None, software_config: typing.Optional[typing.List["ComposerEnvironmentConfigSoftwareConfig"]]=None) -> None:
        """
        :param node_config: node_config block.
        :param node_count: The number of nodes in the Kubernetes Engine cluster that will be used to run this environment.
        :param private_environment_config: private_environment_config block.
        :param software_config: software_config block.
        """
        self._values = {
        }
        if node_config is not None: self._values["node_config"] = node_config
        if node_count is not None: self._values["node_count"] = node_count
        if private_environment_config is not None: self._values["private_environment_config"] = private_environment_config
        if software_config is not None: self._values["software_config"] = software_config

    @builtins.property
    def node_config(self) -> typing.Optional[typing.List["ComposerEnvironmentConfigNodeConfig"]]:
        """node_config block."""
        return self._values.get('node_config')

    @builtins.property
    def node_count(self) -> typing.Optional[jsii.Number]:
        """The number of nodes in the Kubernetes Engine cluster that will be used to run this environment."""
        return self._values.get('node_count')

    @builtins.property
    def private_environment_config(self) -> typing.Optional[typing.List["ComposerEnvironmentConfigPrivateEnvironmentConfig"]]:
        """private_environment_config block."""
        return self._values.get('private_environment_config')

    @builtins.property
    def software_config(self) -> typing.Optional[typing.List["ComposerEnvironmentConfigSoftwareConfig"]]:
        """software_config block."""
        return self._values.get('software_config')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComposerEnvironmentConfigA(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComposerEnvironmentConfigNodeConfig", jsii_struct_bases=[], name_mapping={'zone': 'zone', 'disk_size_gb': 'diskSizeGb', 'ip_allocation_policy': 'ipAllocationPolicy', 'machine_type': 'machineType', 'network': 'network', 'oauth_scopes': 'oauthScopes', 'service_account': 'serviceAccount', 'subnetwork': 'subnetwork', 'tags': 'tags'})
class ComposerEnvironmentConfigNodeConfig():
    def __init__(self, *, zone: str, disk_size_gb: typing.Optional[jsii.Number]=None, ip_allocation_policy: typing.Optional[typing.List["ComposerEnvironmentConfigNodeConfigIpAllocationPolicy"]]=None, machine_type: typing.Optional[str]=None, network: typing.Optional[str]=None, oauth_scopes: typing.Optional[typing.List[str]]=None, service_account: typing.Optional[str]=None, subnetwork: typing.Optional[str]=None, tags: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param zone: The Compute Engine zone in which to deploy the VMs running the Apache Airflow software, specified as the zone name or relative resource name (e.g. "projects/{project}/zones/{zone}"). Must belong to the enclosing environment's project and region.
        :param disk_size_gb: The disk size in GB used for node VMs. Minimum size is 20GB. If unspecified, defaults to 100GB. Cannot be updated.
        :param ip_allocation_policy: Configuration for controlling how IPs are allocated in the GKE cluster. Cannot be updated.
        :param machine_type: The Compute Engine machine type used for cluster instances, specified as a name or relative resource name. For example: "projects/{project}/zones/{zone}/machineTypes/{machineType}". Must belong to the enclosing environment's project and region/zone.
        :param network: The Compute Engine machine type used for cluster instances, specified as a name or relative resource name. For example: "projects/{project}/zones/{zone}/machineTypes/{machineType}". Must belong to the enclosing environment's project and region/zone. The network must belong to the environment's project. If unspecified, the "default" network ID in the environment's project is used. If a Custom Subnet Network is provided, subnetwork must also be provided.
        :param oauth_scopes: The set of Google API scopes to be made available on all node VMs. Cannot be updated. If empty, defaults to ["https://www.googleapis.com/auth/cloud-platform"].
        :param service_account: The Google Cloud Platform Service Account to be used by the node VMs. If a service account is not specified, the "default" Compute Engine service account is used. Cannot be updated. If given, note that the service account must have roles/composer.worker for any GCP resources created under the Cloud Composer Environment.
        :param subnetwork: The Compute Engine subnetwork to be used for machine communications, , specified as a self-link, relative resource name (e.g. "projects/{project}/regions/{region}/subnetworks/{subnetwork}"), or by name. If subnetwork is provided, network must also be provided and the subnetwork must belong to the enclosing environment's project and region.
        :param tags: The list of instance tags applied to all node VMs. Tags are used to identify valid sources or targets for network firewalls. Each tag within the list must comply with RFC1035. Cannot be updated.
        """
        self._values = {
            'zone': zone,
        }
        if disk_size_gb is not None: self._values["disk_size_gb"] = disk_size_gb
        if ip_allocation_policy is not None: self._values["ip_allocation_policy"] = ip_allocation_policy
        if machine_type is not None: self._values["machine_type"] = machine_type
        if network is not None: self._values["network"] = network
        if oauth_scopes is not None: self._values["oauth_scopes"] = oauth_scopes
        if service_account is not None: self._values["service_account"] = service_account
        if subnetwork is not None: self._values["subnetwork"] = subnetwork
        if tags is not None: self._values["tags"] = tags

    @builtins.property
    def zone(self) -> str:
        """The Compute Engine zone in which to deploy the VMs running the Apache Airflow software, specified as the zone name or relative resource name (e.g. "projects/{project}/zones/{zone}"). Must belong to the enclosing environment's project and region."""
        return self._values.get('zone')

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        """The disk size in GB used for node VMs.

        Minimum size is 20GB. If unspecified, defaults to 100GB. Cannot be updated.
        """
        return self._values.get('disk_size_gb')

    @builtins.property
    def ip_allocation_policy(self) -> typing.Optional[typing.List["ComposerEnvironmentConfigNodeConfigIpAllocationPolicy"]]:
        """Configuration for controlling how IPs are allocated in the GKE cluster.

        Cannot be updated.
        """
        return self._values.get('ip_allocation_policy')

    @builtins.property
    def machine_type(self) -> typing.Optional[str]:
        """The Compute Engine machine type used for cluster instances, specified as a name or relative resource name.

        For example: "projects/{project}/zones/{zone}/machineTypes/{machineType}". Must belong to the enclosing environment's project and region/zone.
        """
        return self._values.get('machine_type')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """The Compute Engine machine type used for cluster instances, specified as a name or relative resource name.

        For example: "projects/{project}/zones/{zone}/machineTypes/{machineType}". Must belong to the enclosing environment's project and region/zone. The network must belong to the environment's project. If unspecified, the "default" network ID in the environment's project is used. If a Custom Subnet Network is provided, subnetwork must also be provided.
        """
        return self._values.get('network')

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[str]]:
        """The set of Google API scopes to be made available on all node VMs.

        Cannot be updated. If empty, defaults to ["https://www.googleapis.com/auth/cloud-platform"].
        """
        return self._values.get('oauth_scopes')

    @builtins.property
    def service_account(self) -> typing.Optional[str]:
        """The Google Cloud Platform Service Account to be used by the node VMs.

        If a service account is not specified, the "default" Compute Engine service account is used. Cannot be updated. If given, note that the service account must have roles/composer.worker for any GCP resources created under the Cloud Composer Environment.
        """
        return self._values.get('service_account')

    @builtins.property
    def subnetwork(self) -> typing.Optional[str]:
        """The Compute Engine subnetwork to be used for machine communications, , specified as a self-link, relative resource name (e.g. "projects/{project}/regions/{region}/subnetworks/{subnetwork}"), or by name. If subnetwork is provided, network must also be provided and the subnetwork must belong to the enclosing environment's project and region."""
        return self._values.get('subnetwork')

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[str]]:
        """The list of instance tags applied to all node VMs.

        Tags are used to identify valid sources or targets for network firewalls. Each tag within the list must comply with RFC1035. Cannot be updated.
        """
        return self._values.get('tags')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComposerEnvironmentConfigNodeConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComposerEnvironmentConfigNodeConfigIpAllocationPolicy", jsii_struct_bases=[], name_mapping={'cluster_ipv4_cidr_block': 'clusterIpv4CidrBlock', 'cluster_secondary_range_name': 'clusterSecondaryRangeName', 'services_ipv4_cidr_block': 'servicesIpv4CidrBlock', 'services_secondary_range_name': 'servicesSecondaryRangeName', 'use_ip_aliases': 'useIpAliases'})
class ComposerEnvironmentConfigNodeConfigIpAllocationPolicy():
    def __init__(self, *, cluster_ipv4_cidr_block: typing.Optional[str]=None, cluster_secondary_range_name: typing.Optional[str]=None, services_ipv4_cidr_block: typing.Optional[str]=None, services_secondary_range_name: typing.Optional[str]=None, use_ip_aliases: typing.Optional[bool]=None) -> None:
        """
        :param cluster_ipv4_cidr_block: 
        :param cluster_secondary_range_name: 
        :param services_ipv4_cidr_block: 
        :param services_secondary_range_name: 
        :param use_ip_aliases: 
        """
        self._values = {
        }
        if cluster_ipv4_cidr_block is not None: self._values["cluster_ipv4_cidr_block"] = cluster_ipv4_cidr_block
        if cluster_secondary_range_name is not None: self._values["cluster_secondary_range_name"] = cluster_secondary_range_name
        if services_ipv4_cidr_block is not None: self._values["services_ipv4_cidr_block"] = services_ipv4_cidr_block
        if services_secondary_range_name is not None: self._values["services_secondary_range_name"] = services_secondary_range_name
        if use_ip_aliases is not None: self._values["use_ip_aliases"] = use_ip_aliases

    @builtins.property
    def cluster_ipv4_cidr_block(self) -> typing.Optional[str]:
        return self._values.get('cluster_ipv4_cidr_block')

    @builtins.property
    def cluster_secondary_range_name(self) -> typing.Optional[str]:
        return self._values.get('cluster_secondary_range_name')

    @builtins.property
    def services_ipv4_cidr_block(self) -> typing.Optional[str]:
        return self._values.get('services_ipv4_cidr_block')

    @builtins.property
    def services_secondary_range_name(self) -> typing.Optional[str]:
        return self._values.get('services_secondary_range_name')

    @builtins.property
    def use_ip_aliases(self) -> typing.Optional[bool]:
        return self._values.get('use_ip_aliases')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComposerEnvironmentConfigNodeConfigIpAllocationPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComposerEnvironmentConfigPrivateEnvironmentConfig", jsii_struct_bases=[], name_mapping={'cloud_sql_ipv4_cidr_block': 'cloudSqlIpv4CidrBlock', 'enable_private_endpoint': 'enablePrivateEndpoint', 'master_ipv4_cidr_block': 'masterIpv4CidrBlock', 'web_server_ipv4_cidr_block': 'webServerIpv4CidrBlock'})
class ComposerEnvironmentConfigPrivateEnvironmentConfig():
    def __init__(self, *, cloud_sql_ipv4_cidr_block: typing.Optional[str]=None, enable_private_endpoint: typing.Optional[bool]=None, master_ipv4_cidr_block: typing.Optional[str]=None, web_server_ipv4_cidr_block: typing.Optional[str]=None) -> None:
        """
        :param cloud_sql_ipv4_cidr_block: The CIDR block from which IP range in tenant project will be reserved for Cloud SQL. Needs to be disjoint from web_server_ipv4_cidr_block.
        :param enable_private_endpoint: If true, access to the public endpoint of the GKE cluster is denied.
        :param master_ipv4_cidr_block: The IP range in CIDR notation to use for the hosted master network. This range is used for assigning internal IP addresses to the cluster master or set of masters and to the internal load balancer virtual IP. This range must not overlap with any other ranges in use within the cluster's network. If left blank, the default value of '172.16.0.0/28' is used.
        :param web_server_ipv4_cidr_block: The CIDR block from which IP range for web server will be reserved. Needs to be disjoint from master_ipv4_cidr_block and cloud_sql_ipv4_cidr_block.
        """
        self._values = {
        }
        if cloud_sql_ipv4_cidr_block is not None: self._values["cloud_sql_ipv4_cidr_block"] = cloud_sql_ipv4_cidr_block
        if enable_private_endpoint is not None: self._values["enable_private_endpoint"] = enable_private_endpoint
        if master_ipv4_cidr_block is not None: self._values["master_ipv4_cidr_block"] = master_ipv4_cidr_block
        if web_server_ipv4_cidr_block is not None: self._values["web_server_ipv4_cidr_block"] = web_server_ipv4_cidr_block

    @builtins.property
    def cloud_sql_ipv4_cidr_block(self) -> typing.Optional[str]:
        """The CIDR block from which IP range in tenant project will be reserved for Cloud SQL.

        Needs to be disjoint from web_server_ipv4_cidr_block.
        """
        return self._values.get('cloud_sql_ipv4_cidr_block')

    @builtins.property
    def enable_private_endpoint(self) -> typing.Optional[bool]:
        """If true, access to the public endpoint of the GKE cluster is denied."""
        return self._values.get('enable_private_endpoint')

    @builtins.property
    def master_ipv4_cidr_block(self) -> typing.Optional[str]:
        """The IP range in CIDR notation to use for the hosted master network.

        This range is used for assigning internal IP addresses to the cluster master or set of masters and to the internal load balancer virtual IP. This range must not overlap with any other ranges in use within the cluster's network. If left blank, the default value of '172.16.0.0/28' is used.
        """
        return self._values.get('master_ipv4_cidr_block')

    @builtins.property
    def web_server_ipv4_cidr_block(self) -> typing.Optional[str]:
        """The CIDR block from which IP range for web server will be reserved.

        Needs to be disjoint from master_ipv4_cidr_block and cloud_sql_ipv4_cidr_block.
        """
        return self._values.get('web_server_ipv4_cidr_block')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComposerEnvironmentConfigPrivateEnvironmentConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComposerEnvironmentConfigSoftwareConfig", jsii_struct_bases=[], name_mapping={'airflow_config_overrides': 'airflowConfigOverrides', 'env_variables': 'envVariables', 'image_version': 'imageVersion', 'pypi_packages': 'pypiPackages', 'python_version': 'pythonVersion'})
class ComposerEnvironmentConfigSoftwareConfig():
    def __init__(self, *, airflow_config_overrides: typing.Optional[typing.Mapping[str, str]]=None, env_variables: typing.Optional[typing.Mapping[str, str]]=None, image_version: typing.Optional[str]=None, pypi_packages: typing.Optional[typing.Mapping[str, str]]=None, python_version: typing.Optional[str]=None) -> None:
        """
        :param airflow_config_overrides: Apache Airflow configuration properties to override. Property keys contain the section and property names, separated by a hyphen, for example "core-dags_are_paused_at_creation". Section names must not contain hyphens ("-"), opening square brackets ("["), or closing square brackets ("]"). The property name must not be empty and cannot contain "=" or ";". Section and property names cannot contain characters: "." Apache Airflow configuration property names must be written in snake_case. Property values can contain any character, and can be written in any lower/upper case format. Certain Apache Airflow configuration property values are blacklisted, and cannot be overridden.
        :param env_variables: Additional environment variables to provide to the Apache Airflow scheduler, worker, and webserver processes. Environment variable names must match the regular expression [a-zA-Z_][a-zA-Z0-9_]*. They cannot specify Apache Airflow software configuration overrides (they cannot match the regular expression AIRFLOW__[A-Z0-9_]+__[A-Z0-9_]+), and they cannot match any of the following reserved names: AIRFLOW_HOME C_FORCE_ROOT CONTAINER_NAME DAGS_FOLDER GCP_PROJECT GCS_BUCKET GKE_CLUSTER_NAME SQL_DATABASE SQL_INSTANCE SQL_PASSWORD SQL_PROJECT SQL_REGION SQL_USER.
        :param image_version: The version of the software running in the environment. This encapsulates both the version of Cloud Composer functionality and the version of Apache Airflow. It must match the regular expression composer-[0-9]+.[0-9]+(.[0-9]+)?-airflow-[0-9]+.[0-9]+(.[0-9]+.*)?. The Cloud Composer portion of the version is a semantic version. The portion of the image version following 'airflow-' is an official Apache Airflow repository release name. See documentation for allowed release names.
        :param pypi_packages: Custom Python Package Index (PyPI) packages to be installed in the environment. Keys refer to the lowercase package name (e.g. "numpy"). Values are the lowercase extras and version specifier (e.g. "==1.12.0", "[devel,gcp_api]", "[devel]>=1.8.2, <1.9.2"). To specify a package without pinning it to a version specifier, use the empty string as the value.
        :param python_version: The major version of Python used to run the Apache Airflow scheduler, worker, and webserver processes. Can be set to '2' or '3'. If not specified, the default is '2'. Cannot be updated.
        """
        self._values = {
        }
        if airflow_config_overrides is not None: self._values["airflow_config_overrides"] = airflow_config_overrides
        if env_variables is not None: self._values["env_variables"] = env_variables
        if image_version is not None: self._values["image_version"] = image_version
        if pypi_packages is not None: self._values["pypi_packages"] = pypi_packages
        if python_version is not None: self._values["python_version"] = python_version

    @builtins.property
    def airflow_config_overrides(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Apache Airflow configuration properties to override.

        Property keys contain the section and property names, separated by a hyphen, for example "core-dags_are_paused_at_creation". Section names must not contain hyphens ("-"), opening square brackets ("["), or closing square brackets ("]"). The property name must not be empty and cannot contain "=" or ";". Section and property names cannot contain characters: "." Apache Airflow configuration property names must be written in snake_case. Property values can contain any character, and can be written in any lower/upper case format. Certain Apache Airflow configuration property values are blacklisted, and cannot be overridden.
        """
        return self._values.get('airflow_config_overrides')

    @builtins.property
    def env_variables(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Additional environment variables to provide to the Apache Airflow scheduler, worker, and webserver processes.

        Environment variable names must match the regular expression [a-zA-Z_][a-zA-Z0-9_]*. They cannot specify Apache Airflow software configuration overrides (they cannot match the regular expression AIRFLOW__[A-Z0-9_]+__[A-Z0-9_]+), and they cannot match any of the following reserved names: AIRFLOW_HOME C_FORCE_ROOT CONTAINER_NAME DAGS_FOLDER GCP_PROJECT GCS_BUCKET GKE_CLUSTER_NAME SQL_DATABASE SQL_INSTANCE SQL_PASSWORD SQL_PROJECT SQL_REGION SQL_USER.
        """
        return self._values.get('env_variables')

    @builtins.property
    def image_version(self) -> typing.Optional[str]:
        """The version of the software running in the environment.

        This encapsulates both the version of Cloud Composer functionality and the version of Apache Airflow. It must match the regular expression composer-[0-9]+.[0-9]+(.[0-9]+)?-airflow-[0-9]+.[0-9]+(.[0-9]+.*)?. The Cloud Composer portion of the version is a semantic version. The portion of the image version following 'airflow-' is an official Apache Airflow repository release name. See documentation for allowed release names.
        """
        return self._values.get('image_version')

    @builtins.property
    def pypi_packages(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Custom Python Package Index (PyPI) packages to be installed in the environment.

        Keys refer to the lowercase package name (e.g. "numpy"). Values are the lowercase extras and version specifier (e.g. "==1.12.0", "[devel,gcp_api]", "[devel]>=1.8.2, <1.9.2"). To specify a package without pinning it to a version specifier, use the empty string as the value.
        """
        return self._values.get('pypi_packages')

    @builtins.property
    def python_version(self) -> typing.Optional[str]:
        """The major version of Python used to run the Apache Airflow scheduler, worker, and webserver processes.

        Can be set to '2' or '3'. If not specified, the default is '2'. Cannot be updated.
        """
        return self._values.get('python_version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComposerEnvironmentConfigSoftwareConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComposerEnvironmentTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComposerEnvironmentTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComposerEnvironmentTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeAddress(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeAddress"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, address: typing.Optional[str]=None, address_type: typing.Optional[str]=None, description: typing.Optional[str]=None, network_tier: typing.Optional[str]=None, project: typing.Optional[str]=None, purpose: typing.Optional[str]=None, region: typing.Optional[str]=None, subnetwork: typing.Optional[str]=None, timeouts: typing.Optional["ComputeAddressTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param address: The static external IP address represented by this resource. Only IPv4 is supported. An address may only be specified for INTERNAL address types. The IP address must be inside the specified subnetwork, if any.
        :param address_type: The type of address to reserve. Default value: "EXTERNAL" Possible values: ["INTERNAL", "EXTERNAL"]
        :param description: An optional description of this resource.
        :param network_tier: The networking tier used for configuring this address. If this field is not specified, it is assumed to be PREMIUM. Possible values: ["PREMIUM", "STANDARD"]
        :param project: 
        :param purpose: The purpose of this resource, which can be one of the following values:. - GCE_ENDPOINT for addresses that are used by VM instances, alias IP ranges, internal load balancers, and similar resources. This should only be set when using an Internal address. Possible values: ["GCE_ENDPOINT"]
        :param region: The Region in which the created address should reside. If it is not provided, the provider region is used.
        :param subnetwork: The URL of the subnetwork in which to reserve the address. If an IP address is specified, it must be within the subnetwork's IP range. This field can only be used with INTERNAL type with GCE_ENDPOINT/DNS_RESOLVER purposes.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeAddressConfig(name=name, address=address, address_type=address_type, description=description, network_tier=network_tier, project=project, purpose=purpose, region=region, subnetwork=subnetwork, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeAddress, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="users")
    def users(self) -> typing.List[str]:
        return jsii.get(self, "users")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="address")
    def address(self) -> typing.Optional[str]:
        return jsii.get(self, "address")

    @address.setter
    def address(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "address", value)

    @builtins.property
    @jsii.member(jsii_name="addressType")
    def address_type(self) -> typing.Optional[str]:
        return jsii.get(self, "addressType")

    @address_type.setter
    def address_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "addressType", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="networkTier")
    def network_tier(self) -> typing.Optional[str]:
        return jsii.get(self, "networkTier")

    @network_tier.setter
    def network_tier(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "networkTier", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="purpose")
    def purpose(self) -> typing.Optional[str]:
        return jsii.get(self, "purpose")

    @purpose.setter
    def purpose(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "purpose", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> typing.Optional[str]:
        return jsii.get(self, "subnetwork")

    @subnetwork.setter
    def subnetwork(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "subnetwork", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeAddressTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeAddressTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeAddressConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'address': 'address', 'address_type': 'addressType', 'description': 'description', 'network_tier': 'networkTier', 'project': 'project', 'purpose': 'purpose', 'region': 'region', 'subnetwork': 'subnetwork', 'timeouts': 'timeouts'})
class ComputeAddressConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, address: typing.Optional[str]=None, address_type: typing.Optional[str]=None, description: typing.Optional[str]=None, network_tier: typing.Optional[str]=None, project: typing.Optional[str]=None, purpose: typing.Optional[str]=None, region: typing.Optional[str]=None, subnetwork: typing.Optional[str]=None, timeouts: typing.Optional["ComputeAddressTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param address: The static external IP address represented by this resource. Only IPv4 is supported. An address may only be specified for INTERNAL address types. The IP address must be inside the specified subnetwork, if any.
        :param address_type: The type of address to reserve. Default value: "EXTERNAL" Possible values: ["INTERNAL", "EXTERNAL"]
        :param description: An optional description of this resource.
        :param network_tier: The networking tier used for configuring this address. If this field is not specified, it is assumed to be PREMIUM. Possible values: ["PREMIUM", "STANDARD"]
        :param project: 
        :param purpose: The purpose of this resource, which can be one of the following values:. - GCE_ENDPOINT for addresses that are used by VM instances, alias IP ranges, internal load balancers, and similar resources. This should only be set when using an Internal address. Possible values: ["GCE_ENDPOINT"]
        :param region: The Region in which the created address should reside. If it is not provided, the provider region is used.
        :param subnetwork: The URL of the subnetwork in which to reserve the address. If an IP address is specified, it must be within the subnetwork's IP range. This field can only be used with INTERNAL type with GCE_ENDPOINT/DNS_RESOLVER purposes.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeAddressTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if address is not None: self._values["address"] = address
        if address_type is not None: self._values["address_type"] = address_type
        if description is not None: self._values["description"] = description
        if network_tier is not None: self._values["network_tier"] = network_tier
        if project is not None: self._values["project"] = project
        if purpose is not None: self._values["purpose"] = purpose
        if region is not None: self._values["region"] = region
        if subnetwork is not None: self._values["subnetwork"] = subnetwork
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        The name must be 1-63 characters long, and
        comply with RFC1035. Specifically, the name must be 1-63 characters
        long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?'
        which means the first character must be a lowercase letter, and all
        following characters must be a dash, lowercase letter, or digit,
        except the last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def address(self) -> typing.Optional[str]:
        """The static external IP address represented by this resource.

        Only
        IPv4 is supported. An address may only be specified for INTERNAL
        address types. The IP address must be inside the specified subnetwork,
        if any.
        """
        return self._values.get('address')

    @builtins.property
    def address_type(self) -> typing.Optional[str]:
        """The type of address to reserve.

        Default value: "EXTERNAL" Possible values: ["INTERNAL", "EXTERNAL"]
        """
        return self._values.get('address_type')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def network_tier(self) -> typing.Optional[str]:
        """The networking tier used for configuring this address.

        If this field is not
        specified, it is assumed to be PREMIUM. Possible values: ["PREMIUM", "STANDARD"]
        """
        return self._values.get('network_tier')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def purpose(self) -> typing.Optional[str]:
        """The purpose of this resource, which can be one of the following values:.

        - GCE_ENDPOINT for addresses that are used by VM instances, alias IP ranges, internal load balancers, and similar resources.

        This should only be set when using an Internal address. Possible values: ["GCE_ENDPOINT"]
        """
        return self._values.get('purpose')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The Region in which the created address should reside.

        If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    @builtins.property
    def subnetwork(self) -> typing.Optional[str]:
        """The URL of the subnetwork in which to reserve the address.

        If an IP
        address is specified, it must be within the subnetwork's IP range.
        This field can only be used with INTERNAL type with
        GCE_ENDPOINT/DNS_RESOLVER purposes.
        """
        return self._values.get('subnetwork')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeAddressTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeAddressConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeAddressTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeAddressTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeAddressTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeAttachedDisk(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeAttachedDisk"):
    def __init__(self, scope: constructs.Construct, id: str, *, disk: str, instance: str, device_name: typing.Optional[str]=None, mode: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeAttachedDiskTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param disk: name or self_link of the disk that will be attached.
        :param instance: name or self_link of the compute instance that the disk will be attached to. If the self_link is provided then zone and project are extracted from the self link. If only the name is used then zone and project must be defined as properties on the resource or provider.
        :param device_name: Specifies a unique device name of your choice that is reflected into the /dev/disk/by-id/google-* tree of a Linux operating system running within the instance. This name can be used to reference the device for mounting, resizing, and so on, from within the instance. If not specified, the server chooses a default device name to apply to this disk, in the form persistent-disks-x, where x is a number assigned by Google Compute Engine.
        :param mode: The mode in which to attach this disk, either READ_WRITE or READ_ONLY. If not specified, the default is to attach the disk in READ_WRITE mode.
        :param project: The project that the referenced compute instance is a part of. If instance is referenced by its self_link the project defined in the link will take precedence.
        :param timeouts: timeouts block.
        :param zone: The zone that the referenced compute instance is located within. If instance is referenced by its self_link the zone defined in the link will take precedence.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeAttachedDiskConfig(disk=disk, instance=instance, device_name=device_name, mode=mode, project=project, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeAttachedDisk, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="disk")
    def disk(self) -> str:
        return jsii.get(self, "disk")

    @disk.setter
    def disk(self, value: str) -> None:
        jsii.set(self, "disk", value)

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="deviceName")
    def device_name(self) -> typing.Optional[str]:
        return jsii.get(self, "deviceName")

    @device_name.setter
    def device_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "deviceName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="mode")
    def mode(self) -> typing.Optional[str]:
        return jsii.get(self, "mode")

    @mode.setter
    def mode(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "mode", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeAttachedDiskTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeAttachedDiskTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeAttachedDiskConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'disk': 'disk', 'instance': 'instance', 'device_name': 'deviceName', 'mode': 'mode', 'project': 'project', 'timeouts': 'timeouts', 'zone': 'zone'})
class ComputeAttachedDiskConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, disk: str, instance: str, device_name: typing.Optional[str]=None, mode: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeAttachedDiskTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param disk: name or self_link of the disk that will be attached.
        :param instance: name or self_link of the compute instance that the disk will be attached to. If the self_link is provided then zone and project are extracted from the self link. If only the name is used then zone and project must be defined as properties on the resource or provider.
        :param device_name: Specifies a unique device name of your choice that is reflected into the /dev/disk/by-id/google-* tree of a Linux operating system running within the instance. This name can be used to reference the device for mounting, resizing, and so on, from within the instance. If not specified, the server chooses a default device name to apply to this disk, in the form persistent-disks-x, where x is a number assigned by Google Compute Engine.
        :param mode: The mode in which to attach this disk, either READ_WRITE or READ_ONLY. If not specified, the default is to attach the disk in READ_WRITE mode.
        :param project: The project that the referenced compute instance is a part of. If instance is referenced by its self_link the project defined in the link will take precedence.
        :param timeouts: timeouts block.
        :param zone: The zone that the referenced compute instance is located within. If instance is referenced by its self_link the zone defined in the link will take precedence.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeAttachedDiskTimeouts(**timeouts)
        self._values = {
            'disk': disk,
            'instance': instance,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if device_name is not None: self._values["device_name"] = device_name
        if mode is not None: self._values["mode"] = mode
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def disk(self) -> str:
        """name or self_link of the disk that will be attached."""
        return self._values.get('disk')

    @builtins.property
    def instance(self) -> str:
        """name or self_link of the compute instance that the disk will be attached to.

        If the self_link is provided then zone and project are extracted from the self link. If only the name is used then zone and project must be defined as properties on the resource or provider.
        """
        return self._values.get('instance')

    @builtins.property
    def device_name(self) -> typing.Optional[str]:
        """Specifies a unique device name of your choice that is reflected into the /dev/disk/by-id/google-* tree of a Linux operating system running within the instance.

        This name can be used to reference the device for mounting, resizing, and so on, from within the instance. If not specified, the server chooses a default device name to apply to this disk, in the form persistent-disks-x, where x is a number assigned by Google Compute Engine.
        """
        return self._values.get('device_name')

    @builtins.property
    def mode(self) -> typing.Optional[str]:
        """The mode in which to attach this disk, either READ_WRITE or READ_ONLY.

        If not specified, the default is to attach the disk in READ_WRITE mode.
        """
        return self._values.get('mode')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The project that the referenced compute instance is a part of.

        If instance is referenced by its self_link the project defined in the link will take precedence.
        """
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeAttachedDiskTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The zone that the referenced compute instance is located within.

        If instance is referenced by its self_link the zone defined in the link will take precedence.
        """
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeAttachedDiskConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeAttachedDiskTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeAttachedDiskTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeAttachedDiskTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeAutoscaler(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeAutoscaler"):
    def __init__(self, scope: constructs.Construct, id: str, *, autoscaling_policy: typing.List["ComputeAutoscalerAutoscalingPolicy"], name: str, target: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeAutoscalerTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param autoscaling_policy: autoscaling_policy block.
        :param name: Name of the resource. The name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param target: URL of the managed instance group that this autoscaler will scale.
        :param description: An optional description of this resource.
        :param project: 
        :param timeouts: timeouts block.
        :param zone: URL of the zone where the instance group resides.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeAutoscalerConfig(autoscaling_policy=autoscaling_policy, name=name, target=target, description=description, project=project, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeAutoscaler, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="autoscalingPolicy")
    def autoscaling_policy(self) -> typing.List["ComputeAutoscalerAutoscalingPolicy"]:
        return jsii.get(self, "autoscalingPolicy")

    @autoscaling_policy.setter
    def autoscaling_policy(self, value: typing.List["ComputeAutoscalerAutoscalingPolicy"]) -> None:
        jsii.set(self, "autoscalingPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="target")
    def target(self) -> str:
        return jsii.get(self, "target")

    @target.setter
    def target(self, value: str) -> None:
        jsii.set(self, "target", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeAutoscalerTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeAutoscalerTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeAutoscalerAutoscalingPolicy", jsii_struct_bases=[], name_mapping={'max_replicas': 'maxReplicas', 'min_replicas': 'minReplicas', 'cooldown_period': 'cooldownPeriod', 'cpu_utilization': 'cpuUtilization', 'load_balancing_utilization': 'loadBalancingUtilization', 'metric': 'metric', 'mode': 'mode'})
class ComputeAutoscalerAutoscalingPolicy():
    def __init__(self, *, max_replicas: jsii.Number, min_replicas: jsii.Number, cooldown_period: typing.Optional[jsii.Number]=None, cpu_utilization: typing.Optional[typing.List["ComputeAutoscalerAutoscalingPolicyCpuUtilization"]]=None, load_balancing_utilization: typing.Optional[typing.List["ComputeAutoscalerAutoscalingPolicyLoadBalancingUtilization"]]=None, metric: typing.Optional[typing.List["ComputeAutoscalerAutoscalingPolicyMetric"]]=None, mode: typing.Optional[str]=None) -> None:
        """
        :param max_replicas: The maximum number of instances that the autoscaler can scale up to. This is required when creating or updating an autoscaler. The maximum number of replicas should not be lower than minimal number of replicas.
        :param min_replicas: The minimum number of replicas that the autoscaler can scale down to. This cannot be less than 0. If not provided, autoscaler will choose a default value depending on maximum number of instances allowed.
        :param cooldown_period: The number of seconds that the autoscaler should wait before it starts collecting information from a new instance. This prevents the autoscaler from collecting information when the instance is initializing, during which the collected usage would not be reliable. The default time autoscaler waits is 60 seconds. Virtual machine initialization times might vary because of numerous factors. We recommend that you test how long an instance may take to initialize. To do this, create an instance and time the startup process.
        :param cpu_utilization: cpu_utilization block.
        :param load_balancing_utilization: load_balancing_utilization block.
        :param metric: metric block.
        :param mode: Defines operating mode for this policy. Default value: "ON" Possible values: ["OFF", "ONLY_UP", "ON"]
        """
        self._values = {
            'max_replicas': max_replicas,
            'min_replicas': min_replicas,
        }
        if cooldown_period is not None: self._values["cooldown_period"] = cooldown_period
        if cpu_utilization is not None: self._values["cpu_utilization"] = cpu_utilization
        if load_balancing_utilization is not None: self._values["load_balancing_utilization"] = load_balancing_utilization
        if metric is not None: self._values["metric"] = metric
        if mode is not None: self._values["mode"] = mode

    @builtins.property
    def max_replicas(self) -> jsii.Number:
        """The maximum number of instances that the autoscaler can scale up to.

        This is required when creating or updating an autoscaler. The
        maximum number of replicas should not be lower than minimal number
        of replicas.
        """
        return self._values.get('max_replicas')

    @builtins.property
    def min_replicas(self) -> jsii.Number:
        """The minimum number of replicas that the autoscaler can scale down to.

        This cannot be less than 0. If not provided, autoscaler will
        choose a default value depending on maximum number of instances
        allowed.
        """
        return self._values.get('min_replicas')

    @builtins.property
    def cooldown_period(self) -> typing.Optional[jsii.Number]:
        """The number of seconds that the autoscaler should wait before it starts collecting information from a new instance.

        This prevents
        the autoscaler from collecting information when the instance is
        initializing, during which the collected usage would not be
        reliable. The default time autoscaler waits is 60 seconds.

        Virtual machine initialization times might vary because of
        numerous factors. We recommend that you test how long an
        instance may take to initialize. To do this, create an instance
        and time the startup process.
        """
        return self._values.get('cooldown_period')

    @builtins.property
    def cpu_utilization(self) -> typing.Optional[typing.List["ComputeAutoscalerAutoscalingPolicyCpuUtilization"]]:
        """cpu_utilization block."""
        return self._values.get('cpu_utilization')

    @builtins.property
    def load_balancing_utilization(self) -> typing.Optional[typing.List["ComputeAutoscalerAutoscalingPolicyLoadBalancingUtilization"]]:
        """load_balancing_utilization block."""
        return self._values.get('load_balancing_utilization')

    @builtins.property
    def metric(self) -> typing.Optional[typing.List["ComputeAutoscalerAutoscalingPolicyMetric"]]:
        """metric block."""
        return self._values.get('metric')

    @builtins.property
    def mode(self) -> typing.Optional[str]:
        """Defines operating mode for this policy.

        Default value: "ON" Possible values: ["OFF", "ONLY_UP", "ON"]
        """
        return self._values.get('mode')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeAutoscalerAutoscalingPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeAutoscalerAutoscalingPolicyCpuUtilization", jsii_struct_bases=[], name_mapping={'target': 'target'})
class ComputeAutoscalerAutoscalingPolicyCpuUtilization():
    def __init__(self, *, target: jsii.Number) -> None:
        """
        :param target: The target CPU utilization that the autoscaler should maintain. Must be a float value in the range (0, 1]. If not specified, the default is 0.6. If the CPU level is below the target utilization, the autoscaler scales down the number of instances until it reaches the minimum number of instances you specified or until the average CPU of your instances reaches the target utilization. If the average CPU is above the target utilization, the autoscaler scales up until it reaches the maximum number of instances you specified or until the average utilization reaches the target utilization.
        """
        self._values = {
            'target': target,
        }

    @builtins.property
    def target(self) -> jsii.Number:
        """The target CPU utilization that the autoscaler should maintain.

        Must be a float value in the range (0, 1]. If not specified, the
        default is 0.6.

        If the CPU level is below the target utilization, the autoscaler
        scales down the number of instances until it reaches the minimum
        number of instances you specified or until the average CPU of
        your instances reaches the target utilization.

        If the average CPU is above the target utilization, the autoscaler
        scales up until it reaches the maximum number of instances you
        specified or until the average utilization reaches the target
        utilization.
        """
        return self._values.get('target')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeAutoscalerAutoscalingPolicyCpuUtilization(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeAutoscalerAutoscalingPolicyLoadBalancingUtilization", jsii_struct_bases=[], name_mapping={'target': 'target'})
class ComputeAutoscalerAutoscalingPolicyLoadBalancingUtilization():
    def __init__(self, *, target: jsii.Number) -> None:
        """
        :param target: Fraction of backend capacity utilization (set in HTTP(s) load balancing configuration) that autoscaler should maintain. Must be a positive float value. If not defined, the default is 0.8.
        """
        self._values = {
            'target': target,
        }

    @builtins.property
    def target(self) -> jsii.Number:
        """Fraction of backend capacity utilization (set in HTTP(s) load balancing configuration) that autoscaler should maintain.

        Must
        be a positive float value. If not defined, the default is 0.8.
        """
        return self._values.get('target')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeAutoscalerAutoscalingPolicyLoadBalancingUtilization(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeAutoscalerAutoscalingPolicyMetric", jsii_struct_bases=[], name_mapping={'name': 'name', 'target': 'target', 'type': 'type'})
class ComputeAutoscalerAutoscalingPolicyMetric():
    def __init__(self, *, name: str, target: typing.Optional[jsii.Number]=None, type: typing.Optional[str]=None) -> None:
        """
        :param name: The identifier (type) of the Stackdriver Monitoring metric. The metric cannot have negative values. The metric must have a value type of INT64 or DOUBLE.
        :param target: The target value of the metric that autoscaler should maintain. This must be a positive value. A utilization metric scales number of virtual machines handling requests to increase or decrease proportionally to the metric. For example, a good metric to use as a utilizationTarget is www.googleapis.com/compute/instance/network/received_bytes_count. The autoscaler will work to keep this value constant for each of the instances.
        :param type: Defines how target utilization value is expressed for a Stackdriver Monitoring metric. Possible values: ["GAUGE", "DELTA_PER_SECOND", "DELTA_PER_MINUTE"]
        """
        self._values = {
            'name': name,
        }
        if target is not None: self._values["target"] = target
        if type is not None: self._values["type"] = type

    @builtins.property
    def name(self) -> str:
        """The identifier (type) of the Stackdriver Monitoring metric. The metric cannot have negative values.

        The metric must have a value type of INT64 or DOUBLE.
        """
        return self._values.get('name')

    @builtins.property
    def target(self) -> typing.Optional[jsii.Number]:
        """The target value of the metric that autoscaler should maintain.

        This must be a positive value. A utilization
        metric scales number of virtual machines handling requests
        to increase or decrease proportionally to the metric.

        For example, a good metric to use as a utilizationTarget is
        www.googleapis.com/compute/instance/network/received_bytes_count.
        The autoscaler will work to keep this value constant for each
        of the instances.
        """
        return self._values.get('target')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        """Defines how target utilization value is expressed for a Stackdriver Monitoring metric.

        Possible values: ["GAUGE", "DELTA_PER_SECOND", "DELTA_PER_MINUTE"]
        """
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeAutoscalerAutoscalingPolicyMetric(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeAutoscalerConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'autoscaling_policy': 'autoscalingPolicy', 'name': 'name', 'target': 'target', 'description': 'description', 'project': 'project', 'timeouts': 'timeouts', 'zone': 'zone'})
class ComputeAutoscalerConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, autoscaling_policy: typing.List["ComputeAutoscalerAutoscalingPolicy"], name: str, target: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeAutoscalerTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param autoscaling_policy: autoscaling_policy block.
        :param name: Name of the resource. The name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param target: URL of the managed instance group that this autoscaler will scale.
        :param description: An optional description of this resource.
        :param project: 
        :param timeouts: timeouts block.
        :param zone: URL of the zone where the instance group resides.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeAutoscalerTimeouts(**timeouts)
        self._values = {
            'autoscaling_policy': autoscaling_policy,
            'name': name,
            'target': target,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def autoscaling_policy(self) -> typing.List["ComputeAutoscalerAutoscalingPolicy"]:
        """autoscaling_policy block."""
        return self._values.get('autoscaling_policy')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        The name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def target(self) -> str:
        """URL of the managed instance group that this autoscaler will scale."""
        return self._values.get('target')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeAutoscalerTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """URL of the zone where the instance group resides."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeAutoscalerConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeAutoscalerTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeAutoscalerTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeAutoscalerTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeBackendBucket(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeBackendBucket"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket_name: str, name: str, cdn_policy: typing.Optional[typing.List["ComputeBackendBucketCdnPolicy"]]=None, description: typing.Optional[str]=None, enable_cdn: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeBackendBucketTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket_name: Cloud Storage bucket name.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param cdn_policy: cdn_policy block.
        :param description: An optional textual description of the resource; provided by the client when the resource is created.
        :param enable_cdn: If true, enable Cloud CDN for this BackendBucket.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeBackendBucketConfig(bucket_name=bucket_name, name=name, cdn_policy=cdn_policy, description=description, enable_cdn=enable_cdn, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeBackendBucket, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="bucketName")
    def bucket_name(self) -> str:
        return jsii.get(self, "bucketName")

    @bucket_name.setter
    def bucket_name(self, value: str) -> None:
        jsii.set(self, "bucketName", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="cdnPolicy")
    def cdn_policy(self) -> typing.Optional[typing.List["ComputeBackendBucketCdnPolicy"]]:
        return jsii.get(self, "cdnPolicy")

    @cdn_policy.setter
    def cdn_policy(self, value: typing.Optional[typing.List["ComputeBackendBucketCdnPolicy"]]) -> None:
        jsii.set(self, "cdnPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="enableCdn")
    def enable_cdn(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableCdn")

    @enable_cdn.setter
    def enable_cdn(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableCdn", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeBackendBucketTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeBackendBucketTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendBucketCdnPolicy", jsii_struct_bases=[], name_mapping={'signed_url_cache_max_age_sec': 'signedUrlCacheMaxAgeSec'})
class ComputeBackendBucketCdnPolicy():
    def __init__(self, *, signed_url_cache_max_age_sec: jsii.Number) -> None:
        """
        :param signed_url_cache_max_age_sec: Maximum number of seconds the response to a signed URL request will be considered fresh. After this time period, the response will be revalidated before being served. When serving responses to signed URL requests, Cloud CDN will internally behave as though all responses from this backend had a "Cache-Control: public, max-age=[TTL]" header, regardless of any existing Cache-Control header. The actual headers served in responses will not be altered.
        """
        self._values = {
            'signed_url_cache_max_age_sec': signed_url_cache_max_age_sec,
        }

    @builtins.property
    def signed_url_cache_max_age_sec(self) -> jsii.Number:
        """Maximum number of seconds the response to a signed URL request will be considered fresh.

        After this time period,
        the response will be revalidated before being served.
        When serving responses to signed URL requests,
        Cloud CDN will internally behave as though
        all responses from this backend had a "Cache-Control: public,
        max-age=[TTL]" header, regardless of any existing Cache-Control
        header. The actual headers served in responses will not be altered.
        """
        return self._values.get('signed_url_cache_max_age_sec')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendBucketCdnPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendBucketConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket_name': 'bucketName', 'name': 'name', 'cdn_policy': 'cdnPolicy', 'description': 'description', 'enable_cdn': 'enableCdn', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeBackendBucketConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket_name: str, name: str, cdn_policy: typing.Optional[typing.List["ComputeBackendBucketCdnPolicy"]]=None, description: typing.Optional[str]=None, enable_cdn: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeBackendBucketTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket_name: Cloud Storage bucket name.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param cdn_policy: cdn_policy block.
        :param description: An optional textual description of the resource; provided by the client when the resource is created.
        :param enable_cdn: If true, enable Cloud CDN for this BackendBucket.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeBackendBucketTimeouts(**timeouts)
        self._values = {
            'bucket_name': bucket_name,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if cdn_policy is not None: self._values["cdn_policy"] = cdn_policy
        if description is not None: self._values["description"] = description
        if enable_cdn is not None: self._values["enable_cdn"] = enable_cdn
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket_name(self) -> str:
        """Cloud Storage bucket name."""
        return self._values.get('bucket_name')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035.  Specifically, the name must be 1-63 characters long and
        match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means
        the first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the
        last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def cdn_policy(self) -> typing.Optional[typing.List["ComputeBackendBucketCdnPolicy"]]:
        """cdn_policy block."""
        return self._values.get('cdn_policy')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional textual description of the resource;

        provided by the
        client when the resource is created.
        """
        return self._values.get('description')

    @builtins.property
    def enable_cdn(self) -> typing.Optional[bool]:
        """If true, enable Cloud CDN for this BackendBucket."""
        return self._values.get('enable_cdn')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeBackendBucketTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendBucketConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeBackendBucketSignedUrlKey(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeBackendBucketSignedUrlKey"):
    def __init__(self, scope: constructs.Construct, id: str, *, backend_bucket: str, key_value: str, name: str, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeBackendBucketSignedUrlKeyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param backend_bucket: The backend bucket this signed URL key belongs.
        :param key_value: 128-bit key value used for signing the URL. The key value must be a valid RFC 4648 Section 5 base64url encoded string.
        :param name: Name of the signed URL key.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeBackendBucketSignedUrlKeyConfig(backend_bucket=backend_bucket, key_value=key_value, name=name, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeBackendBucketSignedUrlKey, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="backendBucket")
    def backend_bucket(self) -> str:
        return jsii.get(self, "backendBucket")

    @backend_bucket.setter
    def backend_bucket(self, value: str) -> None:
        jsii.set(self, "backendBucket", value)

    @builtins.property
    @jsii.member(jsii_name="keyValue")
    def key_value(self) -> str:
        return jsii.get(self, "keyValue")

    @key_value.setter
    def key_value(self, value: str) -> None:
        jsii.set(self, "keyValue", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeBackendBucketSignedUrlKeyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeBackendBucketSignedUrlKeyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendBucketSignedUrlKeyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'backend_bucket': 'backendBucket', 'key_value': 'keyValue', 'name': 'name', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeBackendBucketSignedUrlKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, backend_bucket: str, key_value: str, name: str, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeBackendBucketSignedUrlKeyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backend_bucket: The backend bucket this signed URL key belongs.
        :param key_value: 128-bit key value used for signing the URL. The key value must be a valid RFC 4648 Section 5 base64url encoded string.
        :param name: Name of the signed URL key.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeBackendBucketSignedUrlKeyTimeouts(**timeouts)
        self._values = {
            'backend_bucket': backend_bucket,
            'key_value': key_value,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def backend_bucket(self) -> str:
        """The backend bucket this signed URL key belongs."""
        return self._values.get('backend_bucket')

    @builtins.property
    def key_value(self) -> str:
        """128-bit key value used for signing the URL.

        The key value must be a
        valid RFC 4648 Section 5 base64url encoded string.
        """
        return self._values.get('key_value')

    @builtins.property
    def name(self) -> str:
        """Name of the signed URL key."""
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeBackendBucketSignedUrlKeyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendBucketSignedUrlKeyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendBucketSignedUrlKeyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeBackendBucketSignedUrlKeyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendBucketSignedUrlKeyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendBucketTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeBackendBucketTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendBucketTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeBackendService(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeBackendService"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, affinity_cookie_ttl_sec: typing.Optional[jsii.Number]=None, backend: typing.Optional[typing.List["ComputeBackendServiceBackend"]]=None, cdn_policy: typing.Optional[typing.List["ComputeBackendServiceCdnPolicy"]]=None, circuit_breakers: typing.Optional[typing.List["ComputeBackendServiceCircuitBreakers"]]=None, connection_draining_timeout_sec: typing.Optional[jsii.Number]=None, consistent_hash: typing.Optional[typing.List["ComputeBackendServiceConsistentHash"]]=None, custom_request_headers: typing.Optional[typing.List[str]]=None, description: typing.Optional[str]=None, enable_cdn: typing.Optional[bool]=None, health_checks: typing.Optional[typing.List[str]]=None, iap: typing.Optional[typing.List["ComputeBackendServiceIap"]]=None, load_balancing_scheme: typing.Optional[str]=None, locality_lb_policy: typing.Optional[str]=None, log_config: typing.Optional[typing.List["ComputeBackendServiceLogConfig"]]=None, outlier_detection: typing.Optional[typing.List["ComputeBackendServiceOutlierDetection"]]=None, port_name: typing.Optional[str]=None, project: typing.Optional[str]=None, protocol: typing.Optional[str]=None, security_policy: typing.Optional[str]=None, session_affinity: typing.Optional[str]=None, timeouts: typing.Optional["ComputeBackendServiceTimeouts"]=None, timeout_sec: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param affinity_cookie_ttl_sec: Lifetime of cookies in seconds if session_affinity is GENERATED_COOKIE. If set to 0, the cookie is non-persistent and lasts only until the end of the browser session (or equivalent). The maximum allowed value for TTL is one day. When the load balancing scheme is INTERNAL, this field is not used.
        :param backend: backend block.
        :param cdn_policy: cdn_policy block.
        :param circuit_breakers: circuit_breakers block.
        :param connection_draining_timeout_sec: Time for which instance will be drained (not accept new connections, but still work to finish started).
        :param consistent_hash: consistent_hash block.
        :param custom_request_headers: Headers that the HTTP/S load balancer should add to proxied requests.
        :param description: An optional description of this resource.
        :param enable_cdn: If true, enable Cloud CDN for this BackendService.
        :param health_checks: The set of URLs to the HttpHealthCheck or HttpsHealthCheck resource for health checking this BackendService. Currently at most one health check can be specified. A health check must be specified unless the backend service uses an internet NEG as a backend. For internal load balancing, a URL to a HealthCheck resource must be specified instead.
        :param iap: iap block.
        :param load_balancing_scheme: Indicates whether the backend service will be used with internal or external load balancing. A backend service created for one type of load balancing cannot be used with the other. Default value: "EXTERNAL" Possible values: ["EXTERNAL", "INTERNAL_SELF_MANAGED"]
        :param locality_lb_policy: The load balancing algorithm used within the scope of the locality. The possible values are -. ROUND_ROBIN - This is a simple policy in which each healthy backend is selected in round robin order. LEAST_REQUEST - An O(1) algorithm which selects two random healthy hosts and picks the host which has fewer active requests. RING_HASH - The ring/modulo hash load balancer implements consistent hashing to backends. The algorithm has the property that the addition/removal of a host from a set of N hosts only affects 1/N of the requests. RANDOM - The load balancer selects a random healthy host. ORIGINAL_DESTINATION - Backend host is selected based on the client connection metadata, i.e., connections are opened to the same address as the destination address of the incoming connection before the connection was redirected to the load balancer. MAGLEV - used as a drop in replacement for the ring hash load balancer. Maglev is not as stable as ring hash but has faster table lookup build times and host selection times. For more information about Maglev, refer to https://ai.google/research/pubs/pub44824 This field is applicable only when the load_balancing_scheme is set to INTERNAL_SELF_MANAGED. Possible values: ["ROUND_ROBIN", "LEAST_REQUEST", "RING_HASH", "RANDOM", "ORIGINAL_DESTINATION", "MAGLEV"]
        :param log_config: log_config block.
        :param outlier_detection: outlier_detection block.
        :param port_name: Name of backend port. The same name should appear in the instance groups referenced by this service. Required when the load balancing scheme is EXTERNAL.
        :param project: 
        :param protocol: The protocol this BackendService uses to communicate with backends. The default is HTTP. **NOTE**: HTTP2 is only valid for beta HTTP/2 load balancer types and may result in errors if used with the GA API. Possible values: ["HTTP", "HTTPS", "HTTP2", "TCP", "SSL"]
        :param security_policy: The security policy associated with this backend service.
        :param session_affinity: Type of session affinity to use. The default is NONE. Session affinity is not applicable if the protocol is UDP. Possible values: ["NONE", "CLIENT_IP", "CLIENT_IP_PORT_PROTO", "CLIENT_IP_PROTO", "GENERATED_COOKIE", "HEADER_FIELD", "HTTP_COOKIE"]
        :param timeouts: timeouts block.
        :param timeout_sec: How many seconds to wait for the backend before considering it a failed request. Default is 30 seconds. Valid range is [1, 86400].
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeBackendServiceConfig(name=name, affinity_cookie_ttl_sec=affinity_cookie_ttl_sec, backend=backend, cdn_policy=cdn_policy, circuit_breakers=circuit_breakers, connection_draining_timeout_sec=connection_draining_timeout_sec, consistent_hash=consistent_hash, custom_request_headers=custom_request_headers, description=description, enable_cdn=enable_cdn, health_checks=health_checks, iap=iap, load_balancing_scheme=load_balancing_scheme, locality_lb_policy=locality_lb_policy, log_config=log_config, outlier_detection=outlier_detection, port_name=port_name, project=project, protocol=protocol, security_policy=security_policy, session_affinity=session_affinity, timeouts=timeouts, timeout_sec=timeout_sec, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeBackendService, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="fingerprint")
    def fingerprint(self) -> str:
        return jsii.get(self, "fingerprint")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="affinityCookieTtlSec")
    def affinity_cookie_ttl_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "affinityCookieTtlSec")

    @affinity_cookie_ttl_sec.setter
    def affinity_cookie_ttl_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "affinityCookieTtlSec", value)

    @builtins.property
    @jsii.member(jsii_name="backend")
    def backend(self) -> typing.Optional[typing.List["ComputeBackendServiceBackend"]]:
        return jsii.get(self, "backend")

    @backend.setter
    def backend(self, value: typing.Optional[typing.List["ComputeBackendServiceBackend"]]) -> None:
        jsii.set(self, "backend", value)

    @builtins.property
    @jsii.member(jsii_name="cdnPolicy")
    def cdn_policy(self) -> typing.Optional[typing.List["ComputeBackendServiceCdnPolicy"]]:
        return jsii.get(self, "cdnPolicy")

    @cdn_policy.setter
    def cdn_policy(self, value: typing.Optional[typing.List["ComputeBackendServiceCdnPolicy"]]) -> None:
        jsii.set(self, "cdnPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="circuitBreakers")
    def circuit_breakers(self) -> typing.Optional[typing.List["ComputeBackendServiceCircuitBreakers"]]:
        return jsii.get(self, "circuitBreakers")

    @circuit_breakers.setter
    def circuit_breakers(self, value: typing.Optional[typing.List["ComputeBackendServiceCircuitBreakers"]]) -> None:
        jsii.set(self, "circuitBreakers", value)

    @builtins.property
    @jsii.member(jsii_name="connectionDrainingTimeoutSec")
    def connection_draining_timeout_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "connectionDrainingTimeoutSec")

    @connection_draining_timeout_sec.setter
    def connection_draining_timeout_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "connectionDrainingTimeoutSec", value)

    @builtins.property
    @jsii.member(jsii_name="consistentHash")
    def consistent_hash(self) -> typing.Optional[typing.List["ComputeBackendServiceConsistentHash"]]:
        return jsii.get(self, "consistentHash")

    @consistent_hash.setter
    def consistent_hash(self, value: typing.Optional[typing.List["ComputeBackendServiceConsistentHash"]]) -> None:
        jsii.set(self, "consistentHash", value)

    @builtins.property
    @jsii.member(jsii_name="customRequestHeaders")
    def custom_request_headers(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "customRequestHeaders")

    @custom_request_headers.setter
    def custom_request_headers(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "customRequestHeaders", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="enableCdn")
    def enable_cdn(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableCdn")

    @enable_cdn.setter
    def enable_cdn(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableCdn", value)

    @builtins.property
    @jsii.member(jsii_name="healthChecks")
    def health_checks(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "healthChecks")

    @health_checks.setter
    def health_checks(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "healthChecks", value)

    @builtins.property
    @jsii.member(jsii_name="iap")
    def iap(self) -> typing.Optional[typing.List["ComputeBackendServiceIap"]]:
        return jsii.get(self, "iap")

    @iap.setter
    def iap(self, value: typing.Optional[typing.List["ComputeBackendServiceIap"]]) -> None:
        jsii.set(self, "iap", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="loadBalancingScheme")
    def load_balancing_scheme(self) -> typing.Optional[str]:
        return jsii.get(self, "loadBalancingScheme")

    @load_balancing_scheme.setter
    def load_balancing_scheme(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "loadBalancingScheme", value)

    @builtins.property
    @jsii.member(jsii_name="localityLbPolicy")
    def locality_lb_policy(self) -> typing.Optional[str]:
        return jsii.get(self, "localityLbPolicy")

    @locality_lb_policy.setter
    def locality_lb_policy(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "localityLbPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="logConfig")
    def log_config(self) -> typing.Optional[typing.List["ComputeBackendServiceLogConfig"]]:
        return jsii.get(self, "logConfig")

    @log_config.setter
    def log_config(self, value: typing.Optional[typing.List["ComputeBackendServiceLogConfig"]]) -> None:
        jsii.set(self, "logConfig", value)

    @builtins.property
    @jsii.member(jsii_name="outlierDetection")
    def outlier_detection(self) -> typing.Optional[typing.List["ComputeBackendServiceOutlierDetection"]]:
        return jsii.get(self, "outlierDetection")

    @outlier_detection.setter
    def outlier_detection(self, value: typing.Optional[typing.List["ComputeBackendServiceOutlierDetection"]]) -> None:
        jsii.set(self, "outlierDetection", value)

    @builtins.property
    @jsii.member(jsii_name="portName")
    def port_name(self) -> typing.Optional[str]:
        return jsii.get(self, "portName")

    @port_name.setter
    def port_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "portName", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> typing.Optional[str]:
        return jsii.get(self, "protocol")

    @protocol.setter
    def protocol(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "protocol", value)

    @builtins.property
    @jsii.member(jsii_name="securityPolicy")
    def security_policy(self) -> typing.Optional[str]:
        return jsii.get(self, "securityPolicy")

    @security_policy.setter
    def security_policy(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "securityPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="sessionAffinity")
    def session_affinity(self) -> typing.Optional[str]:
        return jsii.get(self, "sessionAffinity")

    @session_affinity.setter
    def session_affinity(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sessionAffinity", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeBackendServiceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeBackendServiceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="timeoutSec")
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "timeoutSec")

    @timeout_sec.setter
    def timeout_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "timeoutSec", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceBackend", jsii_struct_bases=[], name_mapping={'group': 'group', 'balancing_mode': 'balancingMode', 'capacity_scaler': 'capacityScaler', 'description': 'description', 'max_connections': 'maxConnections', 'max_connections_per_endpoint': 'maxConnectionsPerEndpoint', 'max_connections_per_instance': 'maxConnectionsPerInstance', 'max_rate': 'maxRate', 'max_rate_per_endpoint': 'maxRatePerEndpoint', 'max_rate_per_instance': 'maxRatePerInstance', 'max_utilization': 'maxUtilization'})
class ComputeBackendServiceBackend():
    def __init__(self, *, group: str, balancing_mode: typing.Optional[str]=None, capacity_scaler: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, max_connections: typing.Optional[jsii.Number]=None, max_connections_per_endpoint: typing.Optional[jsii.Number]=None, max_connections_per_instance: typing.Optional[jsii.Number]=None, max_rate: typing.Optional[jsii.Number]=None, max_rate_per_endpoint: typing.Optional[jsii.Number]=None, max_rate_per_instance: typing.Optional[jsii.Number]=None, max_utilization: typing.Optional[jsii.Number]=None) -> None:
        """
        :param group: The fully-qualified URL of an Instance Group or Network Endpoint Group resource. In case of instance group this defines the list of instances that serve traffic. Member virtual machine instances from each instance group must live in the same zone as the instance group itself. No two backends in a backend service are allowed to use same Instance Group resource. For Network Endpoint Groups this defines list of endpoints. All endpoints of Network Endpoint Group must be hosted on instances located in the same zone as the Network Endpoint Group. Backend services cannot mix Instance Group and Network Endpoint Group backends. Note that you must specify an Instance Group or Network Endpoint Group resource using the fully-qualified URL, rather than a partial URL.
        :param balancing_mode: Specifies the balancing mode for this backend. For global HTTP(S) or TCP/SSL load balancing, the default is UTILIZATION. Valid values are UTILIZATION, RATE (for HTTP(S)) and CONNECTION (for TCP/SSL). Default value: "UTILIZATION" Possible values: ["UTILIZATION", "RATE", "CONNECTION"]
        :param capacity_scaler: A multiplier applied to the group's maximum servicing capacity (based on UTILIZATION, RATE or CONNECTION). Default value is 1, which means the group will serve up to 100% of its configured capacity (depending on balancingMode). A setting of 0 means the group is completely drained, offering 0% of its available Capacity. Valid range is [0.0,1.0].
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param max_connections: The max number of simultaneous connections for the group. Can be used with either CONNECTION or UTILIZATION balancing modes. For CONNECTION mode, either maxConnections or one of maxConnectionsPerInstance or maxConnectionsPerEndpoint, as appropriate for group type, must be set.
        :param max_connections_per_endpoint: The max number of simultaneous connections that a single backend network endpoint can handle. This is used to calculate the capacity of the group. Can be used in either CONNECTION or UTILIZATION balancing modes. For CONNECTION mode, either maxConnections or maxConnectionsPerEndpoint must be set.
        :param max_connections_per_instance: The max number of simultaneous connections that a single backend instance can handle. This is used to calculate the capacity of the group. Can be used in either CONNECTION or UTILIZATION balancing modes. For CONNECTION mode, either maxConnections or maxConnectionsPerInstance must be set.
        :param max_rate: The max requests per second (RPS) of the group. Can be used with either RATE or UTILIZATION balancing modes, but required if RATE mode. For RATE mode, either maxRate or one of maxRatePerInstance or maxRatePerEndpoint, as appropriate for group type, must be set.
        :param max_rate_per_endpoint: The max requests per second (RPS) that a single backend network endpoint can handle. This is used to calculate the capacity of the group. Can be used in either balancing mode. For RATE mode, either maxRate or maxRatePerEndpoint must be set.
        :param max_rate_per_instance: The max requests per second (RPS) that a single backend instance can handle. This is used to calculate the capacity of the group. Can be used in either balancing mode. For RATE mode, either maxRate or maxRatePerInstance must be set.
        :param max_utilization: Used when balancingMode is UTILIZATION. This ratio defines the CPU utilization target for the group. The default is 0.8. Valid range is [0.0, 1.0].
        """
        self._values = {
            'group': group,
        }
        if balancing_mode is not None: self._values["balancing_mode"] = balancing_mode
        if capacity_scaler is not None: self._values["capacity_scaler"] = capacity_scaler
        if description is not None: self._values["description"] = description
        if max_connections is not None: self._values["max_connections"] = max_connections
        if max_connections_per_endpoint is not None: self._values["max_connections_per_endpoint"] = max_connections_per_endpoint
        if max_connections_per_instance is not None: self._values["max_connections_per_instance"] = max_connections_per_instance
        if max_rate is not None: self._values["max_rate"] = max_rate
        if max_rate_per_endpoint is not None: self._values["max_rate_per_endpoint"] = max_rate_per_endpoint
        if max_rate_per_instance is not None: self._values["max_rate_per_instance"] = max_rate_per_instance
        if max_utilization is not None: self._values["max_utilization"] = max_utilization

    @builtins.property
    def group(self) -> str:
        """The fully-qualified URL of an Instance Group or Network Endpoint Group resource.

        In case of instance group this defines the list
        of instances that serve traffic. Member virtual machine
        instances from each instance group must live in the same zone as
        the instance group itself. No two backends in a backend service
        are allowed to use same Instance Group resource.

        For Network Endpoint Groups this defines list of endpoints. All
        endpoints of Network Endpoint Group must be hosted on instances
        located in the same zone as the Network Endpoint Group.

        Backend services cannot mix Instance Group and
        Network Endpoint Group backends.

        Note that you must specify an Instance Group or Network Endpoint
        Group resource using the fully-qualified URL, rather than a
        partial URL.
        """
        return self._values.get('group')

    @builtins.property
    def balancing_mode(self) -> typing.Optional[str]:
        """Specifies the balancing mode for this backend.

        For global HTTP(S) or TCP/SSL load balancing, the default is
        UTILIZATION. Valid values are UTILIZATION, RATE (for HTTP(S))
        and CONNECTION (for TCP/SSL). Default value: "UTILIZATION" Possible values: ["UTILIZATION", "RATE", "CONNECTION"]
        """
        return self._values.get('balancing_mode')

    @builtins.property
    def capacity_scaler(self) -> typing.Optional[jsii.Number]:
        """A multiplier applied to the group's maximum servicing capacity (based on UTILIZATION, RATE or CONNECTION).

        Default value is 1, which means the group will serve up to 100%
        of its configured capacity (depending on balancingMode). A
        setting of 0 means the group is completely drained, offering
        0% of its available Capacity. Valid range is [0.0,1.0].
        """
        return self._values.get('capacity_scaler')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def max_connections(self) -> typing.Optional[jsii.Number]:
        """The max number of simultaneous connections for the group. Can be used with either CONNECTION or UTILIZATION balancing modes.

        For CONNECTION mode, either maxConnections or one
        of maxConnectionsPerInstance or maxConnectionsPerEndpoint,
        as appropriate for group type, must be set.
        """
        return self._values.get('max_connections')

    @builtins.property
    def max_connections_per_endpoint(self) -> typing.Optional[jsii.Number]:
        """The max number of simultaneous connections that a single backend network endpoint can handle.

        This is used to calculate the
        capacity of the group. Can be used in either CONNECTION or
        UTILIZATION balancing modes.

        For CONNECTION mode, either
        maxConnections or maxConnectionsPerEndpoint must be set.
        """
        return self._values.get('max_connections_per_endpoint')

    @builtins.property
    def max_connections_per_instance(self) -> typing.Optional[jsii.Number]:
        """The max number of simultaneous connections that a single backend instance can handle.

        This is used to calculate the
        capacity of the group. Can be used in either CONNECTION or
        UTILIZATION balancing modes.

        For CONNECTION mode, either maxConnections or
        maxConnectionsPerInstance must be set.
        """
        return self._values.get('max_connections_per_instance')

    @builtins.property
    def max_rate(self) -> typing.Optional[jsii.Number]:
        """The max requests per second (RPS) of the group.

        Can be used with either RATE or UTILIZATION balancing modes,
        but required if RATE mode. For RATE mode, either maxRate or one
        of maxRatePerInstance or maxRatePerEndpoint, as appropriate for
        group type, must be set.
        """
        return self._values.get('max_rate')

    @builtins.property
    def max_rate_per_endpoint(self) -> typing.Optional[jsii.Number]:
        """The max requests per second (RPS) that a single backend network endpoint can handle.

        This is used to calculate the capacity of
        the group. Can be used in either balancing mode. For RATE mode,
        either maxRate or maxRatePerEndpoint must be set.
        """
        return self._values.get('max_rate_per_endpoint')

    @builtins.property
    def max_rate_per_instance(self) -> typing.Optional[jsii.Number]:
        """The max requests per second (RPS) that a single backend instance can handle.

        This is used to calculate the capacity of
        the group. Can be used in either balancing mode. For RATE mode,
        either maxRate or maxRatePerInstance must be set.
        """
        return self._values.get('max_rate_per_instance')

    @builtins.property
    def max_utilization(self) -> typing.Optional[jsii.Number]:
        """Used when balancingMode is UTILIZATION.

        This ratio defines the
        CPU utilization target for the group. The default is 0.8. Valid
        range is [0.0, 1.0].
        """
        return self._values.get('max_utilization')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceBackend(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceCdnPolicy", jsii_struct_bases=[], name_mapping={'cache_key_policy': 'cacheKeyPolicy', 'signed_url_cache_max_age_sec': 'signedUrlCacheMaxAgeSec'})
class ComputeBackendServiceCdnPolicy():
    def __init__(self, *, cache_key_policy: typing.Optional[typing.List["ComputeBackendServiceCdnPolicyCacheKeyPolicy"]]=None, signed_url_cache_max_age_sec: typing.Optional[jsii.Number]=None) -> None:
        """
        :param cache_key_policy: cache_key_policy block.
        :param signed_url_cache_max_age_sec: Maximum number of seconds the response to a signed URL request will be considered fresh, defaults to 1hr (3600s). After this time period, the response will be revalidated before being served. When serving responses to signed URL requests, Cloud CDN will internally behave as though all responses from this backend had a "Cache-Control: public, max-age=[TTL]" header, regardless of any existing Cache-Control header. The actual headers served in responses will not be altered.
        """
        self._values = {
        }
        if cache_key_policy is not None: self._values["cache_key_policy"] = cache_key_policy
        if signed_url_cache_max_age_sec is not None: self._values["signed_url_cache_max_age_sec"] = signed_url_cache_max_age_sec

    @builtins.property
    def cache_key_policy(self) -> typing.Optional[typing.List["ComputeBackendServiceCdnPolicyCacheKeyPolicy"]]:
        """cache_key_policy block."""
        return self._values.get('cache_key_policy')

    @builtins.property
    def signed_url_cache_max_age_sec(self) -> typing.Optional[jsii.Number]:
        """Maximum number of seconds the response to a signed URL request will be considered fresh, defaults to 1hr (3600s).

        After this
        time period, the response will be revalidated before
        being served.

        When serving responses to signed URL requests, Cloud CDN will
        internally behave as though all responses from this backend had a
        "Cache-Control: public, max-age=[TTL]" header, regardless of any
        existing Cache-Control header. The actual headers served in
        responses will not be altered.
        """
        return self._values.get('signed_url_cache_max_age_sec')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceCdnPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceCdnPolicyCacheKeyPolicy", jsii_struct_bases=[], name_mapping={'include_host': 'includeHost', 'include_protocol': 'includeProtocol', 'include_query_string': 'includeQueryString', 'query_string_blacklist': 'queryStringBlacklist', 'query_string_whitelist': 'queryStringWhitelist'})
class ComputeBackendServiceCdnPolicyCacheKeyPolicy():
    def __init__(self, *, include_host: typing.Optional[bool]=None, include_protocol: typing.Optional[bool]=None, include_query_string: typing.Optional[bool]=None, query_string_blacklist: typing.Optional[typing.List[str]]=None, query_string_whitelist: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param include_host: If true requests to different hosts will be cached separately.
        :param include_protocol: If true, http and https requests will be cached separately.
        :param include_query_string: If true, include query string parameters in the cache key according to query_string_whitelist and query_string_blacklist. If neither is set, the entire query string will be included. If false, the query string will be excluded from the cache key entirely.
        :param query_string_blacklist: Names of query string parameters to exclude in cache keys. All other parameters will be included. Either specify query_string_whitelist or query_string_blacklist, not both. '&' and '=' will be percent encoded and not treated as delimiters.
        :param query_string_whitelist: Names of query string parameters to include in cache keys. All other parameters will be excluded. Either specify query_string_whitelist or query_string_blacklist, not both. '&' and '=' will be percent encoded and not treated as delimiters.
        """
        self._values = {
        }
        if include_host is not None: self._values["include_host"] = include_host
        if include_protocol is not None: self._values["include_protocol"] = include_protocol
        if include_query_string is not None: self._values["include_query_string"] = include_query_string
        if query_string_blacklist is not None: self._values["query_string_blacklist"] = query_string_blacklist
        if query_string_whitelist is not None: self._values["query_string_whitelist"] = query_string_whitelist

    @builtins.property
    def include_host(self) -> typing.Optional[bool]:
        """If true requests to different hosts will be cached separately."""
        return self._values.get('include_host')

    @builtins.property
    def include_protocol(self) -> typing.Optional[bool]:
        """If true, http and https requests will be cached separately."""
        return self._values.get('include_protocol')

    @builtins.property
    def include_query_string(self) -> typing.Optional[bool]:
        """If true, include query string parameters in the cache key according to query_string_whitelist and query_string_blacklist.

        If neither is set, the entire query
        string will be included.

        If false, the query string will be excluded from the cache
        key entirely.
        """
        return self._values.get('include_query_string')

    @builtins.property
    def query_string_blacklist(self) -> typing.Optional[typing.List[str]]:
        """Names of query string parameters to exclude in cache keys.

        All other parameters will be included. Either specify
        query_string_whitelist or query_string_blacklist, not both.
        '&' and '=' will be percent encoded and not treated as
        delimiters.
        """
        return self._values.get('query_string_blacklist')

    @builtins.property
    def query_string_whitelist(self) -> typing.Optional[typing.List[str]]:
        """Names of query string parameters to include in cache keys.

        All other parameters will be excluded. Either specify
        query_string_whitelist or query_string_blacklist, not both.
        '&' and '=' will be percent encoded and not treated as
        delimiters.
        """
        return self._values.get('query_string_whitelist')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceCdnPolicyCacheKeyPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceCircuitBreakers", jsii_struct_bases=[], name_mapping={'max_connections': 'maxConnections', 'max_pending_requests': 'maxPendingRequests', 'max_requests': 'maxRequests', 'max_requests_per_connection': 'maxRequestsPerConnection', 'max_retries': 'maxRetries'})
class ComputeBackendServiceCircuitBreakers():
    def __init__(self, *, max_connections: typing.Optional[jsii.Number]=None, max_pending_requests: typing.Optional[jsii.Number]=None, max_requests: typing.Optional[jsii.Number]=None, max_requests_per_connection: typing.Optional[jsii.Number]=None, max_retries: typing.Optional[jsii.Number]=None) -> None:
        """
        :param max_connections: The maximum number of connections to the backend cluster. Defaults to 1024.
        :param max_pending_requests: The maximum number of pending requests to the backend cluster. Defaults to 1024.
        :param max_requests: The maximum number of parallel requests to the backend cluster. Defaults to 1024.
        :param max_requests_per_connection: Maximum requests for a single backend connection. This parameter is respected by both the HTTP/1.1 and HTTP/2 implementations. If not specified, there is no limit. Setting this parameter to 1 will effectively disable keep alive.
        :param max_retries: The maximum number of parallel retries to the backend cluster. Defaults to 3.
        """
        self._values = {
        }
        if max_connections is not None: self._values["max_connections"] = max_connections
        if max_pending_requests is not None: self._values["max_pending_requests"] = max_pending_requests
        if max_requests is not None: self._values["max_requests"] = max_requests
        if max_requests_per_connection is not None: self._values["max_requests_per_connection"] = max_requests_per_connection
        if max_retries is not None: self._values["max_retries"] = max_retries

    @builtins.property
    def max_connections(self) -> typing.Optional[jsii.Number]:
        """The maximum number of connections to the backend cluster.

        Defaults to 1024.
        """
        return self._values.get('max_connections')

    @builtins.property
    def max_pending_requests(self) -> typing.Optional[jsii.Number]:
        """The maximum number of pending requests to the backend cluster.

        Defaults to 1024.
        """
        return self._values.get('max_pending_requests')

    @builtins.property
    def max_requests(self) -> typing.Optional[jsii.Number]:
        """The maximum number of parallel requests to the backend cluster.

        Defaults to 1024.
        """
        return self._values.get('max_requests')

    @builtins.property
    def max_requests_per_connection(self) -> typing.Optional[jsii.Number]:
        """Maximum requests for a single backend connection.

        This parameter
        is respected by both the HTTP/1.1 and HTTP/2 implementations. If
        not specified, there is no limit. Setting this parameter to 1
        will effectively disable keep alive.
        """
        return self._values.get('max_requests_per_connection')

    @builtins.property
    def max_retries(self) -> typing.Optional[jsii.Number]:
        """The maximum number of parallel retries to the backend cluster.

        Defaults to 3.
        """
        return self._values.get('max_retries')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceCircuitBreakers(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'affinity_cookie_ttl_sec': 'affinityCookieTtlSec', 'backend': 'backend', 'cdn_policy': 'cdnPolicy', 'circuit_breakers': 'circuitBreakers', 'connection_draining_timeout_sec': 'connectionDrainingTimeoutSec', 'consistent_hash': 'consistentHash', 'custom_request_headers': 'customRequestHeaders', 'description': 'description', 'enable_cdn': 'enableCdn', 'health_checks': 'healthChecks', 'iap': 'iap', 'load_balancing_scheme': 'loadBalancingScheme', 'locality_lb_policy': 'localityLbPolicy', 'log_config': 'logConfig', 'outlier_detection': 'outlierDetection', 'port_name': 'portName', 'project': 'project', 'protocol': 'protocol', 'security_policy': 'securityPolicy', 'session_affinity': 'sessionAffinity', 'timeouts': 'timeouts', 'timeout_sec': 'timeoutSec'})
class ComputeBackendServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, affinity_cookie_ttl_sec: typing.Optional[jsii.Number]=None, backend: typing.Optional[typing.List["ComputeBackendServiceBackend"]]=None, cdn_policy: typing.Optional[typing.List["ComputeBackendServiceCdnPolicy"]]=None, circuit_breakers: typing.Optional[typing.List["ComputeBackendServiceCircuitBreakers"]]=None, connection_draining_timeout_sec: typing.Optional[jsii.Number]=None, consistent_hash: typing.Optional[typing.List["ComputeBackendServiceConsistentHash"]]=None, custom_request_headers: typing.Optional[typing.List[str]]=None, description: typing.Optional[str]=None, enable_cdn: typing.Optional[bool]=None, health_checks: typing.Optional[typing.List[str]]=None, iap: typing.Optional[typing.List["ComputeBackendServiceIap"]]=None, load_balancing_scheme: typing.Optional[str]=None, locality_lb_policy: typing.Optional[str]=None, log_config: typing.Optional[typing.List["ComputeBackendServiceLogConfig"]]=None, outlier_detection: typing.Optional[typing.List["ComputeBackendServiceOutlierDetection"]]=None, port_name: typing.Optional[str]=None, project: typing.Optional[str]=None, protocol: typing.Optional[str]=None, security_policy: typing.Optional[str]=None, session_affinity: typing.Optional[str]=None, timeouts: typing.Optional["ComputeBackendServiceTimeouts"]=None, timeout_sec: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param affinity_cookie_ttl_sec: Lifetime of cookies in seconds if session_affinity is GENERATED_COOKIE. If set to 0, the cookie is non-persistent and lasts only until the end of the browser session (or equivalent). The maximum allowed value for TTL is one day. When the load balancing scheme is INTERNAL, this field is not used.
        :param backend: backend block.
        :param cdn_policy: cdn_policy block.
        :param circuit_breakers: circuit_breakers block.
        :param connection_draining_timeout_sec: Time for which instance will be drained (not accept new connections, but still work to finish started).
        :param consistent_hash: consistent_hash block.
        :param custom_request_headers: Headers that the HTTP/S load balancer should add to proxied requests.
        :param description: An optional description of this resource.
        :param enable_cdn: If true, enable Cloud CDN for this BackendService.
        :param health_checks: The set of URLs to the HttpHealthCheck or HttpsHealthCheck resource for health checking this BackendService. Currently at most one health check can be specified. A health check must be specified unless the backend service uses an internet NEG as a backend. For internal load balancing, a URL to a HealthCheck resource must be specified instead.
        :param iap: iap block.
        :param load_balancing_scheme: Indicates whether the backend service will be used with internal or external load balancing. A backend service created for one type of load balancing cannot be used with the other. Default value: "EXTERNAL" Possible values: ["EXTERNAL", "INTERNAL_SELF_MANAGED"]
        :param locality_lb_policy: The load balancing algorithm used within the scope of the locality. The possible values are -. ROUND_ROBIN - This is a simple policy in which each healthy backend is selected in round robin order. LEAST_REQUEST - An O(1) algorithm which selects two random healthy hosts and picks the host which has fewer active requests. RING_HASH - The ring/modulo hash load balancer implements consistent hashing to backends. The algorithm has the property that the addition/removal of a host from a set of N hosts only affects 1/N of the requests. RANDOM - The load balancer selects a random healthy host. ORIGINAL_DESTINATION - Backend host is selected based on the client connection metadata, i.e., connections are opened to the same address as the destination address of the incoming connection before the connection was redirected to the load balancer. MAGLEV - used as a drop in replacement for the ring hash load balancer. Maglev is not as stable as ring hash but has faster table lookup build times and host selection times. For more information about Maglev, refer to https://ai.google/research/pubs/pub44824 This field is applicable only when the load_balancing_scheme is set to INTERNAL_SELF_MANAGED. Possible values: ["ROUND_ROBIN", "LEAST_REQUEST", "RING_HASH", "RANDOM", "ORIGINAL_DESTINATION", "MAGLEV"]
        :param log_config: log_config block.
        :param outlier_detection: outlier_detection block.
        :param port_name: Name of backend port. The same name should appear in the instance groups referenced by this service. Required when the load balancing scheme is EXTERNAL.
        :param project: 
        :param protocol: The protocol this BackendService uses to communicate with backends. The default is HTTP. **NOTE**: HTTP2 is only valid for beta HTTP/2 load balancer types and may result in errors if used with the GA API. Possible values: ["HTTP", "HTTPS", "HTTP2", "TCP", "SSL"]
        :param security_policy: The security policy associated with this backend service.
        :param session_affinity: Type of session affinity to use. The default is NONE. Session affinity is not applicable if the protocol is UDP. Possible values: ["NONE", "CLIENT_IP", "CLIENT_IP_PORT_PROTO", "CLIENT_IP_PROTO", "GENERATED_COOKIE", "HEADER_FIELD", "HTTP_COOKIE"]
        :param timeouts: timeouts block.
        :param timeout_sec: How many seconds to wait for the backend before considering it a failed request. Default is 30 seconds. Valid range is [1, 86400].
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeBackendServiceTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if affinity_cookie_ttl_sec is not None: self._values["affinity_cookie_ttl_sec"] = affinity_cookie_ttl_sec
        if backend is not None: self._values["backend"] = backend
        if cdn_policy is not None: self._values["cdn_policy"] = cdn_policy
        if circuit_breakers is not None: self._values["circuit_breakers"] = circuit_breakers
        if connection_draining_timeout_sec is not None: self._values["connection_draining_timeout_sec"] = connection_draining_timeout_sec
        if consistent_hash is not None: self._values["consistent_hash"] = consistent_hash
        if custom_request_headers is not None: self._values["custom_request_headers"] = custom_request_headers
        if description is not None: self._values["description"] = description
        if enable_cdn is not None: self._values["enable_cdn"] = enable_cdn
        if health_checks is not None: self._values["health_checks"] = health_checks
        if iap is not None: self._values["iap"] = iap
        if load_balancing_scheme is not None: self._values["load_balancing_scheme"] = load_balancing_scheme
        if locality_lb_policy is not None: self._values["locality_lb_policy"] = locality_lb_policy
        if log_config is not None: self._values["log_config"] = log_config
        if outlier_detection is not None: self._values["outlier_detection"] = outlier_detection
        if port_name is not None: self._values["port_name"] = port_name
        if project is not None: self._values["project"] = project
        if protocol is not None: self._values["protocol"] = protocol
        if security_policy is not None: self._values["security_policy"] = security_policy
        if session_affinity is not None: self._values["session_affinity"] = session_affinity
        if timeouts is not None: self._values["timeouts"] = timeouts
        if timeout_sec is not None: self._values["timeout_sec"] = timeout_sec

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def affinity_cookie_ttl_sec(self) -> typing.Optional[jsii.Number]:
        """Lifetime of cookies in seconds if session_affinity is GENERATED_COOKIE.

        If set to 0, the cookie is non-persistent and lasts
        only until the end of the browser session (or equivalent). The
        maximum allowed value for TTL is one day.

        When the load balancing scheme is INTERNAL, this field is not used.
        """
        return self._values.get('affinity_cookie_ttl_sec')

    @builtins.property
    def backend(self) -> typing.Optional[typing.List["ComputeBackendServiceBackend"]]:
        """backend block."""
        return self._values.get('backend')

    @builtins.property
    def cdn_policy(self) -> typing.Optional[typing.List["ComputeBackendServiceCdnPolicy"]]:
        """cdn_policy block."""
        return self._values.get('cdn_policy')

    @builtins.property
    def circuit_breakers(self) -> typing.Optional[typing.List["ComputeBackendServiceCircuitBreakers"]]:
        """circuit_breakers block."""
        return self._values.get('circuit_breakers')

    @builtins.property
    def connection_draining_timeout_sec(self) -> typing.Optional[jsii.Number]:
        """Time for which instance will be drained (not accept new connections, but still work to finish started)."""
        return self._values.get('connection_draining_timeout_sec')

    @builtins.property
    def consistent_hash(self) -> typing.Optional[typing.List["ComputeBackendServiceConsistentHash"]]:
        """consistent_hash block."""
        return self._values.get('consistent_hash')

    @builtins.property
    def custom_request_headers(self) -> typing.Optional[typing.List[str]]:
        """Headers that the HTTP/S load balancer should add to proxied requests."""
        return self._values.get('custom_request_headers')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def enable_cdn(self) -> typing.Optional[bool]:
        """If true, enable Cloud CDN for this BackendService."""
        return self._values.get('enable_cdn')

    @builtins.property
    def health_checks(self) -> typing.Optional[typing.List[str]]:
        """The set of URLs to the HttpHealthCheck or HttpsHealthCheck resource for health checking this BackendService.

        Currently at most one health
        check can be specified.

        A health check must be specified unless the backend service uses an internet NEG as a backend.

        For internal load balancing, a URL to a HealthCheck resource must be specified instead.
        """
        return self._values.get('health_checks')

    @builtins.property
    def iap(self) -> typing.Optional[typing.List["ComputeBackendServiceIap"]]:
        """iap block."""
        return self._values.get('iap')

    @builtins.property
    def load_balancing_scheme(self) -> typing.Optional[str]:
        """Indicates whether the backend service will be used with internal or external load balancing.

        A backend service created for one type of
        load balancing cannot be used with the other. Default value: "EXTERNAL" Possible values: ["EXTERNAL", "INTERNAL_SELF_MANAGED"]
        """
        return self._values.get('load_balancing_scheme')

    @builtins.property
    def locality_lb_policy(self) -> typing.Optional[str]:
        """The load balancing algorithm used within the scope of the locality. The possible values are -.

        ROUND_ROBIN - This is a simple policy in which each healthy backend
        is selected in round robin order.

        LEAST_REQUEST - An O(1) algorithm which selects two random healthy
        hosts and picks the host which has fewer active requests.

        RING_HASH - The ring/modulo hash load balancer implements consistent
        hashing to backends. The algorithm has the property that the
        addition/removal of a host from a set of N hosts only affects
        1/N of the requests.

        RANDOM - The load balancer selects a random healthy host.

        ORIGINAL_DESTINATION - Backend host is selected based on the client
        connection metadata, i.e., connections are opened
        to the same address as the destination address of
        the incoming connection before the connection
        was redirected to the load balancer.

        MAGLEV - used as a drop in replacement for the ring hash load balancer.
        Maglev is not as stable as ring hash but has faster table lookup
        build times and host selection times. For more information about
        Maglev, refer to https://ai.google/research/pubs/pub44824

        This field is applicable only when the load_balancing_scheme is set to
        INTERNAL_SELF_MANAGED. Possible values: ["ROUND_ROBIN", "LEAST_REQUEST", "RING_HASH", "RANDOM", "ORIGINAL_DESTINATION", "MAGLEV"]
        """
        return self._values.get('locality_lb_policy')

    @builtins.property
    def log_config(self) -> typing.Optional[typing.List["ComputeBackendServiceLogConfig"]]:
        """log_config block."""
        return self._values.get('log_config')

    @builtins.property
    def outlier_detection(self) -> typing.Optional[typing.List["ComputeBackendServiceOutlierDetection"]]:
        """outlier_detection block."""
        return self._values.get('outlier_detection')

    @builtins.property
    def port_name(self) -> typing.Optional[str]:
        """Name of backend port.

        The same name should appear in the instance
        groups referenced by this service. Required when the load balancing
        scheme is EXTERNAL.
        """
        return self._values.get('port_name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def protocol(self) -> typing.Optional[str]:
        """The protocol this BackendService uses to communicate with backends.

        The default is HTTP. **NOTE**: HTTP2 is only valid for beta HTTP/2 load balancer
        types and may result in errors if used with the GA API. Possible values: ["HTTP", "HTTPS", "HTTP2", "TCP", "SSL"]
        """
        return self._values.get('protocol')

    @builtins.property
    def security_policy(self) -> typing.Optional[str]:
        """The security policy associated with this backend service."""
        return self._values.get('security_policy')

    @builtins.property
    def session_affinity(self) -> typing.Optional[str]:
        """Type of session affinity to use.

        The default is NONE. Session affinity is
        not applicable if the protocol is UDP. Possible values: ["NONE", "CLIENT_IP", "CLIENT_IP_PORT_PROTO", "CLIENT_IP_PROTO", "GENERATED_COOKIE", "HEADER_FIELD", "HTTP_COOKIE"]
        """
        return self._values.get('session_affinity')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeBackendServiceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        """How many seconds to wait for the backend before considering it a failed request.

        Default is 30 seconds. Valid range is [1, 86400].
        """
        return self._values.get('timeout_sec')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceConsistentHash", jsii_struct_bases=[], name_mapping={'http_cookie': 'httpCookie', 'http_header_name': 'httpHeaderName', 'minimum_ring_size': 'minimumRingSize'})
class ComputeBackendServiceConsistentHash():
    def __init__(self, *, http_cookie: typing.Optional[typing.List["ComputeBackendServiceConsistentHashHttpCookie"]]=None, http_header_name: typing.Optional[str]=None, minimum_ring_size: typing.Optional[jsii.Number]=None) -> None:
        """
        :param http_cookie: http_cookie block.
        :param http_header_name: The hash based on the value of the specified header field. This field is applicable if the sessionAffinity is set to HEADER_FIELD.
        :param minimum_ring_size: The minimum number of virtual nodes to use for the hash ring. Larger ring sizes result in more granular load distributions. If the number of hosts in the load balancing pool is larger than the ring size, each host will be assigned a single virtual node. Defaults to 1024.
        """
        self._values = {
        }
        if http_cookie is not None: self._values["http_cookie"] = http_cookie
        if http_header_name is not None: self._values["http_header_name"] = http_header_name
        if minimum_ring_size is not None: self._values["minimum_ring_size"] = minimum_ring_size

    @builtins.property
    def http_cookie(self) -> typing.Optional[typing.List["ComputeBackendServiceConsistentHashHttpCookie"]]:
        """http_cookie block."""
        return self._values.get('http_cookie')

    @builtins.property
    def http_header_name(self) -> typing.Optional[str]:
        """The hash based on the value of the specified header field.

        This field is applicable if the sessionAffinity is set to HEADER_FIELD.
        """
        return self._values.get('http_header_name')

    @builtins.property
    def minimum_ring_size(self) -> typing.Optional[jsii.Number]:
        """The minimum number of virtual nodes to use for the hash ring.

        Larger ring sizes result in more granular load
        distributions. If the number of hosts in the load balancing pool
        is larger than the ring size, each host will be assigned a single
        virtual node.
        Defaults to 1024.
        """
        return self._values.get('minimum_ring_size')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceConsistentHash(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceConsistentHashHttpCookie", jsii_struct_bases=[], name_mapping={'name': 'name', 'path': 'path', 'ttl': 'ttl'})
class ComputeBackendServiceConsistentHashHttpCookie():
    def __init__(self, *, name: typing.Optional[str]=None, path: typing.Optional[str]=None, ttl: typing.Optional[typing.List["ComputeBackendServiceConsistentHashHttpCookieTtl"]]=None) -> None:
        """
        :param name: Name of the cookie.
        :param path: Path to set for the cookie.
        :param ttl: ttl block.
        """
        self._values = {
        }
        if name is not None: self._values["name"] = name
        if path is not None: self._values["path"] = path
        if ttl is not None: self._values["ttl"] = ttl

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Name of the cookie."""
        return self._values.get('name')

    @builtins.property
    def path(self) -> typing.Optional[str]:
        """Path to set for the cookie."""
        return self._values.get('path')

    @builtins.property
    def ttl(self) -> typing.Optional[typing.List["ComputeBackendServiceConsistentHashHttpCookieTtl"]]:
        """ttl block."""
        return self._values.get('ttl')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceConsistentHashHttpCookie(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceConsistentHashHttpCookieTtl", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeBackendServiceConsistentHashHttpCookieTtl():
    def __init__(self, *, seconds: jsii.Number, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> jsii.Number:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000 inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations less than one second are represented
        with a 0 seconds field and a positive nanos field. Must
        be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceConsistentHashHttpCookieTtl(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceIap", jsii_struct_bases=[], name_mapping={'oauth2_client_id': 'oauth2ClientId', 'oauth2_client_secret': 'oauth2ClientSecret'})
class ComputeBackendServiceIap():
    def __init__(self, *, oauth2_client_id: str, oauth2_client_secret: str) -> None:
        """
        :param oauth2_client_id: OAuth2 Client ID for IAP.
        :param oauth2_client_secret: OAuth2 Client Secret for IAP.
        """
        self._values = {
            'oauth2_client_id': oauth2_client_id,
            'oauth2_client_secret': oauth2_client_secret,
        }

    @builtins.property
    def oauth2_client_id(self) -> str:
        """OAuth2 Client ID for IAP."""
        return self._values.get('oauth2_client_id')

    @builtins.property
    def oauth2_client_secret(self) -> str:
        """OAuth2 Client Secret for IAP."""
        return self._values.get('oauth2_client_secret')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceIap(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceLogConfig", jsii_struct_bases=[], name_mapping={'enable': 'enable', 'sample_rate': 'sampleRate'})
class ComputeBackendServiceLogConfig():
    def __init__(self, *, enable: typing.Optional[bool]=None, sample_rate: typing.Optional[jsii.Number]=None) -> None:
        """
        :param enable: Whether to enable logging for the load balancer traffic served by this backend service.
        :param sample_rate: This field can only be specified if logging is enabled for this backend service. The value of the field must be in [0, 1]. This configures the sampling rate of requests to the load balancer where 1.0 means all logged requests are reported and 0.0 means no logged requests are reported. The default value is 1.0.
        """
        self._values = {
        }
        if enable is not None: self._values["enable"] = enable
        if sample_rate is not None: self._values["sample_rate"] = sample_rate

    @builtins.property
    def enable(self) -> typing.Optional[bool]:
        """Whether to enable logging for the load balancer traffic served by this backend service."""
        return self._values.get('enable')

    @builtins.property
    def sample_rate(self) -> typing.Optional[jsii.Number]:
        """This field can only be specified if logging is enabled for this backend service.

        The value of
        the field must be in [0, 1]. This configures the sampling rate of requests to the load balancer
        where 1.0 means all logged requests are reported and 0.0 means no logged requests are reported.
        The default value is 1.0.
        """
        return self._values.get('sample_rate')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceLogConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceOutlierDetection", jsii_struct_bases=[], name_mapping={'base_ejection_time': 'baseEjectionTime', 'consecutive_errors': 'consecutiveErrors', 'consecutive_gateway_failure': 'consecutiveGatewayFailure', 'enforcing_consecutive_errors': 'enforcingConsecutiveErrors', 'enforcing_consecutive_gateway_failure': 'enforcingConsecutiveGatewayFailure', 'enforcing_success_rate': 'enforcingSuccessRate', 'interval': 'interval', 'max_ejection_percent': 'maxEjectionPercent', 'success_rate_minimum_hosts': 'successRateMinimumHosts', 'success_rate_request_volume': 'successRateRequestVolume', 'success_rate_stdev_factor': 'successRateStdevFactor'})
class ComputeBackendServiceOutlierDetection():
    def __init__(self, *, base_ejection_time: typing.Optional[typing.List["ComputeBackendServiceOutlierDetectionBaseEjectionTime"]]=None, consecutive_errors: typing.Optional[jsii.Number]=None, consecutive_gateway_failure: typing.Optional[jsii.Number]=None, enforcing_consecutive_errors: typing.Optional[jsii.Number]=None, enforcing_consecutive_gateway_failure: typing.Optional[jsii.Number]=None, enforcing_success_rate: typing.Optional[jsii.Number]=None, interval: typing.Optional[typing.List["ComputeBackendServiceOutlierDetectionInterval"]]=None, max_ejection_percent: typing.Optional[jsii.Number]=None, success_rate_minimum_hosts: typing.Optional[jsii.Number]=None, success_rate_request_volume: typing.Optional[jsii.Number]=None, success_rate_stdev_factor: typing.Optional[jsii.Number]=None) -> None:
        """
        :param base_ejection_time: base_ejection_time block.
        :param consecutive_errors: Number of errors before a host is ejected from the connection pool. When the backend host is accessed over HTTP, a 5xx return code qualifies as an error. Defaults to 5.
        :param consecutive_gateway_failure: The number of consecutive gateway failures (502, 503, 504 status or connection errors that are mapped to one of those status codes) before a consecutive gateway failure ejection occurs. Defaults to 5.
        :param enforcing_consecutive_errors: The percentage chance that a host will be actually ejected when an outlier status is detected through consecutive 5xx. This setting can be used to disable ejection or to ramp it up slowly. Defaults to 100.
        :param enforcing_consecutive_gateway_failure: The percentage chance that a host will be actually ejected when an outlier status is detected through consecutive gateway failures. This setting can be used to disable ejection or to ramp it up slowly. Defaults to 0.
        :param enforcing_success_rate: The percentage chance that a host will be actually ejected when an outlier status is detected through success rate statistics. This setting can be used to disable ejection or to ramp it up slowly. Defaults to 100.
        :param interval: interval block.
        :param max_ejection_percent: Maximum percentage of hosts in the load balancing pool for the backend service that can be ejected. Defaults to 10%.
        :param success_rate_minimum_hosts: The number of hosts in a cluster that must have enough request volume to detect success rate outliers. If the number of hosts is less than this setting, outlier detection via success rate statistics is not performed for any host in the cluster. Defaults to 5.
        :param success_rate_request_volume: The minimum number of total requests that must be collected in one interval (as defined by the interval duration above) to include this host in success rate based outlier detection. If the volume is lower than this setting, outlier detection via success rate statistics is not performed for that host. Defaults to 100.
        :param success_rate_stdev_factor: This factor is used to determine the ejection threshold for success rate outlier ejection. The ejection threshold is the difference between the mean success rate, and the product of this factor and the standard deviation of the mean success rate: mean - (stdev * success_rate_stdev_factor). This factor is divided by a thousand to get a double. That is, if the desired factor is 1.9, the runtime value should be 1900. Defaults to 1900.
        """
        self._values = {
        }
        if base_ejection_time is not None: self._values["base_ejection_time"] = base_ejection_time
        if consecutive_errors is not None: self._values["consecutive_errors"] = consecutive_errors
        if consecutive_gateway_failure is not None: self._values["consecutive_gateway_failure"] = consecutive_gateway_failure
        if enforcing_consecutive_errors is not None: self._values["enforcing_consecutive_errors"] = enforcing_consecutive_errors
        if enforcing_consecutive_gateway_failure is not None: self._values["enforcing_consecutive_gateway_failure"] = enforcing_consecutive_gateway_failure
        if enforcing_success_rate is not None: self._values["enforcing_success_rate"] = enforcing_success_rate
        if interval is not None: self._values["interval"] = interval
        if max_ejection_percent is not None: self._values["max_ejection_percent"] = max_ejection_percent
        if success_rate_minimum_hosts is not None: self._values["success_rate_minimum_hosts"] = success_rate_minimum_hosts
        if success_rate_request_volume is not None: self._values["success_rate_request_volume"] = success_rate_request_volume
        if success_rate_stdev_factor is not None: self._values["success_rate_stdev_factor"] = success_rate_stdev_factor

    @builtins.property
    def base_ejection_time(self) -> typing.Optional[typing.List["ComputeBackendServiceOutlierDetectionBaseEjectionTime"]]:
        """base_ejection_time block."""
        return self._values.get('base_ejection_time')

    @builtins.property
    def consecutive_errors(self) -> typing.Optional[jsii.Number]:
        """Number of errors before a host is ejected from the connection pool.

        When the
        backend host is accessed over HTTP, a 5xx return code qualifies as an error.
        Defaults to 5.
        """
        return self._values.get('consecutive_errors')

    @builtins.property
    def consecutive_gateway_failure(self) -> typing.Optional[jsii.Number]:
        """The number of consecutive gateway failures (502, 503, 504 status or connection errors that are mapped to one of those status codes) before a consecutive gateway failure ejection occurs.

        Defaults to 5.
        """
        return self._values.get('consecutive_gateway_failure')

    @builtins.property
    def enforcing_consecutive_errors(self) -> typing.Optional[jsii.Number]:
        """The percentage chance that a host will be actually ejected when an outlier status is detected through consecutive 5xx.

        This setting can be used to disable
        ejection or to ramp it up slowly. Defaults to 100.
        """
        return self._values.get('enforcing_consecutive_errors')

    @builtins.property
    def enforcing_consecutive_gateway_failure(self) -> typing.Optional[jsii.Number]:
        """The percentage chance that a host will be actually ejected when an outlier status is detected through consecutive gateway failures.

        This setting can be
        used to disable ejection or to ramp it up slowly. Defaults to 0.
        """
        return self._values.get('enforcing_consecutive_gateway_failure')

    @builtins.property
    def enforcing_success_rate(self) -> typing.Optional[jsii.Number]:
        """The percentage chance that a host will be actually ejected when an outlier status is detected through success rate statistics.

        This setting can be used to
        disable ejection or to ramp it up slowly. Defaults to 100.
        """
        return self._values.get('enforcing_success_rate')

    @builtins.property
    def interval(self) -> typing.Optional[typing.List["ComputeBackendServiceOutlierDetectionInterval"]]:
        """interval block."""
        return self._values.get('interval')

    @builtins.property
    def max_ejection_percent(self) -> typing.Optional[jsii.Number]:
        """Maximum percentage of hosts in the load balancing pool for the backend service that can be ejected.

        Defaults to 10%.
        """
        return self._values.get('max_ejection_percent')

    @builtins.property
    def success_rate_minimum_hosts(self) -> typing.Optional[jsii.Number]:
        """The number of hosts in a cluster that must have enough request volume to detect success rate outliers.

        If the number of hosts is less than this setting, outlier
        detection via success rate statistics is not performed for any host in the
        cluster. Defaults to 5.
        """
        return self._values.get('success_rate_minimum_hosts')

    @builtins.property
    def success_rate_request_volume(self) -> typing.Optional[jsii.Number]:
        """The minimum number of total requests that must be collected in one interval (as defined by the interval duration above) to include this host in success rate based outlier detection.

        If the volume is lower than this setting, outlier
        detection via success rate statistics is not performed for that host. Defaults
        to 100.
        """
        return self._values.get('success_rate_request_volume')

    @builtins.property
    def success_rate_stdev_factor(self) -> typing.Optional[jsii.Number]:
        """This factor is used to determine the ejection threshold for success rate outlier ejection.

        The ejection threshold is the difference between the mean success
        rate, and the product of this factor and the standard deviation of the mean
        success rate: mean - (stdev * success_rate_stdev_factor). This factor is divided
        by a thousand to get a double. That is, if the desired factor is 1.9, the
        runtime value should be 1900. Defaults to 1900.
        """
        return self._values.get('success_rate_stdev_factor')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceOutlierDetection(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceOutlierDetectionBaseEjectionTime", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeBackendServiceOutlierDetectionBaseEjectionTime():
    def __init__(self, *, seconds: jsii.Number, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> jsii.Number:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceOutlierDetectionBaseEjectionTime(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceOutlierDetectionInterval", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeBackendServiceOutlierDetectionInterval():
    def __init__(self, *, seconds: jsii.Number, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> jsii.Number:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceOutlierDetectionInterval(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeBackendServiceSignedUrlKey(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeBackendServiceSignedUrlKey"):
    def __init__(self, scope: constructs.Construct, id: str, *, backend_service: str, key_value: str, name: str, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeBackendServiceSignedUrlKeyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param backend_service: The backend service this signed URL key belongs.
        :param key_value: 128-bit key value used for signing the URL. The key value must be a valid RFC 4648 Section 5 base64url encoded string.
        :param name: Name of the signed URL key.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeBackendServiceSignedUrlKeyConfig(backend_service=backend_service, key_value=key_value, name=name, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeBackendServiceSignedUrlKey, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="backendService")
    def backend_service(self) -> str:
        return jsii.get(self, "backendService")

    @backend_service.setter
    def backend_service(self, value: str) -> None:
        jsii.set(self, "backendService", value)

    @builtins.property
    @jsii.member(jsii_name="keyValue")
    def key_value(self) -> str:
        return jsii.get(self, "keyValue")

    @key_value.setter
    def key_value(self, value: str) -> None:
        jsii.set(self, "keyValue", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeBackendServiceSignedUrlKeyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeBackendServiceSignedUrlKeyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceSignedUrlKeyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'backend_service': 'backendService', 'key_value': 'keyValue', 'name': 'name', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeBackendServiceSignedUrlKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, backend_service: str, key_value: str, name: str, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeBackendServiceSignedUrlKeyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backend_service: The backend service this signed URL key belongs.
        :param key_value: 128-bit key value used for signing the URL. The key value must be a valid RFC 4648 Section 5 base64url encoded string.
        :param name: Name of the signed URL key.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeBackendServiceSignedUrlKeyTimeouts(**timeouts)
        self._values = {
            'backend_service': backend_service,
            'key_value': key_value,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def backend_service(self) -> str:
        """The backend service this signed URL key belongs."""
        return self._values.get('backend_service')

    @builtins.property
    def key_value(self) -> str:
        """128-bit key value used for signing the URL.

        The key value must be a
        valid RFC 4648 Section 5 base64url encoded string.
        """
        return self._values.get('key_value')

    @builtins.property
    def name(self) -> str:
        """Name of the signed URL key."""
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeBackendServiceSignedUrlKeyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceSignedUrlKeyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceSignedUrlKeyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeBackendServiceSignedUrlKeyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceSignedUrlKeyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeBackendServiceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeBackendServiceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeBackendServiceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeDisk(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeDisk"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, description: typing.Optional[str]=None, disk_encryption_key: typing.Optional[typing.List["ComputeDiskDiskEncryptionKey"]]=None, image: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, physical_block_size_bytes: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, size: typing.Optional[jsii.Number]=None, snapshot: typing.Optional[str]=None, source_image_encryption_key: typing.Optional[typing.List["ComputeDiskSourceImageEncryptionKey"]]=None, source_snapshot_encryption_key: typing.Optional[typing.List["ComputeDiskSourceSnapshotEncryptionKey"]]=None, timeouts: typing.Optional["ComputeDiskTimeouts"]=None, type: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param disk_encryption_key: disk_encryption_key block.
        :param image: The image from which to initialize this disk. This can be one of: the image's 'self_link', 'projects/{project}/global/images/{image}', 'projects/{project}/global/images/family/{family}', 'global/images/{image}', 'global/images/family/{family}', 'family/{family}', '{project}/{family}', '{project}/{image}', '{family}', or '{image}'. If referred by family, the images names must include the family name. If they don't, use the `google_compute_image data source </docs/providers/google/d/compute_image.html>`_. For instance, the image 'centos-6-v20180104' includes its family name 'centos-6'. These images can be referred by family name here.
        :param labels: Labels to apply to this disk. A list of key->value pairs.
        :param physical_block_size_bytes: Physical block size of the persistent disk, in bytes. If not present in a request, a default value is used. Currently supported sizes are 4096 and 16384, other sizes may be added in the future. If an unsupported value is requested, the error message will list the supported values for the caller's project.
        :param project: 
        :param size: Size of the persistent disk, specified in GB. You can specify this field when creating a persistent disk using the 'image' or 'snapshot' parameter, or specify it alone to create an empty persistent disk. If you specify this field along with 'image' or 'snapshot', the value must not be less than the size of the image or the size of the snapshot.
        :param snapshot: The source snapshot used to create this disk. You can provide this as a partial or full URL to the resource. If the snapshot is in another project than this disk, you must supply a full URL. For example, the following are valid values: 'https://www.googleapis.com/compute/v1/projects/project/global/snapshots/snapshot' 'projects/project/global/snapshots/snapshot' 'global/snapshots/snapshot' 'snapshot'
        :param source_image_encryption_key: source_image_encryption_key block.
        :param source_snapshot_encryption_key: source_snapshot_encryption_key block.
        :param timeouts: timeouts block.
        :param type: URL of the disk type resource describing which disk type to use to create the disk. Provide this when creating the disk.
        :param zone: A reference to the zone where the disk resides.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeDiskConfig(name=name, description=description, disk_encryption_key=disk_encryption_key, image=image, labels=labels, physical_block_size_bytes=physical_block_size_bytes, project=project, size=size, snapshot=snapshot, source_image_encryption_key=source_image_encryption_key, source_snapshot_encryption_key=source_snapshot_encryption_key, timeouts=timeouts, type=type, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeDisk, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="labelFingerprint")
    def label_fingerprint(self) -> str:
        return jsii.get(self, "labelFingerprint")

    @builtins.property
    @jsii.member(jsii_name="lastAttachTimestamp")
    def last_attach_timestamp(self) -> str:
        return jsii.get(self, "lastAttachTimestamp")

    @builtins.property
    @jsii.member(jsii_name="lastDetachTimestamp")
    def last_detach_timestamp(self) -> str:
        return jsii.get(self, "lastDetachTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="sourceImageId")
    def source_image_id(self) -> str:
        return jsii.get(self, "sourceImageId")

    @builtins.property
    @jsii.member(jsii_name="sourceSnapshotId")
    def source_snapshot_id(self) -> str:
        return jsii.get(self, "sourceSnapshotId")

    @builtins.property
    @jsii.member(jsii_name="users")
    def users(self) -> typing.List[str]:
        return jsii.get(self, "users")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="diskEncryptionKey")
    def disk_encryption_key(self) -> typing.Optional[typing.List["ComputeDiskDiskEncryptionKey"]]:
        return jsii.get(self, "diskEncryptionKey")

    @disk_encryption_key.setter
    def disk_encryption_key(self, value: typing.Optional[typing.List["ComputeDiskDiskEncryptionKey"]]) -> None:
        jsii.set(self, "diskEncryptionKey", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="image")
    def image(self) -> typing.Optional[str]:
        return jsii.get(self, "image")

    @image.setter
    def image(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "image", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="physicalBlockSizeBytes")
    def physical_block_size_bytes(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "physicalBlockSizeBytes")

    @physical_block_size_bytes.setter
    def physical_block_size_bytes(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "physicalBlockSizeBytes", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="size")
    def size(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "size")

    @size.setter
    def size(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "size", value)

    @builtins.property
    @jsii.member(jsii_name="snapshot")
    def snapshot(self) -> typing.Optional[str]:
        return jsii.get(self, "snapshot")

    @snapshot.setter
    def snapshot(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "snapshot", value)

    @builtins.property
    @jsii.member(jsii_name="sourceImageEncryptionKey")
    def source_image_encryption_key(self) -> typing.Optional[typing.List["ComputeDiskSourceImageEncryptionKey"]]:
        return jsii.get(self, "sourceImageEncryptionKey")

    @source_image_encryption_key.setter
    def source_image_encryption_key(self, value: typing.Optional[typing.List["ComputeDiskSourceImageEncryptionKey"]]) -> None:
        jsii.set(self, "sourceImageEncryptionKey", value)

    @builtins.property
    @jsii.member(jsii_name="sourceSnapshotEncryptionKey")
    def source_snapshot_encryption_key(self) -> typing.Optional[typing.List["ComputeDiskSourceSnapshotEncryptionKey"]]:
        return jsii.get(self, "sourceSnapshotEncryptionKey")

    @source_snapshot_encryption_key.setter
    def source_snapshot_encryption_key(self, value: typing.Optional[typing.List["ComputeDiskSourceSnapshotEncryptionKey"]]) -> None:
        jsii.set(self, "sourceSnapshotEncryptionKey", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeDiskTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeDiskTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> typing.Optional[str]:
        return jsii.get(self, "type")

    @type.setter
    def type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "type", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeDiskConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'description': 'description', 'disk_encryption_key': 'diskEncryptionKey', 'image': 'image', 'labels': 'labels', 'physical_block_size_bytes': 'physicalBlockSizeBytes', 'project': 'project', 'size': 'size', 'snapshot': 'snapshot', 'source_image_encryption_key': 'sourceImageEncryptionKey', 'source_snapshot_encryption_key': 'sourceSnapshotEncryptionKey', 'timeouts': 'timeouts', 'type': 'type', 'zone': 'zone'})
class ComputeDiskConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, description: typing.Optional[str]=None, disk_encryption_key: typing.Optional[typing.List["ComputeDiskDiskEncryptionKey"]]=None, image: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, physical_block_size_bytes: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, size: typing.Optional[jsii.Number]=None, snapshot: typing.Optional[str]=None, source_image_encryption_key: typing.Optional[typing.List["ComputeDiskSourceImageEncryptionKey"]]=None, source_snapshot_encryption_key: typing.Optional[typing.List["ComputeDiskSourceSnapshotEncryptionKey"]]=None, timeouts: typing.Optional["ComputeDiskTimeouts"]=None, type: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param disk_encryption_key: disk_encryption_key block.
        :param image: The image from which to initialize this disk. This can be one of: the image's 'self_link', 'projects/{project}/global/images/{image}', 'projects/{project}/global/images/family/{family}', 'global/images/{image}', 'global/images/family/{family}', 'family/{family}', '{project}/{family}', '{project}/{image}', '{family}', or '{image}'. If referred by family, the images names must include the family name. If they don't, use the `google_compute_image data source </docs/providers/google/d/compute_image.html>`_. For instance, the image 'centos-6-v20180104' includes its family name 'centos-6'. These images can be referred by family name here.
        :param labels: Labels to apply to this disk. A list of key->value pairs.
        :param physical_block_size_bytes: Physical block size of the persistent disk, in bytes. If not present in a request, a default value is used. Currently supported sizes are 4096 and 16384, other sizes may be added in the future. If an unsupported value is requested, the error message will list the supported values for the caller's project.
        :param project: 
        :param size: Size of the persistent disk, specified in GB. You can specify this field when creating a persistent disk using the 'image' or 'snapshot' parameter, or specify it alone to create an empty persistent disk. If you specify this field along with 'image' or 'snapshot', the value must not be less than the size of the image or the size of the snapshot.
        :param snapshot: The source snapshot used to create this disk. You can provide this as a partial or full URL to the resource. If the snapshot is in another project than this disk, you must supply a full URL. For example, the following are valid values: 'https://www.googleapis.com/compute/v1/projects/project/global/snapshots/snapshot' 'projects/project/global/snapshots/snapshot' 'global/snapshots/snapshot' 'snapshot'
        :param source_image_encryption_key: source_image_encryption_key block.
        :param source_snapshot_encryption_key: source_snapshot_encryption_key block.
        :param timeouts: timeouts block.
        :param type: URL of the disk type resource describing which disk type to use to create the disk. Provide this when creating the disk.
        :param zone: A reference to the zone where the disk resides.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeDiskTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if disk_encryption_key is not None: self._values["disk_encryption_key"] = disk_encryption_key
        if image is not None: self._values["image"] = image
        if labels is not None: self._values["labels"] = labels
        if physical_block_size_bytes is not None: self._values["physical_block_size_bytes"] = physical_block_size_bytes
        if project is not None: self._values["project"] = project
        if size is not None: self._values["size"] = size
        if snapshot is not None: self._values["snapshot"] = snapshot
        if source_image_encryption_key is not None: self._values["source_image_encryption_key"] = source_image_encryption_key
        if source_snapshot_encryption_key is not None: self._values["source_snapshot_encryption_key"] = source_snapshot_encryption_key
        if timeouts is not None: self._values["timeouts"] = timeouts
        if type is not None: self._values["type"] = type
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def disk_encryption_key(self) -> typing.Optional[typing.List["ComputeDiskDiskEncryptionKey"]]:
        """disk_encryption_key block."""
        return self._values.get('disk_encryption_key')

    @builtins.property
    def image(self) -> typing.Optional[str]:
        """The image from which to initialize this disk.

        This can be
        one of: the image's 'self_link', 'projects/{project}/global/images/{image}',
        'projects/{project}/global/images/family/{family}', 'global/images/{image}',
        'global/images/family/{family}', 'family/{family}', '{project}/{family}',
        '{project}/{image}', '{family}', or '{image}'. If referred by family, the
        images names must include the family name. If they don't, use the
        `google_compute_image data source </docs/providers/google/d/compute_image.html>`_.
        For instance, the image 'centos-6-v20180104' includes its family name 'centos-6'.
        These images can be referred by family name here.
        """
        return self._values.get('image')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Labels to apply to this disk.

        A list of key->value pairs.
        """
        return self._values.get('labels')

    @builtins.property
    def physical_block_size_bytes(self) -> typing.Optional[jsii.Number]:
        """Physical block size of the persistent disk, in bytes.

        If not present
        in a request, a default value is used. Currently supported sizes
        are 4096 and 16384, other sizes may be added in the future.
        If an unsupported value is requested, the error message will list
        the supported values for the caller's project.
        """
        return self._values.get('physical_block_size_bytes')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def size(self) -> typing.Optional[jsii.Number]:
        """Size of the persistent disk, specified in GB.

        You can specify this
        field when creating a persistent disk using the 'image' or
        'snapshot' parameter, or specify it alone to create an empty
        persistent disk.

        If you specify this field along with 'image' or 'snapshot',
        the value must not be less than the size of the image
        or the size of the snapshot.
        """
        return self._values.get('size')

    @builtins.property
    def snapshot(self) -> typing.Optional[str]:
        """The source snapshot used to create this disk.

        You can provide this as
        a partial or full URL to the resource. If the snapshot is in another
        project than this disk, you must supply a full URL. For example, the
        following are valid values:

        'https://www.googleapis.com/compute/v1/projects/project/global/snapshots/snapshot'
        'projects/project/global/snapshots/snapshot'
        'global/snapshots/snapshot'
        'snapshot'
        """
        return self._values.get('snapshot')

    @builtins.property
    def source_image_encryption_key(self) -> typing.Optional[typing.List["ComputeDiskSourceImageEncryptionKey"]]:
        """source_image_encryption_key block."""
        return self._values.get('source_image_encryption_key')

    @builtins.property
    def source_snapshot_encryption_key(self) -> typing.Optional[typing.List["ComputeDiskSourceSnapshotEncryptionKey"]]:
        """source_snapshot_encryption_key block."""
        return self._values.get('source_snapshot_encryption_key')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeDiskTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        """URL of the disk type resource describing which disk type to use to create the disk.

        Provide this when creating the disk.
        """
        return self._values.get('type')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """A reference to the zone where the disk resides."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeDiskConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeDiskDiskEncryptionKey", jsii_struct_bases=[], name_mapping={'kms_key_self_link': 'kmsKeySelfLink', 'raw_key': 'rawKey'})
class ComputeDiskDiskEncryptionKey():
    def __init__(self, *, kms_key_self_link: typing.Optional[str]=None, raw_key: typing.Optional[str]=None) -> None:
        """
        :param kms_key_self_link: The self link of the encryption key used to encrypt the disk. Also called KmsKeyName in the cloud console. Your project's Compute Engine System service account ('service-{{PROJECT_NUMBER}}@compute-system.iam.gserviceaccount.com') must have 'roles/cloudkms.cryptoKeyEncrypterDecrypter' to use this feature. See https://cloud.google.com/compute/docs/disks/customer-managed-encryption#encrypt_a_new_persistent_disk_with_your_own_keys
        :param raw_key: Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource.
        """
        self._values = {
        }
        if kms_key_self_link is not None: self._values["kms_key_self_link"] = kms_key_self_link
        if raw_key is not None: self._values["raw_key"] = raw_key

    @builtins.property
    def kms_key_self_link(self) -> typing.Optional[str]:
        """The self link of the encryption key used to encrypt the disk.

        Also called KmsKeyName
        in the cloud console. Your project's Compute Engine System service account
        ('service-{{PROJECT_NUMBER}}@compute-system.iam.gserviceaccount.com') must have
        'roles/cloudkms.cryptoKeyEncrypterDecrypter' to use this feature.
        See https://cloud.google.com/compute/docs/disks/customer-managed-encryption#encrypt_a_new_persistent_disk_with_your_own_keys
        """
        return self._values.get('kms_key_self_link')

    @builtins.property
    def raw_key(self) -> typing.Optional[str]:
        """Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource."""
        return self._values.get('raw_key')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeDiskDiskEncryptionKey(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeDiskResourcePolicyAttachment(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeDiskResourcePolicyAttachment"):
    def __init__(self, scope: constructs.Construct, id: str, *, disk: str, name: str, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeDiskResourcePolicyAttachmentTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param disk: The name of the disk in which the resource policies are attached to.
        :param name: The resource policy to be attached to the disk for scheduling snapshot creation. Do not specify the self link.
        :param project: 
        :param timeouts: timeouts block.
        :param zone: A reference to the zone where the disk resides.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeDiskResourcePolicyAttachmentConfig(disk=disk, name=name, project=project, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeDiskResourcePolicyAttachment, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="disk")
    def disk(self) -> str:
        return jsii.get(self, "disk")

    @disk.setter
    def disk(self, value: str) -> None:
        jsii.set(self, "disk", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeDiskResourcePolicyAttachmentTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeDiskResourcePolicyAttachmentTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeDiskResourcePolicyAttachmentConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'disk': 'disk', 'name': 'name', 'project': 'project', 'timeouts': 'timeouts', 'zone': 'zone'})
class ComputeDiskResourcePolicyAttachmentConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, disk: str, name: str, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeDiskResourcePolicyAttachmentTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param disk: The name of the disk in which the resource policies are attached to.
        :param name: The resource policy to be attached to the disk for scheduling snapshot creation. Do not specify the self link.
        :param project: 
        :param timeouts: timeouts block.
        :param zone: A reference to the zone where the disk resides.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeDiskResourcePolicyAttachmentTimeouts(**timeouts)
        self._values = {
            'disk': disk,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def disk(self) -> str:
        """The name of the disk in which the resource policies are attached to."""
        return self._values.get('disk')

    @builtins.property
    def name(self) -> str:
        """The resource policy to be attached to the disk for scheduling snapshot creation.

        Do not specify the self link.
        """
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeDiskResourcePolicyAttachmentTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """A reference to the zone where the disk resides."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeDiskResourcePolicyAttachmentConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeDiskResourcePolicyAttachmentTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeDiskResourcePolicyAttachmentTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeDiskResourcePolicyAttachmentTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeDiskSourceImageEncryptionKey", jsii_struct_bases=[], name_mapping={'kms_key_self_link': 'kmsKeySelfLink', 'raw_key': 'rawKey'})
class ComputeDiskSourceImageEncryptionKey():
    def __init__(self, *, kms_key_self_link: typing.Optional[str]=None, raw_key: typing.Optional[str]=None) -> None:
        """
        :param kms_key_self_link: The self link of the encryption key used to encrypt the disk. Also called KmsKeyName in the cloud console. Your project's Compute Engine System service account ('service-{{PROJECT_NUMBER}}@compute-system.iam.gserviceaccount.com') must have 'roles/cloudkms.cryptoKeyEncrypterDecrypter' to use this feature. See https://cloud.google.com/compute/docs/disks/customer-managed-encryption#encrypt_a_new_persistent_disk_with_your_own_keys
        :param raw_key: Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource.
        """
        self._values = {
        }
        if kms_key_self_link is not None: self._values["kms_key_self_link"] = kms_key_self_link
        if raw_key is not None: self._values["raw_key"] = raw_key

    @builtins.property
    def kms_key_self_link(self) -> typing.Optional[str]:
        """The self link of the encryption key used to encrypt the disk.

        Also called KmsKeyName
        in the cloud console. Your project's Compute Engine System service account
        ('service-{{PROJECT_NUMBER}}@compute-system.iam.gserviceaccount.com') must have
        'roles/cloudkms.cryptoKeyEncrypterDecrypter' to use this feature.
        See https://cloud.google.com/compute/docs/disks/customer-managed-encryption#encrypt_a_new_persistent_disk_with_your_own_keys
        """
        return self._values.get('kms_key_self_link')

    @builtins.property
    def raw_key(self) -> typing.Optional[str]:
        """Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource."""
        return self._values.get('raw_key')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeDiskSourceImageEncryptionKey(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeDiskSourceSnapshotEncryptionKey", jsii_struct_bases=[], name_mapping={'kms_key_self_link': 'kmsKeySelfLink', 'raw_key': 'rawKey'})
class ComputeDiskSourceSnapshotEncryptionKey():
    def __init__(self, *, kms_key_self_link: typing.Optional[str]=None, raw_key: typing.Optional[str]=None) -> None:
        """
        :param kms_key_self_link: The self link of the encryption key used to encrypt the disk. Also called KmsKeyName in the cloud console. Your project's Compute Engine System service account ('service-{{PROJECT_NUMBER}}@compute-system.iam.gserviceaccount.com') must have 'roles/cloudkms.cryptoKeyEncrypterDecrypter' to use this feature. See https://cloud.google.com/compute/docs/disks/customer-managed-encryption#encrypt_a_new_persistent_disk_with_your_own_keys
        :param raw_key: Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource.
        """
        self._values = {
        }
        if kms_key_self_link is not None: self._values["kms_key_self_link"] = kms_key_self_link
        if raw_key is not None: self._values["raw_key"] = raw_key

    @builtins.property
    def kms_key_self_link(self) -> typing.Optional[str]:
        """The self link of the encryption key used to encrypt the disk.

        Also called KmsKeyName
        in the cloud console. Your project's Compute Engine System service account
        ('service-{{PROJECT_NUMBER}}@compute-system.iam.gserviceaccount.com') must have
        'roles/cloudkms.cryptoKeyEncrypterDecrypter' to use this feature.
        See https://cloud.google.com/compute/docs/disks/customer-managed-encryption#encrypt_a_new_persistent_disk_with_your_own_keys
        """
        return self._values.get('kms_key_self_link')

    @builtins.property
    def raw_key(self) -> typing.Optional[str]:
        """Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource."""
        return self._values.get('raw_key')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeDiskSourceSnapshotEncryptionKey(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeDiskTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeDiskTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeDiskTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeFirewall(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeFirewall"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, network: str, allow: typing.Optional[typing.List["ComputeFirewallAllow"]]=None, deny: typing.Optional[typing.List["ComputeFirewallDeny"]]=None, description: typing.Optional[str]=None, destination_ranges: typing.Optional[typing.List[str]]=None, direction: typing.Optional[str]=None, disabled: typing.Optional[bool]=None, enable_logging: typing.Optional[bool]=None, log_config: typing.Optional[typing.List["ComputeFirewallLogConfig"]]=None, priority: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, source_ranges: typing.Optional[typing.List[str]]=None, source_service_accounts: typing.Optional[typing.List[str]]=None, source_tags: typing.Optional[typing.List[str]]=None, target_service_accounts: typing.Optional[typing.List[str]]=None, target_tags: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["ComputeFirewallTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: The name or self_link of the network to attach this firewall to.
        :param allow: allow block.
        :param deny: deny block.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param destination_ranges: If destination ranges are specified, the firewall will apply only to traffic that has destination IP address in these ranges. These ranges must be expressed in CIDR format. Only IPv4 is supported.
        :param direction: Direction of traffic to which this firewall applies; default is INGRESS. Note: For INGRESS traffic, it is NOT supported to specify destinationRanges; For EGRESS traffic, it is NOT supported to specify sourceRanges OR sourceTags. Possible values: ["INGRESS", "EGRESS"]
        :param disabled: Denotes whether the firewall rule is disabled, i.e not applied to the network it is associated with. When set to true, the firewall rule is not enforced and the network behaves as if it did not exist. If this is unspecified, the firewall rule will be enabled.
        :param enable_logging: This field denotes whether to enable logging for a particular firewall rule. If logging is enabled, logs will be exported to Stackdriver.
        :param log_config: log_config block.
        :param priority: Priority for this rule. This is an integer between 0 and 65535, both inclusive. When not specified, the value assumed is 1000. Relative priorities determine precedence of conflicting rules. Lower value of priority implies higher precedence (eg, a rule with priority 0 has higher precedence than a rule with priority 1). DENY rules take precedence over ALLOW rules having equal priority.
        :param project: 
        :param source_ranges: If source ranges are specified, the firewall will apply only to traffic that has source IP address in these ranges. These ranges must be expressed in CIDR format. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply. Only IPv4 is supported.
        :param source_service_accounts: If source service accounts are specified, the firewall will apply only to traffic originating from an instance with a service account in this list. Source service accounts cannot be used to control traffic to an instance's external IP address because service accounts are associated with an instance, not an IP address. sourceRanges can be set at the same time as sourceServiceAccounts. If both are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP belongs to an instance with service account listed in sourceServiceAccount. The connection does not need to match both properties for the firewall to apply. sourceServiceAccounts cannot be used at the same time as sourceTags or targetTags.
        :param source_tags: If source tags are specified, the firewall will apply only to traffic with source IP that belongs to a tag listed in source tags. Source tags cannot be used to control traffic to an instance's external IP address. Because tags are associated with an instance, not an IP address. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply.
        :param target_service_accounts: A list of service accounts indicating sets of instances located in the network that may make network connections as specified in allowed[]. targetServiceAccounts cannot be used at the same time as targetTags or sourceTags. If neither targetServiceAccounts nor targetTags are specified, the firewall rule applies to all instances on the specified network.
        :param target_tags: A list of instance tags indicating sets of instances located in the network that may make network connections as specified in allowed[]. If no targetTags are specified, the firewall rule applies to all instances on the specified network.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeFirewallConfig(name=name, network=network, allow=allow, deny=deny, description=description, destination_ranges=destination_ranges, direction=direction, disabled=disabled, enable_logging=enable_logging, log_config=log_config, priority=priority, project=project, source_ranges=source_ranges, source_service_accounts=source_service_accounts, source_tags=source_tags, target_service_accounts=target_service_accounts, target_tags=target_tags, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeFirewall, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: str) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="allow")
    def allow(self) -> typing.Optional[typing.List["ComputeFirewallAllow"]]:
        return jsii.get(self, "allow")

    @allow.setter
    def allow(self, value: typing.Optional[typing.List["ComputeFirewallAllow"]]) -> None:
        jsii.set(self, "allow", value)

    @builtins.property
    @jsii.member(jsii_name="deny")
    def deny(self) -> typing.Optional[typing.List["ComputeFirewallDeny"]]:
        return jsii.get(self, "deny")

    @deny.setter
    def deny(self, value: typing.Optional[typing.List["ComputeFirewallDeny"]]) -> None:
        jsii.set(self, "deny", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="destinationRanges")
    def destination_ranges(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "destinationRanges")

    @destination_ranges.setter
    def destination_ranges(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "destinationRanges", value)

    @builtins.property
    @jsii.member(jsii_name="direction")
    def direction(self) -> typing.Optional[str]:
        return jsii.get(self, "direction")

    @direction.setter
    def direction(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "direction", value)

    @builtins.property
    @jsii.member(jsii_name="disabled")
    def disabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "disabled")

    @disabled.setter
    def disabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "disabled", value)

    @builtins.property
    @jsii.member(jsii_name="enableLogging")
    def enable_logging(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableLogging")

    @enable_logging.setter
    def enable_logging(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableLogging", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="logConfig")
    def log_config(self) -> typing.Optional[typing.List["ComputeFirewallLogConfig"]]:
        return jsii.get(self, "logConfig")

    @log_config.setter
    def log_config(self, value: typing.Optional[typing.List["ComputeFirewallLogConfig"]]) -> None:
        jsii.set(self, "logConfig", value)

    @builtins.property
    @jsii.member(jsii_name="priority")
    def priority(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "priority")

    @priority.setter
    def priority(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "priority", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="sourceRanges")
    def source_ranges(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "sourceRanges")

    @source_ranges.setter
    def source_ranges(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "sourceRanges", value)

    @builtins.property
    @jsii.member(jsii_name="sourceServiceAccounts")
    def source_service_accounts(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "sourceServiceAccounts")

    @source_service_accounts.setter
    def source_service_accounts(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "sourceServiceAccounts", value)

    @builtins.property
    @jsii.member(jsii_name="sourceTags")
    def source_tags(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "sourceTags")

    @source_tags.setter
    def source_tags(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "sourceTags", value)

    @builtins.property
    @jsii.member(jsii_name="targetServiceAccounts")
    def target_service_accounts(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "targetServiceAccounts")

    @target_service_accounts.setter
    def target_service_accounts(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "targetServiceAccounts", value)

    @builtins.property
    @jsii.member(jsii_name="targetTags")
    def target_tags(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "targetTags")

    @target_tags.setter
    def target_tags(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "targetTags", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeFirewallTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeFirewallTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeFirewallAllow", jsii_struct_bases=[], name_mapping={'protocol': 'protocol', 'ports': 'ports'})
class ComputeFirewallAllow():
    def __init__(self, *, protocol: str, ports: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param protocol: The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, sctp, ipip), or the IP protocol number.
        :param ports: An optional list of ports to which this rule applies. This field is only applicable for UDP or TCP protocol. Each entry must be either an integer or a range. If not specified, this rule applies to connections through any port. Example inputs include: ["22"], ["80","443"], and ["12345-12349"].
        """
        self._values = {
            'protocol': protocol,
        }
        if ports is not None: self._values["ports"] = ports

    @builtins.property
    def protocol(self) -> str:
        """The IP protocol to which this rule applies.

        The protocol type is
        required when creating a firewall rule. This value can either be
        one of the following well known protocol strings (tcp, udp,
        icmp, esp, ah, sctp, ipip), or the IP protocol number.
        """
        return self._values.get('protocol')

    @builtins.property
    def ports(self) -> typing.Optional[typing.List[str]]:
        """An optional list of ports to which this rule applies.

        This field
        is only applicable for UDP or TCP protocol. Each entry must be
        either an integer or a range. If not specified, this rule
        applies to connections through any port.

        Example inputs include: ["22"], ["80","443"], and
        ["12345-12349"].
        """
        return self._values.get('ports')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeFirewallAllow(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeFirewallConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'network': 'network', 'allow': 'allow', 'deny': 'deny', 'description': 'description', 'destination_ranges': 'destinationRanges', 'direction': 'direction', 'disabled': 'disabled', 'enable_logging': 'enableLogging', 'log_config': 'logConfig', 'priority': 'priority', 'project': 'project', 'source_ranges': 'sourceRanges', 'source_service_accounts': 'sourceServiceAccounts', 'source_tags': 'sourceTags', 'target_service_accounts': 'targetServiceAccounts', 'target_tags': 'targetTags', 'timeouts': 'timeouts'})
class ComputeFirewallConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, network: str, allow: typing.Optional[typing.List["ComputeFirewallAllow"]]=None, deny: typing.Optional[typing.List["ComputeFirewallDeny"]]=None, description: typing.Optional[str]=None, destination_ranges: typing.Optional[typing.List[str]]=None, direction: typing.Optional[str]=None, disabled: typing.Optional[bool]=None, enable_logging: typing.Optional[bool]=None, log_config: typing.Optional[typing.List["ComputeFirewallLogConfig"]]=None, priority: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, source_ranges: typing.Optional[typing.List[str]]=None, source_service_accounts: typing.Optional[typing.List[str]]=None, source_tags: typing.Optional[typing.List[str]]=None, target_service_accounts: typing.Optional[typing.List[str]]=None, target_tags: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["ComputeFirewallTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: The name or self_link of the network to attach this firewall to.
        :param allow: allow block.
        :param deny: deny block.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param destination_ranges: If destination ranges are specified, the firewall will apply only to traffic that has destination IP address in these ranges. These ranges must be expressed in CIDR format. Only IPv4 is supported.
        :param direction: Direction of traffic to which this firewall applies; default is INGRESS. Note: For INGRESS traffic, it is NOT supported to specify destinationRanges; For EGRESS traffic, it is NOT supported to specify sourceRanges OR sourceTags. Possible values: ["INGRESS", "EGRESS"]
        :param disabled: Denotes whether the firewall rule is disabled, i.e not applied to the network it is associated with. When set to true, the firewall rule is not enforced and the network behaves as if it did not exist. If this is unspecified, the firewall rule will be enabled.
        :param enable_logging: This field denotes whether to enable logging for a particular firewall rule. If logging is enabled, logs will be exported to Stackdriver.
        :param log_config: log_config block.
        :param priority: Priority for this rule. This is an integer between 0 and 65535, both inclusive. When not specified, the value assumed is 1000. Relative priorities determine precedence of conflicting rules. Lower value of priority implies higher precedence (eg, a rule with priority 0 has higher precedence than a rule with priority 1). DENY rules take precedence over ALLOW rules having equal priority.
        :param project: 
        :param source_ranges: If source ranges are specified, the firewall will apply only to traffic that has source IP address in these ranges. These ranges must be expressed in CIDR format. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply. Only IPv4 is supported.
        :param source_service_accounts: If source service accounts are specified, the firewall will apply only to traffic originating from an instance with a service account in this list. Source service accounts cannot be used to control traffic to an instance's external IP address because service accounts are associated with an instance, not an IP address. sourceRanges can be set at the same time as sourceServiceAccounts. If both are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP belongs to an instance with service account listed in sourceServiceAccount. The connection does not need to match both properties for the firewall to apply. sourceServiceAccounts cannot be used at the same time as sourceTags or targetTags.
        :param source_tags: If source tags are specified, the firewall will apply only to traffic with source IP that belongs to a tag listed in source tags. Source tags cannot be used to control traffic to an instance's external IP address. Because tags are associated with an instance, not an IP address. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply.
        :param target_service_accounts: A list of service accounts indicating sets of instances located in the network that may make network connections as specified in allowed[]. targetServiceAccounts cannot be used at the same time as targetTags or sourceTags. If neither targetServiceAccounts nor targetTags are specified, the firewall rule applies to all instances on the specified network.
        :param target_tags: A list of instance tags indicating sets of instances located in the network that may make network connections as specified in allowed[]. If no targetTags are specified, the firewall rule applies to all instances on the specified network.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeFirewallTimeouts(**timeouts)
        self._values = {
            'name': name,
            'network': network,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if allow is not None: self._values["allow"] = allow
        if deny is not None: self._values["deny"] = deny
        if description is not None: self._values["description"] = description
        if destination_ranges is not None: self._values["destination_ranges"] = destination_ranges
        if direction is not None: self._values["direction"] = direction
        if disabled is not None: self._values["disabled"] = disabled
        if enable_logging is not None: self._values["enable_logging"] = enable_logging
        if log_config is not None: self._values["log_config"] = log_config
        if priority is not None: self._values["priority"] = priority
        if project is not None: self._values["project"] = project
        if source_ranges is not None: self._values["source_ranges"] = source_ranges
        if source_service_accounts is not None: self._values["source_service_accounts"] = source_service_accounts
        if source_tags is not None: self._values["source_tags"] = source_tags
        if target_service_accounts is not None: self._values["target_service_accounts"] = target_service_accounts
        if target_tags is not None: self._values["target_tags"] = target_tags
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def network(self) -> str:
        """The name or self_link of the network to attach this firewall to."""
        return self._values.get('network')

    @builtins.property
    def allow(self) -> typing.Optional[typing.List["ComputeFirewallAllow"]]:
        """allow block."""
        return self._values.get('allow')

    @builtins.property
    def deny(self) -> typing.Optional[typing.List["ComputeFirewallDeny"]]:
        """deny block."""
        return self._values.get('deny')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def destination_ranges(self) -> typing.Optional[typing.List[str]]:
        """If destination ranges are specified, the firewall will apply only to traffic that has destination IP address in these ranges.

        These ranges
        must be expressed in CIDR format. Only IPv4 is supported.
        """
        return self._values.get('destination_ranges')

    @builtins.property
    def direction(self) -> typing.Optional[str]:
        """Direction of traffic to which this firewall applies;

        default is
        INGRESS. Note: For INGRESS traffic, it is NOT supported to specify
        destinationRanges; For EGRESS traffic, it is NOT supported to specify
        sourceRanges OR sourceTags. Possible values: ["INGRESS", "EGRESS"]
        """
        return self._values.get('direction')

    @builtins.property
    def disabled(self) -> typing.Optional[bool]:
        """Denotes whether the firewall rule is disabled, i.e not applied to the network it is associated with. When set to true, the firewall rule is not enforced and the network behaves as if it did not exist. If this is unspecified, the firewall rule will be enabled."""
        return self._values.get('disabled')

    @builtins.property
    def enable_logging(self) -> typing.Optional[bool]:
        """This field denotes whether to enable logging for a particular firewall rule.

        If logging is enabled, logs will be exported to Stackdriver.
        """
        return self._values.get('enable_logging')

    @builtins.property
    def log_config(self) -> typing.Optional[typing.List["ComputeFirewallLogConfig"]]:
        """log_config block."""
        return self._values.get('log_config')

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        """Priority for this rule.

        This is an integer between 0 and 65535, both
        inclusive. When not specified, the value assumed is 1000. Relative
        priorities determine precedence of conflicting rules. Lower value of
        priority implies higher precedence (eg, a rule with priority 0 has
        higher precedence than a rule with priority 1). DENY rules take
        precedence over ALLOW rules having equal priority.
        """
        return self._values.get('priority')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def source_ranges(self) -> typing.Optional[typing.List[str]]:
        """If source ranges are specified, the firewall will apply only to traffic that has source IP address in these ranges.

        These ranges must
        be expressed in CIDR format. One or both of sourceRanges and
        sourceTags may be set. If both properties are set, the firewall will
        apply to traffic that has source IP address within sourceRanges OR the
        source IP that belongs to a tag listed in the sourceTags property. The
        connection does not need to match both properties for the firewall to
        apply. Only IPv4 is supported.
        """
        return self._values.get('source_ranges')

    @builtins.property
    def source_service_accounts(self) -> typing.Optional[typing.List[str]]:
        """If source service accounts are specified, the firewall will apply only to traffic originating from an instance with a service account in this list.

        Source service accounts cannot be used to control traffic to an
        instance's external IP address because service accounts are associated
        with an instance, not an IP address. sourceRanges can be set at the
        same time as sourceServiceAccounts. If both are set, the firewall will
        apply to traffic that has source IP address within sourceRanges OR the
        source IP belongs to an instance with service account listed in
        sourceServiceAccount. The connection does not need to match both
        properties for the firewall to apply. sourceServiceAccounts cannot be
        used at the same time as sourceTags or targetTags.
        """
        return self._values.get('source_service_accounts')

    @builtins.property
    def source_tags(self) -> typing.Optional[typing.List[str]]:
        """If source tags are specified, the firewall will apply only to traffic with source IP that belongs to a tag listed in source tags.

        Source
        tags cannot be used to control traffic to an instance's external IP
        address. Because tags are associated with an instance, not an IP
        address. One or both of sourceRanges and sourceTags may be set. If
        both properties are set, the firewall will apply to traffic that has
        source IP address within sourceRanges OR the source IP that belongs to
        a tag listed in the sourceTags property. The connection does not need
        to match both properties for the firewall to apply.
        """
        return self._values.get('source_tags')

    @builtins.property
    def target_service_accounts(self) -> typing.Optional[typing.List[str]]:
        """A list of service accounts indicating sets of instances located in the network that may make network connections as specified in allowed[].

        targetServiceAccounts cannot be used at the same time as targetTags or
        sourceTags. If neither targetServiceAccounts nor targetTags are
        specified, the firewall rule applies to all instances on the specified
        network.
        """
        return self._values.get('target_service_accounts')

    @builtins.property
    def target_tags(self) -> typing.Optional[typing.List[str]]:
        """A list of instance tags indicating sets of instances located in the network that may make network connections as specified in allowed[].

        If no targetTags are specified, the firewall rule applies to all
        instances on the specified network.
        """
        return self._values.get('target_tags')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeFirewallTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeFirewallConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeFirewallDeny", jsii_struct_bases=[], name_mapping={'protocol': 'protocol', 'ports': 'ports'})
class ComputeFirewallDeny():
    def __init__(self, *, protocol: str, ports: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param protocol: The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, sctp, ipip), or the IP protocol number.
        :param ports: An optional list of ports to which this rule applies. This field is only applicable for UDP or TCP protocol. Each entry must be either an integer or a range. If not specified, this rule applies to connections through any port. Example inputs include: ["22"], ["80","443"], and ["12345-12349"].
        """
        self._values = {
            'protocol': protocol,
        }
        if ports is not None: self._values["ports"] = ports

    @builtins.property
    def protocol(self) -> str:
        """The IP protocol to which this rule applies.

        The protocol type is
        required when creating a firewall rule. This value can either be
        one of the following well known protocol strings (tcp, udp,
        icmp, esp, ah, sctp, ipip), or the IP protocol number.
        """
        return self._values.get('protocol')

    @builtins.property
    def ports(self) -> typing.Optional[typing.List[str]]:
        """An optional list of ports to which this rule applies.

        This field
        is only applicable for UDP or TCP protocol. Each entry must be
        either an integer or a range. If not specified, this rule
        applies to connections through any port.

        Example inputs include: ["22"], ["80","443"], and
        ["12345-12349"].
        """
        return self._values.get('ports')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeFirewallDeny(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeFirewallLogConfig", jsii_struct_bases=[], name_mapping={'metadata': 'metadata'})
class ComputeFirewallLogConfig():
    def __init__(self, *, metadata: str) -> None:
        """
        :param metadata: This field denotes whether to include or exclude metadata for firewall logs. Possible values: ["EXCLUDE_ALL_METADATA", "INCLUDE_ALL_METADATA"]
        """
        self._values = {
            'metadata': metadata,
        }

    @builtins.property
    def metadata(self) -> str:
        """This field denotes whether to include or exclude metadata for firewall logs.

        Possible values: ["EXCLUDE_ALL_METADATA", "INCLUDE_ALL_METADATA"]
        """
        return self._values.get('metadata')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeFirewallLogConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeFirewallTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeFirewallTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeFirewallTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeForwardingRule(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeForwardingRule"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, allow_global_access: typing.Optional[bool]=None, all_ports: typing.Optional[bool]=None, backend_service: typing.Optional[str]=None, description: typing.Optional[str]=None, ip_address: typing.Optional[str]=None, ip_protocol: typing.Optional[str]=None, ip_version: typing.Optional[str]=None, load_balancing_scheme: typing.Optional[str]=None, network: typing.Optional[str]=None, network_tier: typing.Optional[str]=None, port_range: typing.Optional[str]=None, ports: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, service_label: typing.Optional[str]=None, subnetwork: typing.Optional[str]=None, target: typing.Optional[str]=None, timeouts: typing.Optional["ComputeForwardingRuleTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param allow_global_access: If true, clients can access ILB from all regions. Otherwise only allows from the local region the ILB is located at.
        :param all_ports: For internal TCP/UDP load balancing (i.e. load balancing scheme is INTERNAL and protocol is TCP/UDP), set this to true to allow packets addressed to any ports to be forwarded to the backends configured with this forwarding rule. Used with backend service. Cannot be set if port or portRange are set.
        :param backend_service: A BackendService to receive the matched traffic. This is used only for INTERNAL load balancing.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param ip_address: The IP address that this forwarding rule is serving on behalf of. Addresses are restricted based on the forwarding rule's load balancing scheme (EXTERNAL or INTERNAL) and scope (global or regional). When the load balancing scheme is EXTERNAL, for global forwarding rules, the address must be a global IP, and for regional forwarding rules, the address must live in the same region as the forwarding rule. If this field is empty, an ephemeral IPv4 address from the same scope (global or regional) will be assigned. A regional forwarding rule supports IPv4 only. A global forwarding rule supports either IPv4 or IPv6. When the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnet configured for the forwarding rule. By default, if this field is empty, an ephemeral internal IP address will be automatically allocated from the IP range of the subnet or network configured for this forwarding rule. An address must be specified by a literal IP address. ~> **NOTE:** While the API allows you to specify various resource paths for an address resource instead, Terraform requires this to specifically be an IP address to avoid needing to fetching the IP address from resource paths on refresh or unnecessary diffs.
        :param ip_protocol: The IP protocol to which this rule applies. When the load balancing scheme is INTERNAL, only TCP and UDP are valid. Possible values: ["TCP", "UDP", "ESP", "AH", "SCTP", "ICMP"]
        :param ip_version: 
        :param load_balancing_scheme: This signifies what the ForwardingRule will be used for and can be EXTERNAL, INTERNAL, or INTERNAL_MANAGED. EXTERNAL is used for Classic Cloud VPN gateways, protocol forwarding to VMs from an external IP address, and HTTP(S), SSL Proxy, TCP Proxy, and Network TCP/UDP load balancers. INTERNAL is used for protocol forwarding to VMs from an internal IP address, and internal TCP/UDP load balancers. INTERNAL_MANAGED is used for internal HTTP(S) load balancers. Default value: "EXTERNAL" Possible values: ["EXTERNAL", "INTERNAL", "INTERNAL_MANAGED"]
        :param network: For internal load balancing, this field identifies the network that the load balanced IP should belong to for this Forwarding Rule. If this field is not specified, the default network will be used. This field is only used for INTERNAL load balancing.
        :param network_tier: The networking tier used for configuring this address. If this field is not specified, it is assumed to be PREMIUM. Possible values: ["PREMIUM", "STANDARD"]
        :param port_range: This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy, TargetSslProxy, TargetTcpProxy, TargetVpnGateway, TargetPool, TargetInstance. Applicable only when IPProtocol is TCP, UDP, or SCTP, only packets addressed to ports in the specified range will be forwarded to target. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges. Some types of forwarding target have constraints on the acceptable ports: TargetHttpProxy: 80, 8080 TargetHttpsProxy: 443 TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 TargetVpnGateway: 500, 4500
        :param ports: This field is used along with the backend_service field for internal load balancing. When the load balancing scheme is INTERNAL, a single port or a comma separated list of ports can be configured. Only packets addressed to these ports will be forwarded to the backends configured with this forwarding rule. You may specify a maximum of up to 5 ports.
        :param project: 
        :param region: A reference to the region where the regional forwarding rule resides. This field is not applicable to global forwarding rules.
        :param service_label: An optional prefix to the service name for this Forwarding Rule. If specified, will be the first label of the fully qualified service name. The label must be 1-63 characters long, and comply with RFC1035. Specifically, the label must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash. This field is only used for INTERNAL load balancing.
        :param subnetwork: The subnetwork that the load balanced IP should belong to for this Forwarding Rule. This field is only used for INTERNAL load balancing. If the network specified is in auto subnet mode, this field is optional. However, if the network is in custom subnet mode, a subnetwork must be specified.
        :param target: The URL of the target resource to receive the matched traffic. The target must live in the same region as the forwarding rule. The forwarded traffic must be of a type appropriate to the target object.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeForwardingRuleConfig(name=name, allow_global_access=allow_global_access, all_ports=all_ports, backend_service=backend_service, description=description, ip_address=ip_address, ip_protocol=ip_protocol, ip_version=ip_version, load_balancing_scheme=load_balancing_scheme, network=network, network_tier=network_tier, port_range=port_range, ports=ports, project=project, region=region, service_label=service_label, subnetwork=subnetwork, target=target, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeForwardingRule, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="serviceName")
    def service_name(self) -> str:
        return jsii.get(self, "serviceName")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="allowGlobalAccess")
    def allow_global_access(self) -> typing.Optional[bool]:
        return jsii.get(self, "allowGlobalAccess")

    @allow_global_access.setter
    def allow_global_access(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "allowGlobalAccess", value)

    @builtins.property
    @jsii.member(jsii_name="allPorts")
    def all_ports(self) -> typing.Optional[bool]:
        return jsii.get(self, "allPorts")

    @all_ports.setter
    def all_ports(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "allPorts", value)

    @builtins.property
    @jsii.member(jsii_name="backendService")
    def backend_service(self) -> typing.Optional[str]:
        return jsii.get(self, "backendService")

    @backend_service.setter
    def backend_service(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "backendService", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> typing.Optional[str]:
        return jsii.get(self, "ipAddress")

    @ip_address.setter
    def ip_address(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "ipAddress", value)

    @builtins.property
    @jsii.member(jsii_name="ipProtocol")
    def ip_protocol(self) -> typing.Optional[str]:
        return jsii.get(self, "ipProtocol")

    @ip_protocol.setter
    def ip_protocol(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "ipProtocol", value)

    @builtins.property
    @jsii.member(jsii_name="ipVersion")
    def ip_version(self) -> typing.Optional[str]:
        return jsii.get(self, "ipVersion")

    @ip_version.setter
    def ip_version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "ipVersion", value)

    @builtins.property
    @jsii.member(jsii_name="loadBalancingScheme")
    def load_balancing_scheme(self) -> typing.Optional[str]:
        return jsii.get(self, "loadBalancingScheme")

    @load_balancing_scheme.setter
    def load_balancing_scheme(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "loadBalancingScheme", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> typing.Optional[str]:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="networkTier")
    def network_tier(self) -> typing.Optional[str]:
        return jsii.get(self, "networkTier")

    @network_tier.setter
    def network_tier(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "networkTier", value)

    @builtins.property
    @jsii.member(jsii_name="portRange")
    def port_range(self) -> typing.Optional[str]:
        return jsii.get(self, "portRange")

    @port_range.setter
    def port_range(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "portRange", value)

    @builtins.property
    @jsii.member(jsii_name="ports")
    def ports(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "ports")

    @ports.setter
    def ports(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "ports", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="serviceLabel")
    def service_label(self) -> typing.Optional[str]:
        return jsii.get(self, "serviceLabel")

    @service_label.setter
    def service_label(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "serviceLabel", value)

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> typing.Optional[str]:
        return jsii.get(self, "subnetwork")

    @subnetwork.setter
    def subnetwork(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "subnetwork", value)

    @builtins.property
    @jsii.member(jsii_name="target")
    def target(self) -> typing.Optional[str]:
        return jsii.get(self, "target")

    @target.setter
    def target(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "target", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeForwardingRuleTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeForwardingRuleTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeForwardingRuleConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'allow_global_access': 'allowGlobalAccess', 'all_ports': 'allPorts', 'backend_service': 'backendService', 'description': 'description', 'ip_address': 'ipAddress', 'ip_protocol': 'ipProtocol', 'ip_version': 'ipVersion', 'load_balancing_scheme': 'loadBalancingScheme', 'network': 'network', 'network_tier': 'networkTier', 'port_range': 'portRange', 'ports': 'ports', 'project': 'project', 'region': 'region', 'service_label': 'serviceLabel', 'subnetwork': 'subnetwork', 'target': 'target', 'timeouts': 'timeouts'})
class ComputeForwardingRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, allow_global_access: typing.Optional[bool]=None, all_ports: typing.Optional[bool]=None, backend_service: typing.Optional[str]=None, description: typing.Optional[str]=None, ip_address: typing.Optional[str]=None, ip_protocol: typing.Optional[str]=None, ip_version: typing.Optional[str]=None, load_balancing_scheme: typing.Optional[str]=None, network: typing.Optional[str]=None, network_tier: typing.Optional[str]=None, port_range: typing.Optional[str]=None, ports: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, service_label: typing.Optional[str]=None, subnetwork: typing.Optional[str]=None, target: typing.Optional[str]=None, timeouts: typing.Optional["ComputeForwardingRuleTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param allow_global_access: If true, clients can access ILB from all regions. Otherwise only allows from the local region the ILB is located at.
        :param all_ports: For internal TCP/UDP load balancing (i.e. load balancing scheme is INTERNAL and protocol is TCP/UDP), set this to true to allow packets addressed to any ports to be forwarded to the backends configured with this forwarding rule. Used with backend service. Cannot be set if port or portRange are set.
        :param backend_service: A BackendService to receive the matched traffic. This is used only for INTERNAL load balancing.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param ip_address: The IP address that this forwarding rule is serving on behalf of. Addresses are restricted based on the forwarding rule's load balancing scheme (EXTERNAL or INTERNAL) and scope (global or regional). When the load balancing scheme is EXTERNAL, for global forwarding rules, the address must be a global IP, and for regional forwarding rules, the address must live in the same region as the forwarding rule. If this field is empty, an ephemeral IPv4 address from the same scope (global or regional) will be assigned. A regional forwarding rule supports IPv4 only. A global forwarding rule supports either IPv4 or IPv6. When the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnet configured for the forwarding rule. By default, if this field is empty, an ephemeral internal IP address will be automatically allocated from the IP range of the subnet or network configured for this forwarding rule. An address must be specified by a literal IP address. ~> **NOTE:** While the API allows you to specify various resource paths for an address resource instead, Terraform requires this to specifically be an IP address to avoid needing to fetching the IP address from resource paths on refresh or unnecessary diffs.
        :param ip_protocol: The IP protocol to which this rule applies. When the load balancing scheme is INTERNAL, only TCP and UDP are valid. Possible values: ["TCP", "UDP", "ESP", "AH", "SCTP", "ICMP"]
        :param ip_version: 
        :param load_balancing_scheme: This signifies what the ForwardingRule will be used for and can be EXTERNAL, INTERNAL, or INTERNAL_MANAGED. EXTERNAL is used for Classic Cloud VPN gateways, protocol forwarding to VMs from an external IP address, and HTTP(S), SSL Proxy, TCP Proxy, and Network TCP/UDP load balancers. INTERNAL is used for protocol forwarding to VMs from an internal IP address, and internal TCP/UDP load balancers. INTERNAL_MANAGED is used for internal HTTP(S) load balancers. Default value: "EXTERNAL" Possible values: ["EXTERNAL", "INTERNAL", "INTERNAL_MANAGED"]
        :param network: For internal load balancing, this field identifies the network that the load balanced IP should belong to for this Forwarding Rule. If this field is not specified, the default network will be used. This field is only used for INTERNAL load balancing.
        :param network_tier: The networking tier used for configuring this address. If this field is not specified, it is assumed to be PREMIUM. Possible values: ["PREMIUM", "STANDARD"]
        :param port_range: This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy, TargetSslProxy, TargetTcpProxy, TargetVpnGateway, TargetPool, TargetInstance. Applicable only when IPProtocol is TCP, UDP, or SCTP, only packets addressed to ports in the specified range will be forwarded to target. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges. Some types of forwarding target have constraints on the acceptable ports: TargetHttpProxy: 80, 8080 TargetHttpsProxy: 443 TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 TargetVpnGateway: 500, 4500
        :param ports: This field is used along with the backend_service field for internal load balancing. When the load balancing scheme is INTERNAL, a single port or a comma separated list of ports can be configured. Only packets addressed to these ports will be forwarded to the backends configured with this forwarding rule. You may specify a maximum of up to 5 ports.
        :param project: 
        :param region: A reference to the region where the regional forwarding rule resides. This field is not applicable to global forwarding rules.
        :param service_label: An optional prefix to the service name for this Forwarding Rule. If specified, will be the first label of the fully qualified service name. The label must be 1-63 characters long, and comply with RFC1035. Specifically, the label must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash. This field is only used for INTERNAL load balancing.
        :param subnetwork: The subnetwork that the load balanced IP should belong to for this Forwarding Rule. This field is only used for INTERNAL load balancing. If the network specified is in auto subnet mode, this field is optional. However, if the network is in custom subnet mode, a subnetwork must be specified.
        :param target: The URL of the target resource to receive the matched traffic. The target must live in the same region as the forwarding rule. The forwarded traffic must be of a type appropriate to the target object.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeForwardingRuleTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if allow_global_access is not None: self._values["allow_global_access"] = allow_global_access
        if all_ports is not None: self._values["all_ports"] = all_ports
        if backend_service is not None: self._values["backend_service"] = backend_service
        if description is not None: self._values["description"] = description
        if ip_address is not None: self._values["ip_address"] = ip_address
        if ip_protocol is not None: self._values["ip_protocol"] = ip_protocol
        if ip_version is not None: self._values["ip_version"] = ip_version
        if load_balancing_scheme is not None: self._values["load_balancing_scheme"] = load_balancing_scheme
        if network is not None: self._values["network"] = network
        if network_tier is not None: self._values["network_tier"] = network_tier
        if port_range is not None: self._values["port_range"] = port_range
        if ports is not None: self._values["ports"] = ports
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if service_label is not None: self._values["service_label"] = service_label
        if subnetwork is not None: self._values["subnetwork"] = subnetwork
        if target is not None: self._values["target"] = target
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource;

        provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def allow_global_access(self) -> typing.Optional[bool]:
        """If true, clients can access ILB from all regions.

        Otherwise only allows from the local region the ILB is located at.
        """
        return self._values.get('allow_global_access')

    @builtins.property
    def all_ports(self) -> typing.Optional[bool]:
        """For internal TCP/UDP load balancing (i.e. load balancing scheme is INTERNAL and protocol is TCP/UDP), set this to true to allow packets addressed to any ports to be forwarded to the backends configured with this forwarding rule. Used with backend service. Cannot be set if port or portRange are set."""
        return self._values.get('all_ports')

    @builtins.property
    def backend_service(self) -> typing.Optional[str]:
        """A BackendService to receive the matched traffic.

        This is used only
        for INTERNAL load balancing.
        """
        return self._values.get('backend_service')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def ip_address(self) -> typing.Optional[str]:
        """The IP address that this forwarding rule is serving on behalf of.

        Addresses are restricted based on the forwarding rule's load balancing
        scheme (EXTERNAL or INTERNAL) and scope (global or regional).

        When the load balancing scheme is EXTERNAL, for global forwarding
        rules, the address must be a global IP, and for regional forwarding
        rules, the address must live in the same region as the forwarding
        rule. If this field is empty, an ephemeral IPv4 address from the same
        scope (global or regional) will be assigned. A regional forwarding
        rule supports IPv4 only. A global forwarding rule supports either IPv4
        or IPv6.

        When the load balancing scheme is INTERNAL, this can only be an RFC
        1918 IP address belonging to the network/subnet configured for the
        forwarding rule. By default, if this field is empty, an ephemeral
        internal IP address will be automatically allocated from the IP range
        of the subnet or network configured for this forwarding rule.

        An address must be specified by a literal IP address. ~> **NOTE:** While
        the API allows you to specify various resource paths for an address resource
        instead, Terraform requires this to specifically be an IP address to
        avoid needing to fetching the IP address from resource paths on refresh
        or unnecessary diffs.
        """
        return self._values.get('ip_address')

    @builtins.property
    def ip_protocol(self) -> typing.Optional[str]:
        """The IP protocol to which this rule applies.

        When the load balancing scheme is INTERNAL, only TCP and UDP are
        valid. Possible values: ["TCP", "UDP", "ESP", "AH", "SCTP", "ICMP"]
        """
        return self._values.get('ip_protocol')

    @builtins.property
    def ip_version(self) -> typing.Optional[str]:
        return self._values.get('ip_version')

    @builtins.property
    def load_balancing_scheme(self) -> typing.Optional[str]:
        """This signifies what the ForwardingRule will be used for and can be EXTERNAL, INTERNAL, or INTERNAL_MANAGED.

        EXTERNAL is used for Classic
        Cloud VPN gateways, protocol forwarding to VMs from an external IP address,
        and HTTP(S), SSL Proxy, TCP Proxy, and Network TCP/UDP load balancers.
        INTERNAL is used for protocol forwarding to VMs from an internal IP address,
        and internal TCP/UDP load balancers.
        INTERNAL_MANAGED is used for internal HTTP(S) load balancers. Default value: "EXTERNAL" Possible values: ["EXTERNAL", "INTERNAL", "INTERNAL_MANAGED"]
        """
        return self._values.get('load_balancing_scheme')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """For internal load balancing, this field identifies the network that the load balanced IP should belong to for this Forwarding Rule.

        If
        this field is not specified, the default network will be used.
        This field is only used for INTERNAL load balancing.
        """
        return self._values.get('network')

    @builtins.property
    def network_tier(self) -> typing.Optional[str]:
        """The networking tier used for configuring this address.

        If this field is not
        specified, it is assumed to be PREMIUM. Possible values: ["PREMIUM", "STANDARD"]
        """
        return self._values.get('network_tier')

    @builtins.property
    def port_range(self) -> typing.Optional[str]:
        """This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy, TargetSslProxy, TargetTcpProxy, TargetVpnGateway, TargetPool, TargetInstance.

        Applicable only when IPProtocol is TCP, UDP, or SCTP, only packets
        addressed to ports in the specified range will be forwarded to target.
        Forwarding rules with the same [IPAddress, IPProtocol] pair must have
        disjoint port ranges.

        Some types of forwarding target have constraints on the acceptable
        ports:

        TargetHttpProxy: 80, 8080
        TargetHttpsProxy: 443
        TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995,
        1883, 5222
        TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995,
        1883, 5222
        TargetVpnGateway: 500, 4500
        """
        return self._values.get('port_range')

    @builtins.property
    def ports(self) -> typing.Optional[typing.List[str]]:
        """This field is used along with the backend_service field for internal load balancing.

        When the load balancing scheme is INTERNAL, a single port or a comma
        separated list of ports can be configured. Only packets addressed to
        these ports will be forwarded to the backends configured with this
        forwarding rule.

        You may specify a maximum of up to 5 ports.
        """
        return self._values.get('ports')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """A reference to the region where the regional forwarding rule resides.

        This field is not applicable to global forwarding rules.
        """
        return self._values.get('region')

    @builtins.property
    def service_label(self) -> typing.Optional[str]:
        """An optional prefix to the service name for this Forwarding Rule.

        If specified, will be the first label of the fully qualified service
        name.

        The label must be 1-63 characters long, and comply with RFC1035.
        Specifically, the label must be 1-63 characters long and match the
        regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first
        character must be a lowercase letter, and all following characters
        must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.

        This field is only used for INTERNAL load balancing.
        """
        return self._values.get('service_label')

    @builtins.property
    def subnetwork(self) -> typing.Optional[str]:
        """The subnetwork that the load balanced IP should belong to for this Forwarding Rule.

        This field is only used for INTERNAL load balancing.

        If the network specified is in auto subnet mode, this field is
        optional. However, if the network is in custom subnet mode, a
        subnetwork must be specified.
        """
        return self._values.get('subnetwork')

    @builtins.property
    def target(self) -> typing.Optional[str]:
        """The URL of the target resource to receive the matched traffic.

        The target must live in the same region as the forwarding rule.
        The forwarded traffic must be of a type appropriate to the target
        object.
        """
        return self._values.get('target')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeForwardingRuleTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeForwardingRuleConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeForwardingRuleTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeForwardingRuleTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeForwardingRuleTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeGlobalAddress(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeGlobalAddress"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, address: typing.Optional[str]=None, address_type: typing.Optional[str]=None, description: typing.Optional[str]=None, ip_version: typing.Optional[str]=None, network: typing.Optional[str]=None, prefix_length: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, purpose: typing.Optional[str]=None, timeouts: typing.Optional["ComputeGlobalAddressTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param address: The IP address or beginning of the address range represented by this resource. This can be supplied as an input to reserve a specific address or omitted to allow GCP to choose a valid one for you.
        :param address_type: The type of the address to reserve. EXTERNAL indicates public/external single IP address. INTERNAL indicates internal IP ranges belonging to some network. Default value: "EXTERNAL" Possible values: ["EXTERNAL", "INTERNAL"]
        :param description: An optional description of this resource.
        :param ip_version: The IP Version that will be used by this address. The default value is 'IPV4'. Possible values: ["IPV4", "IPV6"]
        :param network: The URL of the network in which to reserve the IP range. The IP range must be in RFC1918 space. The network cannot be deleted if there are any reserved IP ranges referring to it. This should only be set when using an Internal address.
        :param prefix_length: The prefix length of the IP range. If not present, it means the address field is a single IP address. This field is not applicable to addresses with addressType=EXTERNAL.
        :param project: 
        :param purpose: The purpose of the resource. For global internal addresses it can be. VPC_PEERING - for peer networks This should only be set when using an Internal address. Possible values: ["VPC_PEERING"]
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeGlobalAddressConfig(name=name, address=address, address_type=address_type, description=description, ip_version=ip_version, network=network, prefix_length=prefix_length, project=project, purpose=purpose, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeGlobalAddress, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="address")
    def address(self) -> typing.Optional[str]:
        return jsii.get(self, "address")

    @address.setter
    def address(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "address", value)

    @builtins.property
    @jsii.member(jsii_name="addressType")
    def address_type(self) -> typing.Optional[str]:
        return jsii.get(self, "addressType")

    @address_type.setter
    def address_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "addressType", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="ipVersion")
    def ip_version(self) -> typing.Optional[str]:
        return jsii.get(self, "ipVersion")

    @ip_version.setter
    def ip_version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "ipVersion", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> typing.Optional[str]:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="prefixLength")
    def prefix_length(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "prefixLength")

    @prefix_length.setter
    def prefix_length(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "prefixLength", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="purpose")
    def purpose(self) -> typing.Optional[str]:
        return jsii.get(self, "purpose")

    @purpose.setter
    def purpose(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "purpose", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeGlobalAddressTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeGlobalAddressTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeGlobalAddressConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'address': 'address', 'address_type': 'addressType', 'description': 'description', 'ip_version': 'ipVersion', 'network': 'network', 'prefix_length': 'prefixLength', 'project': 'project', 'purpose': 'purpose', 'timeouts': 'timeouts'})
class ComputeGlobalAddressConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, address: typing.Optional[str]=None, address_type: typing.Optional[str]=None, description: typing.Optional[str]=None, ip_version: typing.Optional[str]=None, network: typing.Optional[str]=None, prefix_length: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, purpose: typing.Optional[str]=None, timeouts: typing.Optional["ComputeGlobalAddressTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param address: The IP address or beginning of the address range represented by this resource. This can be supplied as an input to reserve a specific address or omitted to allow GCP to choose a valid one for you.
        :param address_type: The type of the address to reserve. EXTERNAL indicates public/external single IP address. INTERNAL indicates internal IP ranges belonging to some network. Default value: "EXTERNAL" Possible values: ["EXTERNAL", "INTERNAL"]
        :param description: An optional description of this resource.
        :param ip_version: The IP Version that will be used by this address. The default value is 'IPV4'. Possible values: ["IPV4", "IPV6"]
        :param network: The URL of the network in which to reserve the IP range. The IP range must be in RFC1918 space. The network cannot be deleted if there are any reserved IP ranges referring to it. This should only be set when using an Internal address.
        :param prefix_length: The prefix length of the IP range. If not present, it means the address field is a single IP address. This field is not applicable to addresses with addressType=EXTERNAL.
        :param project: 
        :param purpose: The purpose of the resource. For global internal addresses it can be. VPC_PEERING - for peer networks This should only be set when using an Internal address. Possible values: ["VPC_PEERING"]
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeGlobalAddressTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if address is not None: self._values["address"] = address
        if address_type is not None: self._values["address_type"] = address_type
        if description is not None: self._values["description"] = description
        if ip_version is not None: self._values["ip_version"] = ip_version
        if network is not None: self._values["network"] = network
        if prefix_length is not None: self._values["prefix_length"] = prefix_length
        if project is not None: self._values["project"] = project
        if purpose is not None: self._values["purpose"] = purpose
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035.  Specifically, the name must be 1-63 characters long and
        match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means
        the first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def address(self) -> typing.Optional[str]:
        """The IP address or beginning of the address range represented by this resource.

        This can be supplied as an input to reserve a specific
        address or omitted to allow GCP to choose a valid one for you.
        """
        return self._values.get('address')

    @builtins.property
    def address_type(self) -> typing.Optional[str]:
        """The type of the address to reserve.

        EXTERNAL indicates public/external single IP address.
        INTERNAL indicates internal IP ranges belonging to some network. Default value: "EXTERNAL" Possible values: ["EXTERNAL", "INTERNAL"]
        """
        return self._values.get('address_type')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def ip_version(self) -> typing.Optional[str]:
        """The IP Version that will be used by this address.

        The default value is 'IPV4'. Possible values: ["IPV4", "IPV6"]
        """
        return self._values.get('ip_version')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """The URL of the network in which to reserve the IP range.

        The IP range
        must be in RFC1918 space. The network cannot be deleted if there are
        any reserved IP ranges referring to it.

        This should only be set when using an Internal address.
        """
        return self._values.get('network')

    @builtins.property
    def prefix_length(self) -> typing.Optional[jsii.Number]:
        """The prefix length of the IP range. If not present, it means the address field is a single IP address.

        This field is not applicable to addresses with addressType=EXTERNAL.
        """
        return self._values.get('prefix_length')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def purpose(self) -> typing.Optional[str]:
        """The purpose of the resource. For global internal addresses it can be.

        VPC_PEERING - for peer networks

        This should only be set when using an Internal address. Possible values: ["VPC_PEERING"]
        """
        return self._values.get('purpose')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeGlobalAddressTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeGlobalAddressConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeGlobalAddressTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeGlobalAddressTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeGlobalAddressTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeGlobalForwardingRule(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeGlobalForwardingRule"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, target: str, description: typing.Optional[str]=None, ip_address: typing.Optional[str]=None, ip_protocol: typing.Optional[str]=None, ip_version: typing.Optional[str]=None, load_balancing_scheme: typing.Optional[str]=None, metadata_filters: typing.Optional[typing.List["ComputeGlobalForwardingRuleMetadataFilters"]]=None, port_range: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeGlobalForwardingRuleTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param target: The URL of the target resource to receive the matched traffic. The forwarded traffic must be of a type appropriate to the target object. For INTERNAL_SELF_MANAGED load balancing, only HTTP and HTTPS targets are valid.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param ip_address: The IP address that this forwarding rule is serving on behalf of. Addresses are restricted based on the forwarding rule's load balancing scheme (EXTERNAL or INTERNAL) and scope (global or regional). When the load balancing scheme is EXTERNAL, for global forwarding rules, the address must be a global IP, and for regional forwarding rules, the address must live in the same region as the forwarding rule. If this field is empty, an ephemeral IPv4 address from the same scope (global or regional) will be assigned. A regional forwarding rule supports IPv4 only. A global forwarding rule supports either IPv4 or IPv6. When the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnet configured for the forwarding rule. By default, if this field is empty, an ephemeral internal IP address will be automatically allocated from the IP range of the subnet or network configured for this forwarding rule. An address must be specified by a literal IP address. ~> **NOTE**: While the API allows you to specify various resource paths for an address resource instead, Terraform requires this to specifically be an IP address to avoid needing to fetching the IP address from resource paths on refresh or unnecessary diffs.
        :param ip_protocol: The IP protocol to which this rule applies. When the load balancing scheme is INTERNAL_SELF_MANAGED, only TCP is valid. Possible values: ["TCP", "UDP", "ESP", "AH", "SCTP", "ICMP"]
        :param ip_version: The IP Version that will be used by this global forwarding rule. Possible values: ["IPV4", "IPV6"]
        :param load_balancing_scheme: This signifies what the GlobalForwardingRule will be used for. The value of INTERNAL_SELF_MANAGED means that this will be used for Internal Global HTTP(S) LB. The value of EXTERNAL means that this will be used for External Global Load Balancing (HTTP(S) LB, External TCP/UDP LB, SSL Proxy) NOTE: Currently global forwarding rules cannot be used for INTERNAL load balancing. Default value: "EXTERNAL" Possible values: ["EXTERNAL", "INTERNAL_SELF_MANAGED"]
        :param metadata_filters: metadata_filters block.
        :param port_range: This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy, TargetSslProxy, TargetTcpProxy, TargetVpnGateway, TargetPool, TargetInstance. Applicable only when IPProtocol is TCP, UDP, or SCTP, only packets addressed to ports in the specified range will be forwarded to target. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges. Some types of forwarding target have constraints on the acceptable ports: TargetHttpProxy: 80, 8080 TargetHttpsProxy: 443 TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 TargetVpnGateway: 500, 4500
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeGlobalForwardingRuleConfig(name=name, target=target, description=description, ip_address=ip_address, ip_protocol=ip_protocol, ip_version=ip_version, load_balancing_scheme=load_balancing_scheme, metadata_filters=metadata_filters, port_range=port_range, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeGlobalForwardingRule, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="target")
    def target(self) -> str:
        return jsii.get(self, "target")

    @target.setter
    def target(self, value: str) -> None:
        jsii.set(self, "target", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> typing.Optional[str]:
        return jsii.get(self, "ipAddress")

    @ip_address.setter
    def ip_address(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "ipAddress", value)

    @builtins.property
    @jsii.member(jsii_name="ipProtocol")
    def ip_protocol(self) -> typing.Optional[str]:
        return jsii.get(self, "ipProtocol")

    @ip_protocol.setter
    def ip_protocol(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "ipProtocol", value)

    @builtins.property
    @jsii.member(jsii_name="ipVersion")
    def ip_version(self) -> typing.Optional[str]:
        return jsii.get(self, "ipVersion")

    @ip_version.setter
    def ip_version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "ipVersion", value)

    @builtins.property
    @jsii.member(jsii_name="loadBalancingScheme")
    def load_balancing_scheme(self) -> typing.Optional[str]:
        return jsii.get(self, "loadBalancingScheme")

    @load_balancing_scheme.setter
    def load_balancing_scheme(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "loadBalancingScheme", value)

    @builtins.property
    @jsii.member(jsii_name="metadataFilters")
    def metadata_filters(self) -> typing.Optional[typing.List["ComputeGlobalForwardingRuleMetadataFilters"]]:
        return jsii.get(self, "metadataFilters")

    @metadata_filters.setter
    def metadata_filters(self, value: typing.Optional[typing.List["ComputeGlobalForwardingRuleMetadataFilters"]]) -> None:
        jsii.set(self, "metadataFilters", value)

    @builtins.property
    @jsii.member(jsii_name="portRange")
    def port_range(self) -> typing.Optional[str]:
        return jsii.get(self, "portRange")

    @port_range.setter
    def port_range(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "portRange", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeGlobalForwardingRuleTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeGlobalForwardingRuleTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeGlobalForwardingRuleConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'target': 'target', 'description': 'description', 'ip_address': 'ipAddress', 'ip_protocol': 'ipProtocol', 'ip_version': 'ipVersion', 'load_balancing_scheme': 'loadBalancingScheme', 'metadata_filters': 'metadataFilters', 'port_range': 'portRange', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeGlobalForwardingRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, target: str, description: typing.Optional[str]=None, ip_address: typing.Optional[str]=None, ip_protocol: typing.Optional[str]=None, ip_version: typing.Optional[str]=None, load_balancing_scheme: typing.Optional[str]=None, metadata_filters: typing.Optional[typing.List["ComputeGlobalForwardingRuleMetadataFilters"]]=None, port_range: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeGlobalForwardingRuleTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param target: The URL of the target resource to receive the matched traffic. The forwarded traffic must be of a type appropriate to the target object. For INTERNAL_SELF_MANAGED load balancing, only HTTP and HTTPS targets are valid.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param ip_address: The IP address that this forwarding rule is serving on behalf of. Addresses are restricted based on the forwarding rule's load balancing scheme (EXTERNAL or INTERNAL) and scope (global or regional). When the load balancing scheme is EXTERNAL, for global forwarding rules, the address must be a global IP, and for regional forwarding rules, the address must live in the same region as the forwarding rule. If this field is empty, an ephemeral IPv4 address from the same scope (global or regional) will be assigned. A regional forwarding rule supports IPv4 only. A global forwarding rule supports either IPv4 or IPv6. When the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnet configured for the forwarding rule. By default, if this field is empty, an ephemeral internal IP address will be automatically allocated from the IP range of the subnet or network configured for this forwarding rule. An address must be specified by a literal IP address. ~> **NOTE**: While the API allows you to specify various resource paths for an address resource instead, Terraform requires this to specifically be an IP address to avoid needing to fetching the IP address from resource paths on refresh or unnecessary diffs.
        :param ip_protocol: The IP protocol to which this rule applies. When the load balancing scheme is INTERNAL_SELF_MANAGED, only TCP is valid. Possible values: ["TCP", "UDP", "ESP", "AH", "SCTP", "ICMP"]
        :param ip_version: The IP Version that will be used by this global forwarding rule. Possible values: ["IPV4", "IPV6"]
        :param load_balancing_scheme: This signifies what the GlobalForwardingRule will be used for. The value of INTERNAL_SELF_MANAGED means that this will be used for Internal Global HTTP(S) LB. The value of EXTERNAL means that this will be used for External Global Load Balancing (HTTP(S) LB, External TCP/UDP LB, SSL Proxy) NOTE: Currently global forwarding rules cannot be used for INTERNAL load balancing. Default value: "EXTERNAL" Possible values: ["EXTERNAL", "INTERNAL_SELF_MANAGED"]
        :param metadata_filters: metadata_filters block.
        :param port_range: This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy, TargetSslProxy, TargetTcpProxy, TargetVpnGateway, TargetPool, TargetInstance. Applicable only when IPProtocol is TCP, UDP, or SCTP, only packets addressed to ports in the specified range will be forwarded to target. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges. Some types of forwarding target have constraints on the acceptable ports: TargetHttpProxy: 80, 8080 TargetHttpsProxy: 443 TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 TargetVpnGateway: 500, 4500
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeGlobalForwardingRuleTimeouts(**timeouts)
        self._values = {
            'name': name,
            'target': target,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if ip_address is not None: self._values["ip_address"] = ip_address
        if ip_protocol is not None: self._values["ip_protocol"] = ip_protocol
        if ip_version is not None: self._values["ip_version"] = ip_version
        if load_balancing_scheme is not None: self._values["load_balancing_scheme"] = load_balancing_scheme
        if metadata_filters is not None: self._values["metadata_filters"] = metadata_filters
        if port_range is not None: self._values["port_range"] = port_range
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource;

        provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def target(self) -> str:
        """The URL of the target resource to receive the matched traffic.

        The forwarded traffic must be of a type appropriate to the target object.
        For INTERNAL_SELF_MANAGED load balancing, only HTTP and HTTPS targets
        are valid.
        """
        return self._values.get('target')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def ip_address(self) -> typing.Optional[str]:
        """The IP address that this forwarding rule is serving on behalf of.

        Addresses are restricted based on the forwarding rule's load balancing
        scheme (EXTERNAL or INTERNAL) and scope (global or regional).

        When the load balancing scheme is EXTERNAL, for global forwarding
        rules, the address must be a global IP, and for regional forwarding
        rules, the address must live in the same region as the forwarding
        rule. If this field is empty, an ephemeral IPv4 address from the same
        scope (global or regional) will be assigned. A regional forwarding
        rule supports IPv4 only. A global forwarding rule supports either IPv4
        or IPv6.

        When the load balancing scheme is INTERNAL, this can only be an RFC
        1918 IP address belonging to the network/subnet configured for the
        forwarding rule. By default, if this field is empty, an ephemeral
        internal IP address will be automatically allocated from the IP range
        of the subnet or network configured for this forwarding rule.

        An address must be specified by a literal IP address. ~> **NOTE**: While
        the API allows you to specify various resource paths for an address resource
        instead, Terraform requires this to specifically be an IP address to
        avoid needing to fetching the IP address from resource paths on refresh
        or unnecessary diffs.
        """
        return self._values.get('ip_address')

    @builtins.property
    def ip_protocol(self) -> typing.Optional[str]:
        """The IP protocol to which this rule applies.

        When the load balancing scheme is
        INTERNAL_SELF_MANAGED, only TCP is valid. Possible values: ["TCP", "UDP", "ESP", "AH", "SCTP", "ICMP"]
        """
        return self._values.get('ip_protocol')

    @builtins.property
    def ip_version(self) -> typing.Optional[str]:
        """The IP Version that will be used by this global forwarding rule.

        Possible values: ["IPV4", "IPV6"]
        """
        return self._values.get('ip_version')

    @builtins.property
    def load_balancing_scheme(self) -> typing.Optional[str]:
        """This signifies what the GlobalForwardingRule will be used for.

        The value of INTERNAL_SELF_MANAGED means that this will be used for
        Internal Global HTTP(S) LB. The value of EXTERNAL means that this
        will be used for External Global Load Balancing (HTTP(S) LB,
        External TCP/UDP LB, SSL Proxy)

        NOTE: Currently global forwarding rules cannot be used for INTERNAL
        load balancing. Default value: "EXTERNAL" Possible values: ["EXTERNAL", "INTERNAL_SELF_MANAGED"]
        """
        return self._values.get('load_balancing_scheme')

    @builtins.property
    def metadata_filters(self) -> typing.Optional[typing.List["ComputeGlobalForwardingRuleMetadataFilters"]]:
        """metadata_filters block."""
        return self._values.get('metadata_filters')

    @builtins.property
    def port_range(self) -> typing.Optional[str]:
        """This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy, TargetSslProxy, TargetTcpProxy, TargetVpnGateway, TargetPool, TargetInstance.

        Applicable only when IPProtocol is TCP, UDP, or SCTP, only packets
        addressed to ports in the specified range will be forwarded to target.
        Forwarding rules with the same [IPAddress, IPProtocol] pair must have
        disjoint port ranges.

        Some types of forwarding target have constraints on the acceptable
        ports:

        TargetHttpProxy: 80, 8080
        TargetHttpsProxy: 443
        TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995,
        1883, 5222
        TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995,
        1883, 5222
        TargetVpnGateway: 500, 4500
        """
        return self._values.get('port_range')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeGlobalForwardingRuleTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeGlobalForwardingRuleConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeGlobalForwardingRuleMetadataFilters", jsii_struct_bases=[], name_mapping={'filter_labels': 'filterLabels', 'filter_match_criteria': 'filterMatchCriteria'})
class ComputeGlobalForwardingRuleMetadataFilters():
    def __init__(self, *, filter_labels: typing.List["ComputeGlobalForwardingRuleMetadataFiltersFilterLabels"], filter_match_criteria: str) -> None:
        """
        :param filter_labels: filter_labels block.
        :param filter_match_criteria: Specifies how individual filterLabel matches within the list of filterLabels contribute towards the overall metadataFilter match. MATCH_ANY - At least one of the filterLabels must have a matching label in the provided metadata. MATCH_ALL - All filterLabels must have matching labels in the provided metadata. Possible values: ["MATCH_ANY", "MATCH_ALL"]
        """
        self._values = {
            'filter_labels': filter_labels,
            'filter_match_criteria': filter_match_criteria,
        }

    @builtins.property
    def filter_labels(self) -> typing.List["ComputeGlobalForwardingRuleMetadataFiltersFilterLabels"]:
        """filter_labels block."""
        return self._values.get('filter_labels')

    @builtins.property
    def filter_match_criteria(self) -> str:
        """Specifies how individual filterLabel matches within the list of filterLabels contribute towards the overall metadataFilter match.

        MATCH_ANY - At least one of the filterLabels must have a matching
        label in the provided metadata.
        MATCH_ALL - All filterLabels must have matching labels in the
        provided metadata. Possible values: ["MATCH_ANY", "MATCH_ALL"]
        """
        return self._values.get('filter_match_criteria')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeGlobalForwardingRuleMetadataFilters(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeGlobalForwardingRuleMetadataFiltersFilterLabels", jsii_struct_bases=[], name_mapping={'name': 'name', 'value': 'value'})
class ComputeGlobalForwardingRuleMetadataFiltersFilterLabels():
    def __init__(self, *, name: str, value: str) -> None:
        """
        :param name: Name of the metadata label. The length must be between 1 and 1024 characters, inclusive.
        :param value: The value that the label must match. The value has a maximum length of 1024 characters.
        """
        self._values = {
            'name': name,
            'value': value,
        }

    @builtins.property
    def name(self) -> str:
        """Name of the metadata label.

        The length must be between
        1 and 1024 characters, inclusive.
        """
        return self._values.get('name')

    @builtins.property
    def value(self) -> str:
        """The value that the label must match.

        The value has a maximum
        length of 1024 characters.
        """
        return self._values.get('value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeGlobalForwardingRuleMetadataFiltersFilterLabels(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeGlobalForwardingRuleTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeGlobalForwardingRuleTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeGlobalForwardingRuleTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeGlobalNetworkEndpoint(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeGlobalNetworkEndpoint"):
    def __init__(self, scope: constructs.Construct, id: str, *, global_network_endpoint_group: str, port: jsii.Number, fqdn: typing.Optional[str]=None, ip_address: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeGlobalNetworkEndpointTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param global_network_endpoint_group: The global network endpoint group this endpoint is part of.
        :param port: Port number of the external endpoint.
        :param fqdn: Fully qualified domain name of network endpoint. This can only be specified when network_endpoint_type of the NEG is INTERNET_FQDN_PORT.
        :param ip_address: IPv4 address external endpoint.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeGlobalNetworkEndpointConfig(global_network_endpoint_group=global_network_endpoint_group, port=port, fqdn=fqdn, ip_address=ip_address, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeGlobalNetworkEndpoint, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="globalNetworkEndpointGroup")
    def global_network_endpoint_group(self) -> str:
        return jsii.get(self, "globalNetworkEndpointGroup")

    @global_network_endpoint_group.setter
    def global_network_endpoint_group(self, value: str) -> None:
        jsii.set(self, "globalNetworkEndpointGroup", value)

    @builtins.property
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")

    @port.setter
    def port(self, value: jsii.Number) -> None:
        jsii.set(self, "port", value)

    @builtins.property
    @jsii.member(jsii_name="fqdn")
    def fqdn(self) -> typing.Optional[str]:
        return jsii.get(self, "fqdn")

    @fqdn.setter
    def fqdn(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "fqdn", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> typing.Optional[str]:
        return jsii.get(self, "ipAddress")

    @ip_address.setter
    def ip_address(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "ipAddress", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeGlobalNetworkEndpointTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeGlobalNetworkEndpointTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeGlobalNetworkEndpointConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'global_network_endpoint_group': 'globalNetworkEndpointGroup', 'port': 'port', 'fqdn': 'fqdn', 'ip_address': 'ipAddress', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeGlobalNetworkEndpointConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, global_network_endpoint_group: str, port: jsii.Number, fqdn: typing.Optional[str]=None, ip_address: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeGlobalNetworkEndpointTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param global_network_endpoint_group: The global network endpoint group this endpoint is part of.
        :param port: Port number of the external endpoint.
        :param fqdn: Fully qualified domain name of network endpoint. This can only be specified when network_endpoint_type of the NEG is INTERNET_FQDN_PORT.
        :param ip_address: IPv4 address external endpoint.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeGlobalNetworkEndpointTimeouts(**timeouts)
        self._values = {
            'global_network_endpoint_group': global_network_endpoint_group,
            'port': port,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if fqdn is not None: self._values["fqdn"] = fqdn
        if ip_address is not None: self._values["ip_address"] = ip_address
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def global_network_endpoint_group(self) -> str:
        """The global network endpoint group this endpoint is part of."""
        return self._values.get('global_network_endpoint_group')

    @builtins.property
    def port(self) -> jsii.Number:
        """Port number of the external endpoint."""
        return self._values.get('port')

    @builtins.property
    def fqdn(self) -> typing.Optional[str]:
        """Fully qualified domain name of network endpoint.

        This can only be specified when network_endpoint_type of the NEG is INTERNET_FQDN_PORT.
        """
        return self._values.get('fqdn')

    @builtins.property
    def ip_address(self) -> typing.Optional[str]:
        """IPv4 address external endpoint."""
        return self._values.get('ip_address')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeGlobalNetworkEndpointTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeGlobalNetworkEndpointConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeGlobalNetworkEndpointGroup(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeGlobalNetworkEndpointGroup"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, network_endpoint_type: str, default_port: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeGlobalNetworkEndpointGroupTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network_endpoint_type: Type of network endpoints in this network endpoint group. Possible values: ["INTERNET_IP_PORT", "INTERNET_FQDN_PORT"]
        :param default_port: The default port used if the port number is not specified in the network endpoint.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeGlobalNetworkEndpointGroupConfig(name=name, network_endpoint_type=network_endpoint_type, default_port=default_port, description=description, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeGlobalNetworkEndpointGroup, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="networkEndpointType")
    def network_endpoint_type(self) -> str:
        return jsii.get(self, "networkEndpointType")

    @network_endpoint_type.setter
    def network_endpoint_type(self, value: str) -> None:
        jsii.set(self, "networkEndpointType", value)

    @builtins.property
    @jsii.member(jsii_name="defaultPort")
    def default_port(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "defaultPort")

    @default_port.setter
    def default_port(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "defaultPort", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeGlobalNetworkEndpointGroupTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeGlobalNetworkEndpointGroupTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeGlobalNetworkEndpointGroupConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'network_endpoint_type': 'networkEndpointType', 'default_port': 'defaultPort', 'description': 'description', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeGlobalNetworkEndpointGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, network_endpoint_type: str, default_port: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeGlobalNetworkEndpointGroupTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network_endpoint_type: Type of network endpoints in this network endpoint group. Possible values: ["INTERNET_IP_PORT", "INTERNET_FQDN_PORT"]
        :param default_port: The default port used if the port number is not specified in the network endpoint.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeGlobalNetworkEndpointGroupTimeouts(**timeouts)
        self._values = {
            'name': name,
            'network_endpoint_type': network_endpoint_type,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if default_port is not None: self._values["default_port"] = default_port
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource;

        provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def network_endpoint_type(self) -> str:
        """Type of network endpoints in this network endpoint group.

        Possible values: ["INTERNET_IP_PORT", "INTERNET_FQDN_PORT"]
        """
        return self._values.get('network_endpoint_type')

    @builtins.property
    def default_port(self) -> typing.Optional[jsii.Number]:
        """The default port used if the port number is not specified in the network endpoint."""
        return self._values.get('default_port')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeGlobalNetworkEndpointGroupTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeGlobalNetworkEndpointGroupConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeGlobalNetworkEndpointGroupTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeGlobalNetworkEndpointGroupTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeGlobalNetworkEndpointGroupTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeGlobalNetworkEndpointTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeGlobalNetworkEndpointTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeGlobalNetworkEndpointTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeHealthCheck(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeHealthCheck"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, check_interval_sec: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, healthy_threshold: typing.Optional[jsii.Number]=None, http2_health_check: typing.Optional[typing.List["ComputeHealthCheckHttp2HealthCheck"]]=None, http_health_check: typing.Optional[typing.List["ComputeHealthCheckHttpHealthCheck"]]=None, https_health_check: typing.Optional[typing.List["ComputeHealthCheckHttpsHealthCheck"]]=None, project: typing.Optional[str]=None, ssl_health_check: typing.Optional[typing.List["ComputeHealthCheckSslHealthCheck"]]=None, tcp_health_check: typing.Optional[typing.List["ComputeHealthCheckTcpHealthCheck"]]=None, timeouts: typing.Optional["ComputeHealthCheckTimeouts"]=None, timeout_sec: typing.Optional[jsii.Number]=None, unhealthy_threshold: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param check_interval_sec: How often (in seconds) to send a health check. The default value is 5 seconds.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param healthy_threshold: A so-far unhealthy instance will be marked healthy after this many consecutive successes. The default value is 2.
        :param http2_health_check: http2_health_check block.
        :param http_health_check: http_health_check block.
        :param https_health_check: https_health_check block.
        :param project: 
        :param ssl_health_check: ssl_health_check block.
        :param tcp_health_check: tcp_health_check block.
        :param timeouts: timeouts block.
        :param timeout_sec: How long (in seconds) to wait before claiming failure. The default value is 5 seconds. It is invalid for timeoutSec to have greater value than checkIntervalSec.
        :param unhealthy_threshold: A so-far healthy instance will be marked unhealthy after this many consecutive failures. The default value is 2.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeHealthCheckConfig(name=name, check_interval_sec=check_interval_sec, description=description, healthy_threshold=healthy_threshold, http2_health_check=http2_health_check, http_health_check=http_health_check, https_health_check=https_health_check, project=project, ssl_health_check=ssl_health_check, tcp_health_check=tcp_health_check, timeouts=timeouts, timeout_sec=timeout_sec, unhealthy_threshold=unhealthy_threshold, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeHealthCheck, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="checkIntervalSec")
    def check_interval_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "checkIntervalSec")

    @check_interval_sec.setter
    def check_interval_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "checkIntervalSec", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="healthyThreshold")
    def healthy_threshold(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "healthyThreshold")

    @healthy_threshold.setter
    def healthy_threshold(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "healthyThreshold", value)

    @builtins.property
    @jsii.member(jsii_name="http2HealthCheck")
    def http2_health_check(self) -> typing.Optional[typing.List["ComputeHealthCheckHttp2HealthCheck"]]:
        return jsii.get(self, "http2HealthCheck")

    @http2_health_check.setter
    def http2_health_check(self, value: typing.Optional[typing.List["ComputeHealthCheckHttp2HealthCheck"]]) -> None:
        jsii.set(self, "http2HealthCheck", value)

    @builtins.property
    @jsii.member(jsii_name="httpHealthCheck")
    def http_health_check(self) -> typing.Optional[typing.List["ComputeHealthCheckHttpHealthCheck"]]:
        return jsii.get(self, "httpHealthCheck")

    @http_health_check.setter
    def http_health_check(self, value: typing.Optional[typing.List["ComputeHealthCheckHttpHealthCheck"]]) -> None:
        jsii.set(self, "httpHealthCheck", value)

    @builtins.property
    @jsii.member(jsii_name="httpsHealthCheck")
    def https_health_check(self) -> typing.Optional[typing.List["ComputeHealthCheckHttpsHealthCheck"]]:
        return jsii.get(self, "httpsHealthCheck")

    @https_health_check.setter
    def https_health_check(self, value: typing.Optional[typing.List["ComputeHealthCheckHttpsHealthCheck"]]) -> None:
        jsii.set(self, "httpsHealthCheck", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="sslHealthCheck")
    def ssl_health_check(self) -> typing.Optional[typing.List["ComputeHealthCheckSslHealthCheck"]]:
        return jsii.get(self, "sslHealthCheck")

    @ssl_health_check.setter
    def ssl_health_check(self, value: typing.Optional[typing.List["ComputeHealthCheckSslHealthCheck"]]) -> None:
        jsii.set(self, "sslHealthCheck", value)

    @builtins.property
    @jsii.member(jsii_name="tcpHealthCheck")
    def tcp_health_check(self) -> typing.Optional[typing.List["ComputeHealthCheckTcpHealthCheck"]]:
        return jsii.get(self, "tcpHealthCheck")

    @tcp_health_check.setter
    def tcp_health_check(self, value: typing.Optional[typing.List["ComputeHealthCheckTcpHealthCheck"]]) -> None:
        jsii.set(self, "tcpHealthCheck", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeHealthCheckTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeHealthCheckTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="timeoutSec")
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "timeoutSec")

    @timeout_sec.setter
    def timeout_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "timeoutSec", value)

    @builtins.property
    @jsii.member(jsii_name="unhealthyThreshold")
    def unhealthy_threshold(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "unhealthyThreshold")

    @unhealthy_threshold.setter
    def unhealthy_threshold(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "unhealthyThreshold", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeHealthCheckConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'check_interval_sec': 'checkIntervalSec', 'description': 'description', 'healthy_threshold': 'healthyThreshold', 'http2_health_check': 'http2HealthCheck', 'http_health_check': 'httpHealthCheck', 'https_health_check': 'httpsHealthCheck', 'project': 'project', 'ssl_health_check': 'sslHealthCheck', 'tcp_health_check': 'tcpHealthCheck', 'timeouts': 'timeouts', 'timeout_sec': 'timeoutSec', 'unhealthy_threshold': 'unhealthyThreshold'})
class ComputeHealthCheckConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, check_interval_sec: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, healthy_threshold: typing.Optional[jsii.Number]=None, http2_health_check: typing.Optional[typing.List["ComputeHealthCheckHttp2HealthCheck"]]=None, http_health_check: typing.Optional[typing.List["ComputeHealthCheckHttpHealthCheck"]]=None, https_health_check: typing.Optional[typing.List["ComputeHealthCheckHttpsHealthCheck"]]=None, project: typing.Optional[str]=None, ssl_health_check: typing.Optional[typing.List["ComputeHealthCheckSslHealthCheck"]]=None, tcp_health_check: typing.Optional[typing.List["ComputeHealthCheckTcpHealthCheck"]]=None, timeouts: typing.Optional["ComputeHealthCheckTimeouts"]=None, timeout_sec: typing.Optional[jsii.Number]=None, unhealthy_threshold: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param check_interval_sec: How often (in seconds) to send a health check. The default value is 5 seconds.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param healthy_threshold: A so-far unhealthy instance will be marked healthy after this many consecutive successes. The default value is 2.
        :param http2_health_check: http2_health_check block.
        :param http_health_check: http_health_check block.
        :param https_health_check: https_health_check block.
        :param project: 
        :param ssl_health_check: ssl_health_check block.
        :param tcp_health_check: tcp_health_check block.
        :param timeouts: timeouts block.
        :param timeout_sec: How long (in seconds) to wait before claiming failure. The default value is 5 seconds. It is invalid for timeoutSec to have greater value than checkIntervalSec.
        :param unhealthy_threshold: A so-far healthy instance will be marked unhealthy after this many consecutive failures. The default value is 2.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeHealthCheckTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if check_interval_sec is not None: self._values["check_interval_sec"] = check_interval_sec
        if description is not None: self._values["description"] = description
        if healthy_threshold is not None: self._values["healthy_threshold"] = healthy_threshold
        if http2_health_check is not None: self._values["http2_health_check"] = http2_health_check
        if http_health_check is not None: self._values["http_health_check"] = http_health_check
        if https_health_check is not None: self._values["https_health_check"] = https_health_check
        if project is not None: self._values["project"] = project
        if ssl_health_check is not None: self._values["ssl_health_check"] = ssl_health_check
        if tcp_health_check is not None: self._values["tcp_health_check"] = tcp_health_check
        if timeouts is not None: self._values["timeouts"] = timeouts
        if timeout_sec is not None: self._values["timeout_sec"] = timeout_sec
        if unhealthy_threshold is not None: self._values["unhealthy_threshold"] = unhealthy_threshold

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035.  Specifically, the name must be 1-63 characters long and
        match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means
        the first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the
        last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def check_interval_sec(self) -> typing.Optional[jsii.Number]:
        """How often (in seconds) to send a health check.

        The default value is 5
        seconds.
        """
        return self._values.get('check_interval_sec')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def healthy_threshold(self) -> typing.Optional[jsii.Number]:
        """A so-far unhealthy instance will be marked healthy after this many consecutive successes.

        The default value is 2.
        """
        return self._values.get('healthy_threshold')

    @builtins.property
    def http2_health_check(self) -> typing.Optional[typing.List["ComputeHealthCheckHttp2HealthCheck"]]:
        """http2_health_check block."""
        return self._values.get('http2_health_check')

    @builtins.property
    def http_health_check(self) -> typing.Optional[typing.List["ComputeHealthCheckHttpHealthCheck"]]:
        """http_health_check block."""
        return self._values.get('http_health_check')

    @builtins.property
    def https_health_check(self) -> typing.Optional[typing.List["ComputeHealthCheckHttpsHealthCheck"]]:
        """https_health_check block."""
        return self._values.get('https_health_check')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def ssl_health_check(self) -> typing.Optional[typing.List["ComputeHealthCheckSslHealthCheck"]]:
        """ssl_health_check block."""
        return self._values.get('ssl_health_check')

    @builtins.property
    def tcp_health_check(self) -> typing.Optional[typing.List["ComputeHealthCheckTcpHealthCheck"]]:
        """tcp_health_check block."""
        return self._values.get('tcp_health_check')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeHealthCheckTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        """How long (in seconds) to wait before claiming failure.

        The default value is 5 seconds.  It is invalid for timeoutSec to have
        greater value than checkIntervalSec.
        """
        return self._values.get('timeout_sec')

    @builtins.property
    def unhealthy_threshold(self) -> typing.Optional[jsii.Number]:
        """A so-far healthy instance will be marked unhealthy after this many consecutive failures.

        The default value is 2.
        """
        return self._values.get('unhealthy_threshold')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeHealthCheckConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeHealthCheckHttp2HealthCheck", jsii_struct_bases=[], name_mapping={'host': 'host', 'port': 'port', 'port_name': 'portName', 'port_specification': 'portSpecification', 'proxy_header': 'proxyHeader', 'request_path': 'requestPath', 'response': 'response'})
class ComputeHealthCheckHttp2HealthCheck():
    def __init__(self, *, host: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, port_name: typing.Optional[str]=None, port_specification: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, request_path: typing.Optional[str]=None, response: typing.Optional[str]=None) -> None:
        """
        :param host: The value of the host header in the HTTP2 health check request. If left empty (default value), the public IP on behalf of which this health check is performed will be used.
        :param port: The TCP port number for the HTTP2 health check request. The default value is 443.
        :param port_name: Port name as defined in InstanceGroup#NamedPort#name. If both port and port_name are defined, port takes precedence.
        :param port_specification: Specifies how port is selected for health checking, can be one of the following values:. 'USE_FIXED_PORT': The port number in 'port' is used for health checking. 'USE_NAMED_PORT': The 'portName' is used for health checking. 'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each network endpoint is used for health checking. For other backends, the port or named port specified in the Backend Service is used for health checking. If not specified, HTTP2 health check follows behavior specified in 'port' and 'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param request_path: The request path of the HTTP2 health check request. The default value is /.
        :param response: The bytes to match against the beginning of the response data. If left empty (the default value), any response will indicate health. The response data can only be ASCII.
        """
        self._values = {
        }
        if host is not None: self._values["host"] = host
        if port is not None: self._values["port"] = port
        if port_name is not None: self._values["port_name"] = port_name
        if port_specification is not None: self._values["port_specification"] = port_specification
        if proxy_header is not None: self._values["proxy_header"] = proxy_header
        if request_path is not None: self._values["request_path"] = request_path
        if response is not None: self._values["response"] = response

    @builtins.property
    def host(self) -> typing.Optional[str]:
        """The value of the host header in the HTTP2 health check request.

        If left empty (default value), the public IP on behalf of which this health
        check is performed will be used.
        """
        return self._values.get('host')

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The TCP port number for the HTTP2 health check request.

        The default value is 443.
        """
        return self._values.get('port')

    @builtins.property
    def port_name(self) -> typing.Optional[str]:
        """Port name as defined in InstanceGroup#NamedPort#name.

        If both port and
        port_name are defined, port takes precedence.
        """
        return self._values.get('port_name')

    @builtins.property
    def port_specification(self) -> typing.Optional[str]:
        """Specifies how port is selected for health checking, can be one of the following values:.

        'USE_FIXED_PORT': The port number in 'port' is used for health checking.

        'USE_NAMED_PORT': The 'portName' is used for health checking.

        'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each
        network endpoint is used for health checking. For other backends, the
        port or named port specified in the Backend Service is used for health
        checking.

        If not specified, HTTP2 health check follows behavior specified in 'port' and
        'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        """
        return self._values.get('port_specification')

    @builtins.property
    def proxy_header(self) -> typing.Optional[str]:
        """Specifies the type of proxy header to append before sending data to the backend.

        Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        """
        return self._values.get('proxy_header')

    @builtins.property
    def request_path(self) -> typing.Optional[str]:
        """The request path of the HTTP2 health check request.

        The default value is /.
        """
        return self._values.get('request_path')

    @builtins.property
    def response(self) -> typing.Optional[str]:
        """The bytes to match against the beginning of the response data.

        If left empty
        (the default value), any response will indicate health. The response data
        can only be ASCII.
        """
        return self._values.get('response')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeHealthCheckHttp2HealthCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeHealthCheckHttpHealthCheck", jsii_struct_bases=[], name_mapping={'host': 'host', 'port': 'port', 'port_name': 'portName', 'port_specification': 'portSpecification', 'proxy_header': 'proxyHeader', 'request_path': 'requestPath', 'response': 'response'})
class ComputeHealthCheckHttpHealthCheck():
    def __init__(self, *, host: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, port_name: typing.Optional[str]=None, port_specification: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, request_path: typing.Optional[str]=None, response: typing.Optional[str]=None) -> None:
        """
        :param host: The value of the host header in the HTTP health check request. If left empty (default value), the public IP on behalf of which this health check is performed will be used.
        :param port: The TCP port number for the HTTP health check request. The default value is 80.
        :param port_name: Port name as defined in InstanceGroup#NamedPort#name. If both port and port_name are defined, port takes precedence.
        :param port_specification: Specifies how port is selected for health checking, can be one of the following values:. 'USE_FIXED_PORT': The port number in 'port' is used for health checking. 'USE_NAMED_PORT': The 'portName' is used for health checking. 'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each network endpoint is used for health checking. For other backends, the port or named port specified in the Backend Service is used for health checking. If not specified, HTTP health check follows behavior specified in 'port' and 'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param request_path: The request path of the HTTP health check request. The default value is /.
        :param response: The bytes to match against the beginning of the response data. If left empty (the default value), any response will indicate health. The response data can only be ASCII.
        """
        self._values = {
        }
        if host is not None: self._values["host"] = host
        if port is not None: self._values["port"] = port
        if port_name is not None: self._values["port_name"] = port_name
        if port_specification is not None: self._values["port_specification"] = port_specification
        if proxy_header is not None: self._values["proxy_header"] = proxy_header
        if request_path is not None: self._values["request_path"] = request_path
        if response is not None: self._values["response"] = response

    @builtins.property
    def host(self) -> typing.Optional[str]:
        """The value of the host header in the HTTP health check request.

        If left empty (default value), the public IP on behalf of which this health
        check is performed will be used.
        """
        return self._values.get('host')

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The TCP port number for the HTTP health check request.

        The default value is 80.
        """
        return self._values.get('port')

    @builtins.property
    def port_name(self) -> typing.Optional[str]:
        """Port name as defined in InstanceGroup#NamedPort#name.

        If both port and
        port_name are defined, port takes precedence.
        """
        return self._values.get('port_name')

    @builtins.property
    def port_specification(self) -> typing.Optional[str]:
        """Specifies how port is selected for health checking, can be one of the following values:.

        'USE_FIXED_PORT': The port number in 'port' is used for health checking.

        'USE_NAMED_PORT': The 'portName' is used for health checking.

        'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each
        network endpoint is used for health checking. For other backends, the
        port or named port specified in the Backend Service is used for health
        checking.

        If not specified, HTTP health check follows behavior specified in 'port' and
        'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        """
        return self._values.get('port_specification')

    @builtins.property
    def proxy_header(self) -> typing.Optional[str]:
        """Specifies the type of proxy header to append before sending data to the backend.

        Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        """
        return self._values.get('proxy_header')

    @builtins.property
    def request_path(self) -> typing.Optional[str]:
        """The request path of the HTTP health check request.

        The default value is /.
        """
        return self._values.get('request_path')

    @builtins.property
    def response(self) -> typing.Optional[str]:
        """The bytes to match against the beginning of the response data.

        If left empty
        (the default value), any response will indicate health. The response data
        can only be ASCII.
        """
        return self._values.get('response')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeHealthCheckHttpHealthCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeHealthCheckHttpsHealthCheck", jsii_struct_bases=[], name_mapping={'host': 'host', 'port': 'port', 'port_name': 'portName', 'port_specification': 'portSpecification', 'proxy_header': 'proxyHeader', 'request_path': 'requestPath', 'response': 'response'})
class ComputeHealthCheckHttpsHealthCheck():
    def __init__(self, *, host: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, port_name: typing.Optional[str]=None, port_specification: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, request_path: typing.Optional[str]=None, response: typing.Optional[str]=None) -> None:
        """
        :param host: The value of the host header in the HTTPS health check request. If left empty (default value), the public IP on behalf of which this health check is performed will be used.
        :param port: The TCP port number for the HTTPS health check request. The default value is 443.
        :param port_name: Port name as defined in InstanceGroup#NamedPort#name. If both port and port_name are defined, port takes precedence.
        :param port_specification: Specifies how port is selected for health checking, can be one of the following values:. 'USE_FIXED_PORT': The port number in 'port' is used for health checking. 'USE_NAMED_PORT': The 'portName' is used for health checking. 'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each network endpoint is used for health checking. For other backends, the port or named port specified in the Backend Service is used for health checking. If not specified, HTTPS health check follows behavior specified in 'port' and 'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param request_path: The request path of the HTTPS health check request. The default value is /.
        :param response: The bytes to match against the beginning of the response data. If left empty (the default value), any response will indicate health. The response data can only be ASCII.
        """
        self._values = {
        }
        if host is not None: self._values["host"] = host
        if port is not None: self._values["port"] = port
        if port_name is not None: self._values["port_name"] = port_name
        if port_specification is not None: self._values["port_specification"] = port_specification
        if proxy_header is not None: self._values["proxy_header"] = proxy_header
        if request_path is not None: self._values["request_path"] = request_path
        if response is not None: self._values["response"] = response

    @builtins.property
    def host(self) -> typing.Optional[str]:
        """The value of the host header in the HTTPS health check request.

        If left empty (default value), the public IP on behalf of which this health
        check is performed will be used.
        """
        return self._values.get('host')

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The TCP port number for the HTTPS health check request.

        The default value is 443.
        """
        return self._values.get('port')

    @builtins.property
    def port_name(self) -> typing.Optional[str]:
        """Port name as defined in InstanceGroup#NamedPort#name.

        If both port and
        port_name are defined, port takes precedence.
        """
        return self._values.get('port_name')

    @builtins.property
    def port_specification(self) -> typing.Optional[str]:
        """Specifies how port is selected for health checking, can be one of the following values:.

        'USE_FIXED_PORT': The port number in 'port' is used for health checking.

        'USE_NAMED_PORT': The 'portName' is used for health checking.

        'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each
        network endpoint is used for health checking. For other backends, the
        port or named port specified in the Backend Service is used for health
        checking.

        If not specified, HTTPS health check follows behavior specified in 'port' and
        'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        """
        return self._values.get('port_specification')

    @builtins.property
    def proxy_header(self) -> typing.Optional[str]:
        """Specifies the type of proxy header to append before sending data to the backend.

        Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        """
        return self._values.get('proxy_header')

    @builtins.property
    def request_path(self) -> typing.Optional[str]:
        """The request path of the HTTPS health check request.

        The default value is /.
        """
        return self._values.get('request_path')

    @builtins.property
    def response(self) -> typing.Optional[str]:
        """The bytes to match against the beginning of the response data.

        If left empty
        (the default value), any response will indicate health. The response data
        can only be ASCII.
        """
        return self._values.get('response')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeHealthCheckHttpsHealthCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeHealthCheckSslHealthCheck", jsii_struct_bases=[], name_mapping={'port': 'port', 'port_name': 'portName', 'port_specification': 'portSpecification', 'proxy_header': 'proxyHeader', 'request': 'request', 'response': 'response'})
class ComputeHealthCheckSslHealthCheck():
    def __init__(self, *, port: typing.Optional[jsii.Number]=None, port_name: typing.Optional[str]=None, port_specification: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, request: typing.Optional[str]=None, response: typing.Optional[str]=None) -> None:
        """
        :param port: The TCP port number for the SSL health check request. The default value is 443.
        :param port_name: Port name as defined in InstanceGroup#NamedPort#name. If both port and port_name are defined, port takes precedence.
        :param port_specification: Specifies how port is selected for health checking, can be one of the following values:. 'USE_FIXED_PORT': The port number in 'port' is used for health checking. 'USE_NAMED_PORT': The 'portName' is used for health checking. 'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each network endpoint is used for health checking. For other backends, the port or named port specified in the Backend Service is used for health checking. If not specified, SSL health check follows behavior specified in 'port' and 'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param request: The application data to send once the SSL connection has been established (default value is empty). If both request and response are empty, the connection establishment alone will indicate health. The request data can only be ASCII.
        :param response: The bytes to match against the beginning of the response data. If left empty (the default value), any response will indicate health. The response data can only be ASCII.
        """
        self._values = {
        }
        if port is not None: self._values["port"] = port
        if port_name is not None: self._values["port_name"] = port_name
        if port_specification is not None: self._values["port_specification"] = port_specification
        if proxy_header is not None: self._values["proxy_header"] = proxy_header
        if request is not None: self._values["request"] = request
        if response is not None: self._values["response"] = response

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The TCP port number for the SSL health check request.

        The default value is 443.
        """
        return self._values.get('port')

    @builtins.property
    def port_name(self) -> typing.Optional[str]:
        """Port name as defined in InstanceGroup#NamedPort#name.

        If both port and
        port_name are defined, port takes precedence.
        """
        return self._values.get('port_name')

    @builtins.property
    def port_specification(self) -> typing.Optional[str]:
        """Specifies how port is selected for health checking, can be one of the following values:.

        'USE_FIXED_PORT': The port number in 'port' is used for health checking.

        'USE_NAMED_PORT': The 'portName' is used for health checking.

        'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each
        network endpoint is used for health checking. For other backends, the
        port or named port specified in the Backend Service is used for health
        checking.

        If not specified, SSL health check follows behavior specified in 'port' and
        'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        """
        return self._values.get('port_specification')

    @builtins.property
    def proxy_header(self) -> typing.Optional[str]:
        """Specifies the type of proxy header to append before sending data to the backend.

        Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        """
        return self._values.get('proxy_header')

    @builtins.property
    def request(self) -> typing.Optional[str]:
        """The application data to send once the SSL connection has been established (default value is empty).

        If both request and response are
        empty, the connection establishment alone will indicate health. The request
        data can only be ASCII.
        """
        return self._values.get('request')

    @builtins.property
    def response(self) -> typing.Optional[str]:
        """The bytes to match against the beginning of the response data.

        If left empty
        (the default value), any response will indicate health. The response data
        can only be ASCII.
        """
        return self._values.get('response')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeHealthCheckSslHealthCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeHealthCheckTcpHealthCheck", jsii_struct_bases=[], name_mapping={'port': 'port', 'port_name': 'portName', 'port_specification': 'portSpecification', 'proxy_header': 'proxyHeader', 'request': 'request', 'response': 'response'})
class ComputeHealthCheckTcpHealthCheck():
    def __init__(self, *, port: typing.Optional[jsii.Number]=None, port_name: typing.Optional[str]=None, port_specification: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, request: typing.Optional[str]=None, response: typing.Optional[str]=None) -> None:
        """
        :param port: The TCP port number for the TCP health check request. The default value is 443.
        :param port_name: Port name as defined in InstanceGroup#NamedPort#name. If both port and port_name are defined, port takes precedence.
        :param port_specification: Specifies how port is selected for health checking, can be one of the following values:. 'USE_FIXED_PORT': The port number in 'port' is used for health checking. 'USE_NAMED_PORT': The 'portName' is used for health checking. 'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each network endpoint is used for health checking. For other backends, the port or named port specified in the Backend Service is used for health checking. If not specified, TCP health check follows behavior specified in 'port' and 'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param request: The application data to send once the TCP connection has been established (default value is empty). If both request and response are empty, the connection establishment alone will indicate health. The request data can only be ASCII.
        :param response: The bytes to match against the beginning of the response data. If left empty (the default value), any response will indicate health. The response data can only be ASCII.
        """
        self._values = {
        }
        if port is not None: self._values["port"] = port
        if port_name is not None: self._values["port_name"] = port_name
        if port_specification is not None: self._values["port_specification"] = port_specification
        if proxy_header is not None: self._values["proxy_header"] = proxy_header
        if request is not None: self._values["request"] = request
        if response is not None: self._values["response"] = response

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The TCP port number for the TCP health check request.

        The default value is 443.
        """
        return self._values.get('port')

    @builtins.property
    def port_name(self) -> typing.Optional[str]:
        """Port name as defined in InstanceGroup#NamedPort#name.

        If both port and
        port_name are defined, port takes precedence.
        """
        return self._values.get('port_name')

    @builtins.property
    def port_specification(self) -> typing.Optional[str]:
        """Specifies how port is selected for health checking, can be one of the following values:.

        'USE_FIXED_PORT': The port number in 'port' is used for health checking.

        'USE_NAMED_PORT': The 'portName' is used for health checking.

        'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each
        network endpoint is used for health checking. For other backends, the
        port or named port specified in the Backend Service is used for health
        checking.

        If not specified, TCP health check follows behavior specified in 'port' and
        'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        """
        return self._values.get('port_specification')

    @builtins.property
    def proxy_header(self) -> typing.Optional[str]:
        """Specifies the type of proxy header to append before sending data to the backend.

        Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        """
        return self._values.get('proxy_header')

    @builtins.property
    def request(self) -> typing.Optional[str]:
        """The application data to send once the TCP connection has been established (default value is empty).

        If both request and response are
        empty, the connection establishment alone will indicate health. The request
        data can only be ASCII.
        """
        return self._values.get('request')

    @builtins.property
    def response(self) -> typing.Optional[str]:
        """The bytes to match against the beginning of the response data.

        If left empty
        (the default value), any response will indicate health. The response data
        can only be ASCII.
        """
        return self._values.get('response')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeHealthCheckTcpHealthCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeHealthCheckTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeHealthCheckTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeHealthCheckTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeHttpHealthCheck(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeHttpHealthCheck"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, check_interval_sec: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, healthy_threshold: typing.Optional[jsii.Number]=None, host: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, request_path: typing.Optional[str]=None, timeouts: typing.Optional["ComputeHttpHealthCheckTimeouts"]=None, timeout_sec: typing.Optional[jsii.Number]=None, unhealthy_threshold: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param check_interval_sec: How often (in seconds) to send a health check. The default value is 5 seconds.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param healthy_threshold: A so-far unhealthy instance will be marked healthy after this many consecutive successes. The default value is 2.
        :param host: The value of the host header in the HTTP health check request. If left empty (default value), the public IP on behalf of which this health check is performed will be used.
        :param port: The TCP port number for the HTTP health check request. The default value is 80.
        :param project: 
        :param request_path: The request path of the HTTP health check request. The default value is /.
        :param timeouts: timeouts block.
        :param timeout_sec: How long (in seconds) to wait before claiming failure. The default value is 5 seconds. It is invalid for timeoutSec to have greater value than checkIntervalSec.
        :param unhealthy_threshold: A so-far healthy instance will be marked unhealthy after this many consecutive failures. The default value is 2.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeHttpHealthCheckConfig(name=name, check_interval_sec=check_interval_sec, description=description, healthy_threshold=healthy_threshold, host=host, port=port, project=project, request_path=request_path, timeouts=timeouts, timeout_sec=timeout_sec, unhealthy_threshold=unhealthy_threshold, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeHttpHealthCheck, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="checkIntervalSec")
    def check_interval_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "checkIntervalSec")

    @check_interval_sec.setter
    def check_interval_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "checkIntervalSec", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="healthyThreshold")
    def healthy_threshold(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "healthyThreshold")

    @healthy_threshold.setter
    def healthy_threshold(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "healthyThreshold", value)

    @builtins.property
    @jsii.member(jsii_name="host")
    def host(self) -> typing.Optional[str]:
        return jsii.get(self, "host")

    @host.setter
    def host(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "host", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="port")
    def port(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "port")

    @port.setter
    def port(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "port", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="requestPath")
    def request_path(self) -> typing.Optional[str]:
        return jsii.get(self, "requestPath")

    @request_path.setter
    def request_path(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "requestPath", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeHttpHealthCheckTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeHttpHealthCheckTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="timeoutSec")
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "timeoutSec")

    @timeout_sec.setter
    def timeout_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "timeoutSec", value)

    @builtins.property
    @jsii.member(jsii_name="unhealthyThreshold")
    def unhealthy_threshold(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "unhealthyThreshold")

    @unhealthy_threshold.setter
    def unhealthy_threshold(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "unhealthyThreshold", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeHttpHealthCheckConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'check_interval_sec': 'checkIntervalSec', 'description': 'description', 'healthy_threshold': 'healthyThreshold', 'host': 'host', 'port': 'port', 'project': 'project', 'request_path': 'requestPath', 'timeouts': 'timeouts', 'timeout_sec': 'timeoutSec', 'unhealthy_threshold': 'unhealthyThreshold'})
class ComputeHttpHealthCheckConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, check_interval_sec: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, healthy_threshold: typing.Optional[jsii.Number]=None, host: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, request_path: typing.Optional[str]=None, timeouts: typing.Optional["ComputeHttpHealthCheckTimeouts"]=None, timeout_sec: typing.Optional[jsii.Number]=None, unhealthy_threshold: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param check_interval_sec: How often (in seconds) to send a health check. The default value is 5 seconds.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param healthy_threshold: A so-far unhealthy instance will be marked healthy after this many consecutive successes. The default value is 2.
        :param host: The value of the host header in the HTTP health check request. If left empty (default value), the public IP on behalf of which this health check is performed will be used.
        :param port: The TCP port number for the HTTP health check request. The default value is 80.
        :param project: 
        :param request_path: The request path of the HTTP health check request. The default value is /.
        :param timeouts: timeouts block.
        :param timeout_sec: How long (in seconds) to wait before claiming failure. The default value is 5 seconds. It is invalid for timeoutSec to have greater value than checkIntervalSec.
        :param unhealthy_threshold: A so-far healthy instance will be marked unhealthy after this many consecutive failures. The default value is 2.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeHttpHealthCheckTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if check_interval_sec is not None: self._values["check_interval_sec"] = check_interval_sec
        if description is not None: self._values["description"] = description
        if healthy_threshold is not None: self._values["healthy_threshold"] = healthy_threshold
        if host is not None: self._values["host"] = host
        if port is not None: self._values["port"] = port
        if project is not None: self._values["project"] = project
        if request_path is not None: self._values["request_path"] = request_path
        if timeouts is not None: self._values["timeouts"] = timeouts
        if timeout_sec is not None: self._values["timeout_sec"] = timeout_sec
        if unhealthy_threshold is not None: self._values["unhealthy_threshold"] = unhealthy_threshold

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035.  Specifically, the name must be 1-63 characters long and
        match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means
        the first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the
        last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def check_interval_sec(self) -> typing.Optional[jsii.Number]:
        """How often (in seconds) to send a health check.

        The default value is 5
        seconds.
        """
        return self._values.get('check_interval_sec')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def healthy_threshold(self) -> typing.Optional[jsii.Number]:
        """A so-far unhealthy instance will be marked healthy after this many consecutive successes.

        The default value is 2.
        """
        return self._values.get('healthy_threshold')

    @builtins.property
    def host(self) -> typing.Optional[str]:
        """The value of the host header in the HTTP health check request.

        If
        left empty (default value), the public IP on behalf of which this
        health check is performed will be used.
        """
        return self._values.get('host')

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The TCP port number for the HTTP health check request.

        The default value is 80.
        """
        return self._values.get('port')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def request_path(self) -> typing.Optional[str]:
        """The request path of the HTTP health check request.

        The default value is /.
        """
        return self._values.get('request_path')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeHttpHealthCheckTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        """How long (in seconds) to wait before claiming failure.

        The default value is 5 seconds.  It is invalid for timeoutSec to have
        greater value than checkIntervalSec.
        """
        return self._values.get('timeout_sec')

    @builtins.property
    def unhealthy_threshold(self) -> typing.Optional[jsii.Number]:
        """A so-far healthy instance will be marked unhealthy after this many consecutive failures.

        The default value is 2.
        """
        return self._values.get('unhealthy_threshold')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeHttpHealthCheckConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeHttpHealthCheckTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeHttpHealthCheckTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeHttpHealthCheckTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeHttpsHealthCheck(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeHttpsHealthCheck"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, check_interval_sec: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, healthy_threshold: typing.Optional[jsii.Number]=None, host: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, request_path: typing.Optional[str]=None, timeouts: typing.Optional["ComputeHttpsHealthCheckTimeouts"]=None, timeout_sec: typing.Optional[jsii.Number]=None, unhealthy_threshold: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param check_interval_sec: How often (in seconds) to send a health check. The default value is 5 seconds.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param healthy_threshold: A so-far unhealthy instance will be marked healthy after this many consecutive successes. The default value is 2.
        :param host: The value of the host header in the HTTPS health check request. If left empty (default value), the public IP on behalf of which this health check is performed will be used.
        :param port: The TCP port number for the HTTPS health check request. The default value is 80.
        :param project: 
        :param request_path: The request path of the HTTPS health check request. The default value is /.
        :param timeouts: timeouts block.
        :param timeout_sec: How long (in seconds) to wait before claiming failure. The default value is 5 seconds. It is invalid for timeoutSec to have greater value than checkIntervalSec.
        :param unhealthy_threshold: A so-far healthy instance will be marked unhealthy after this many consecutive failures. The default value is 2.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeHttpsHealthCheckConfig(name=name, check_interval_sec=check_interval_sec, description=description, healthy_threshold=healthy_threshold, host=host, port=port, project=project, request_path=request_path, timeouts=timeouts, timeout_sec=timeout_sec, unhealthy_threshold=unhealthy_threshold, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeHttpsHealthCheck, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="checkIntervalSec")
    def check_interval_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "checkIntervalSec")

    @check_interval_sec.setter
    def check_interval_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "checkIntervalSec", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="healthyThreshold")
    def healthy_threshold(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "healthyThreshold")

    @healthy_threshold.setter
    def healthy_threshold(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "healthyThreshold", value)

    @builtins.property
    @jsii.member(jsii_name="host")
    def host(self) -> typing.Optional[str]:
        return jsii.get(self, "host")

    @host.setter
    def host(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "host", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="port")
    def port(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "port")

    @port.setter
    def port(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "port", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="requestPath")
    def request_path(self) -> typing.Optional[str]:
        return jsii.get(self, "requestPath")

    @request_path.setter
    def request_path(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "requestPath", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeHttpsHealthCheckTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeHttpsHealthCheckTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="timeoutSec")
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "timeoutSec")

    @timeout_sec.setter
    def timeout_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "timeoutSec", value)

    @builtins.property
    @jsii.member(jsii_name="unhealthyThreshold")
    def unhealthy_threshold(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "unhealthyThreshold")

    @unhealthy_threshold.setter
    def unhealthy_threshold(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "unhealthyThreshold", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeHttpsHealthCheckConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'check_interval_sec': 'checkIntervalSec', 'description': 'description', 'healthy_threshold': 'healthyThreshold', 'host': 'host', 'port': 'port', 'project': 'project', 'request_path': 'requestPath', 'timeouts': 'timeouts', 'timeout_sec': 'timeoutSec', 'unhealthy_threshold': 'unhealthyThreshold'})
class ComputeHttpsHealthCheckConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, check_interval_sec: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, healthy_threshold: typing.Optional[jsii.Number]=None, host: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, request_path: typing.Optional[str]=None, timeouts: typing.Optional["ComputeHttpsHealthCheckTimeouts"]=None, timeout_sec: typing.Optional[jsii.Number]=None, unhealthy_threshold: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param check_interval_sec: How often (in seconds) to send a health check. The default value is 5 seconds.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param healthy_threshold: A so-far unhealthy instance will be marked healthy after this many consecutive successes. The default value is 2.
        :param host: The value of the host header in the HTTPS health check request. If left empty (default value), the public IP on behalf of which this health check is performed will be used.
        :param port: The TCP port number for the HTTPS health check request. The default value is 80.
        :param project: 
        :param request_path: The request path of the HTTPS health check request. The default value is /.
        :param timeouts: timeouts block.
        :param timeout_sec: How long (in seconds) to wait before claiming failure. The default value is 5 seconds. It is invalid for timeoutSec to have greater value than checkIntervalSec.
        :param unhealthy_threshold: A so-far healthy instance will be marked unhealthy after this many consecutive failures. The default value is 2.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeHttpsHealthCheckTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if check_interval_sec is not None: self._values["check_interval_sec"] = check_interval_sec
        if description is not None: self._values["description"] = description
        if healthy_threshold is not None: self._values["healthy_threshold"] = healthy_threshold
        if host is not None: self._values["host"] = host
        if port is not None: self._values["port"] = port
        if project is not None: self._values["project"] = project
        if request_path is not None: self._values["request_path"] = request_path
        if timeouts is not None: self._values["timeouts"] = timeouts
        if timeout_sec is not None: self._values["timeout_sec"] = timeout_sec
        if unhealthy_threshold is not None: self._values["unhealthy_threshold"] = unhealthy_threshold

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035.  Specifically, the name must be 1-63 characters long and
        match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means
        the first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the
        last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def check_interval_sec(self) -> typing.Optional[jsii.Number]:
        """How often (in seconds) to send a health check.

        The default value is 5
        seconds.
        """
        return self._values.get('check_interval_sec')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def healthy_threshold(self) -> typing.Optional[jsii.Number]:
        """A so-far unhealthy instance will be marked healthy after this many consecutive successes.

        The default value is 2.
        """
        return self._values.get('healthy_threshold')

    @builtins.property
    def host(self) -> typing.Optional[str]:
        """The value of the host header in the HTTPS health check request.

        If
        left empty (default value), the public IP on behalf of which this
        health check is performed will be used.
        """
        return self._values.get('host')

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The TCP port number for the HTTPS health check request.

        The default value is 80.
        """
        return self._values.get('port')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def request_path(self) -> typing.Optional[str]:
        """The request path of the HTTPS health check request.

        The default value is /.
        """
        return self._values.get('request_path')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeHttpsHealthCheckTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        """How long (in seconds) to wait before claiming failure.

        The default value is 5 seconds.  It is invalid for timeoutSec to have
        greater value than checkIntervalSec.
        """
        return self._values.get('timeout_sec')

    @builtins.property
    def unhealthy_threshold(self) -> typing.Optional[jsii.Number]:
        """A so-far healthy instance will be marked unhealthy after this many consecutive failures.

        The default value is 2.
        """
        return self._values.get('unhealthy_threshold')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeHttpsHealthCheckConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeHttpsHealthCheckTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeHttpsHealthCheckTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeHttpsHealthCheckTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeImage(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeImage"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, description: typing.Optional[str]=None, disk_size_gb: typing.Optional[jsii.Number]=None, family: typing.Optional[str]=None, guest_os_features: typing.Optional[typing.List["ComputeImageGuestOsFeatures"]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, licenses: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, raw_disk: typing.Optional[typing.List["ComputeImageRawDisk"]]=None, source_disk: typing.Optional[str]=None, source_image: typing.Optional[str]=None, source_snapshot: typing.Optional[str]=None, timeouts: typing.Optional["ComputeImageTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param disk_size_gb: Size of the image when restored onto a persistent disk (in GB).
        :param family: The name of the image family to which this image belongs. You can create disks by specifying an image family instead of a specific image name. The image family always returns its latest image that is not deprecated. The name of the image family must comply with RFC1035.
        :param guest_os_features: guest_os_features block.
        :param labels: Labels to apply to this Image.
        :param licenses: Any applicable license URI.
        :param project: 
        :param raw_disk: raw_disk block.
        :param source_disk: The source disk to create this image based on. You must provide either this property or the rawDisk.source property but not both to create an image.
        :param source_image: URL of the source image used to create this image. In order to create an image, you must provide the full or partial URL of one of the following: The selfLink URL This property The rawDisk.source URL The sourceDisk URL
        :param source_snapshot: URL of the source snapshot used to create this image. In order to create an image, you must provide the full or partial URL of one of the following: The selfLink URL This property The sourceImage URL The rawDisk.source URL The sourceDisk URL
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeImageConfig(name=name, description=description, disk_size_gb=disk_size_gb, family=family, guest_os_features=guest_os_features, labels=labels, licenses=licenses, project=project, raw_disk=raw_disk, source_disk=source_disk, source_image=source_image, source_snapshot=source_snapshot, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeImage, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="archiveSizeBytes")
    def archive_size_bytes(self) -> jsii.Number:
        return jsii.get(self, "archiveSizeBytes")

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="labelFingerprint")
    def label_fingerprint(self) -> str:
        return jsii.get(self, "labelFingerprint")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="diskSizeGb")
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "diskSizeGb")

    @disk_size_gb.setter
    def disk_size_gb(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "diskSizeGb", value)

    @builtins.property
    @jsii.member(jsii_name="family")
    def family(self) -> typing.Optional[str]:
        return jsii.get(self, "family")

    @family.setter
    def family(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "family", value)

    @builtins.property
    @jsii.member(jsii_name="guestOsFeatures")
    def guest_os_features(self) -> typing.Optional[typing.List["ComputeImageGuestOsFeatures"]]:
        return jsii.get(self, "guestOsFeatures")

    @guest_os_features.setter
    def guest_os_features(self, value: typing.Optional[typing.List["ComputeImageGuestOsFeatures"]]) -> None:
        jsii.set(self, "guestOsFeatures", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="licenses")
    def licenses(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "licenses")

    @licenses.setter
    def licenses(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "licenses", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="rawDisk")
    def raw_disk(self) -> typing.Optional[typing.List["ComputeImageRawDisk"]]:
        return jsii.get(self, "rawDisk")

    @raw_disk.setter
    def raw_disk(self, value: typing.Optional[typing.List["ComputeImageRawDisk"]]) -> None:
        jsii.set(self, "rawDisk", value)

    @builtins.property
    @jsii.member(jsii_name="sourceDisk")
    def source_disk(self) -> typing.Optional[str]:
        return jsii.get(self, "sourceDisk")

    @source_disk.setter
    def source_disk(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sourceDisk", value)

    @builtins.property
    @jsii.member(jsii_name="sourceImage")
    def source_image(self) -> typing.Optional[str]:
        return jsii.get(self, "sourceImage")

    @source_image.setter
    def source_image(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sourceImage", value)

    @builtins.property
    @jsii.member(jsii_name="sourceSnapshot")
    def source_snapshot(self) -> typing.Optional[str]:
        return jsii.get(self, "sourceSnapshot")

    @source_snapshot.setter
    def source_snapshot(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sourceSnapshot", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeImageTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeImageTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeImageConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'description': 'description', 'disk_size_gb': 'diskSizeGb', 'family': 'family', 'guest_os_features': 'guestOsFeatures', 'labels': 'labels', 'licenses': 'licenses', 'project': 'project', 'raw_disk': 'rawDisk', 'source_disk': 'sourceDisk', 'source_image': 'sourceImage', 'source_snapshot': 'sourceSnapshot', 'timeouts': 'timeouts'})
class ComputeImageConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, description: typing.Optional[str]=None, disk_size_gb: typing.Optional[jsii.Number]=None, family: typing.Optional[str]=None, guest_os_features: typing.Optional[typing.List["ComputeImageGuestOsFeatures"]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, licenses: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, raw_disk: typing.Optional[typing.List["ComputeImageRawDisk"]]=None, source_disk: typing.Optional[str]=None, source_image: typing.Optional[str]=None, source_snapshot: typing.Optional[str]=None, timeouts: typing.Optional["ComputeImageTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param disk_size_gb: Size of the image when restored onto a persistent disk (in GB).
        :param family: The name of the image family to which this image belongs. You can create disks by specifying an image family instead of a specific image name. The image family always returns its latest image that is not deprecated. The name of the image family must comply with RFC1035.
        :param guest_os_features: guest_os_features block.
        :param labels: Labels to apply to this Image.
        :param licenses: Any applicable license URI.
        :param project: 
        :param raw_disk: raw_disk block.
        :param source_disk: The source disk to create this image based on. You must provide either this property or the rawDisk.source property but not both to create an image.
        :param source_image: URL of the source image used to create this image. In order to create an image, you must provide the full or partial URL of one of the following: The selfLink URL This property The rawDisk.source URL The sourceDisk URL
        :param source_snapshot: URL of the source snapshot used to create this image. In order to create an image, you must provide the full or partial URL of one of the following: The selfLink URL This property The sourceImage URL The rawDisk.source URL The sourceDisk URL
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeImageTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if disk_size_gb is not None: self._values["disk_size_gb"] = disk_size_gb
        if family is not None: self._values["family"] = family
        if guest_os_features is not None: self._values["guest_os_features"] = guest_os_features
        if labels is not None: self._values["labels"] = labels
        if licenses is not None: self._values["licenses"] = licenses
        if project is not None: self._values["project"] = project
        if raw_disk is not None: self._values["raw_disk"] = raw_disk
        if source_disk is not None: self._values["source_disk"] = source_disk
        if source_image is not None: self._values["source_image"] = source_image
        if source_snapshot is not None: self._values["source_snapshot"] = source_snapshot
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource;

        provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and
        match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means
        the first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the
        last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        """Size of the image when restored onto a persistent disk (in GB)."""
        return self._values.get('disk_size_gb')

    @builtins.property
    def family(self) -> typing.Optional[str]:
        """The name of the image family to which this image belongs.

        You can
        create disks by specifying an image family instead of a specific
        image name. The image family always returns its latest image that is
        not deprecated. The name of the image family must comply with
        RFC1035.
        """
        return self._values.get('family')

    @builtins.property
    def guest_os_features(self) -> typing.Optional[typing.List["ComputeImageGuestOsFeatures"]]:
        """guest_os_features block."""
        return self._values.get('guest_os_features')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Labels to apply to this Image."""
        return self._values.get('labels')

    @builtins.property
    def licenses(self) -> typing.Optional[typing.List[str]]:
        """Any applicable license URI."""
        return self._values.get('licenses')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def raw_disk(self) -> typing.Optional[typing.List["ComputeImageRawDisk"]]:
        """raw_disk block."""
        return self._values.get('raw_disk')

    @builtins.property
    def source_disk(self) -> typing.Optional[str]:
        """The source disk to create this image based on.

        You must provide either this property or the
        rawDisk.source property but not both to create an image.
        """
        return self._values.get('source_disk')

    @builtins.property
    def source_image(self) -> typing.Optional[str]:
        """URL of the source image used to create this image.

        In order to create an image, you must provide the full or partial
        URL of one of the following:

        The selfLink URL
        This property
        The rawDisk.source URL
        The sourceDisk URL
        """
        return self._values.get('source_image')

    @builtins.property
    def source_snapshot(self) -> typing.Optional[str]:
        """URL of the source snapshot used to create this image.

        In order to create an image, you must provide the full or partial URL of one of the following:

        The selfLink URL
        This property
        The sourceImage URL
        The rawDisk.source URL
        The sourceDisk URL
        """
        return self._values.get('source_snapshot')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeImageTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeImageConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeImageGuestOsFeatures", jsii_struct_bases=[], name_mapping={'type': 'type'})
class ComputeImageGuestOsFeatures():
    def __init__(self, *, type: str) -> None:
        """
        :param type: The type of supported feature. Read `Enabling guest operating system features <https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#guest-os-features>`_ to see a list of available options. Possible values: ["MULTI_IP_SUBNET", "SECURE_BOOT", "UEFI_COMPATIBLE", "VIRTIO_SCSI_MULTIQUEUE", "WINDOWS"]
        """
        self._values = {
            'type': type,
        }

    @builtins.property
    def type(self) -> str:
        """The type of supported feature.

        Read `Enabling guest operating system features <https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#guest-os-features>`_ to see a list of available options. Possible values: ["MULTI_IP_SUBNET", "SECURE_BOOT", "UEFI_COMPATIBLE", "VIRTIO_SCSI_MULTIQUEUE", "WINDOWS"]
        """
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeImageGuestOsFeatures(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeImageRawDisk", jsii_struct_bases=[], name_mapping={'source': 'source', 'container_type': 'containerType', 'sha1': 'sha1'})
class ComputeImageRawDisk():
    def __init__(self, *, source: str, container_type: typing.Optional[str]=None, sha1: typing.Optional[str]=None) -> None:
        """
        :param source: The full Google Cloud Storage URL where disk storage is stored You must provide either this property or the sourceDisk property but not both.
        :param container_type: The format used to encode and transmit the block device, which should be TAR. This is just a container and transmission format and not a runtime format. Provided by the client when the disk image is created. Default value: "TAR" Possible values: ["TAR"]
        :param sha1: An optional SHA1 checksum of the disk image before unpackaging. This is provided by the client when the disk image is created.
        """
        self._values = {
            'source': source,
        }
        if container_type is not None: self._values["container_type"] = container_type
        if sha1 is not None: self._values["sha1"] = sha1

    @builtins.property
    def source(self) -> str:
        """The full Google Cloud Storage URL where disk storage is stored You must provide either this property or the sourceDisk property but not both."""
        return self._values.get('source')

    @builtins.property
    def container_type(self) -> typing.Optional[str]:
        """The format used to encode and transmit the block device, which should be TAR.

        This is just a container and transmission format
        and not a runtime format. Provided by the client when the disk
        image is created. Default value: "TAR" Possible values: ["TAR"]
        """
        return self._values.get('container_type')

    @builtins.property
    def sha1(self) -> typing.Optional[str]:
        """An optional SHA1 checksum of the disk image before unpackaging.

        This is provided by the client when the disk image is created.
        """
        return self._values.get('sha1')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeImageRawDisk(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeImageTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeImageTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeImageTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeInstance(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeInstance"):
    def __init__(self, scope: constructs.Construct, id: str, *, boot_disk: typing.List["ComputeInstanceBootDisk"], machine_type: str, name: str, network_interface: typing.List["ComputeInstanceNetworkInterface"], allow_stopping_for_update: typing.Optional[bool]=None, attached_disk: typing.Optional[typing.List["ComputeInstanceAttachedDisk"]]=None, can_ip_forward: typing.Optional[bool]=None, deletion_protection: typing.Optional[bool]=None, description: typing.Optional[str]=None, desired_status: typing.Optional[str]=None, enable_display: typing.Optional[bool]=None, guest_accelerator: typing.Optional[typing.List["ComputeInstanceGuestAccelerator"]]=None, hostname: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, metadata_startup_script: typing.Optional[str]=None, min_cpu_platform: typing.Optional[str]=None, project: typing.Optional[str]=None, resource_policies: typing.Optional[typing.List[str]]=None, scheduling: typing.Optional[typing.List["ComputeInstanceScheduling"]]=None, scratch_disk: typing.Optional[typing.List["ComputeInstanceScratchDisk"]]=None, service_account: typing.Optional[typing.List["ComputeInstanceServiceAccount"]]=None, shielded_instance_config: typing.Optional[typing.List["ComputeInstanceShieldedInstanceConfig"]]=None, tags: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["ComputeInstanceTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param boot_disk: boot_disk block.
        :param machine_type: The machine type to create.
        :param name: The name of the instance. One of name or self_link must be provided.
        :param network_interface: network_interface block.
        :param allow_stopping_for_update: If true, allows Terraform to stop the instance to update its properties. If you try to update a property that requires stopping the instance without setting this field, the update will fail.
        :param attached_disk: attached_disk block.
        :param can_ip_forward: Whether sending and receiving of packets with non-matching source or destination IPs is allowed.
        :param deletion_protection: Whether deletion protection is enabled on this instance.
        :param description: A brief description of the resource.
        :param desired_status: Desired status of the instance. Either "RUNNING" or "TERMINATED".
        :param enable_display: Whether the instance has virtual displays enabled.
        :param guest_accelerator: List of the type and count of accelerator cards attached to the instance.
        :param hostname: A custom hostname for the instance. Must be a fully qualified DNS name and RFC-1035-valid. Valid format is a series of labels 1-63 characters long matching the regular expression `a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_, concatenated with periods. The entire hostname must not exceed 253 characters. Changing this forces a new resource to be created.
        :param labels: A set of key/value label pairs assigned to the instance.
        :param metadata: Metadata key/value pairs made available within the instance.
        :param metadata_startup_script: Metadata startup scripts made available within the instance.
        :param min_cpu_platform: The minimum CPU platform specified for the VM instance.
        :param project: The ID of the project in which the resource belongs. If self_link is provided, this value is ignored. If neither self_link nor project are provided, the provider project is used.
        :param resource_policies: A list of short names or self_links of resource policies to attach to the instance. Modifying this list will cause the instance to recreate. Currently a max of 1 resource policy is supported.
        :param scheduling: scheduling block.
        :param scratch_disk: scratch_disk block.
        :param service_account: service_account block.
        :param shielded_instance_config: shielded_instance_config block.
        :param tags: The list of tags attached to the instance.
        :param timeouts: timeouts block.
        :param zone: The zone of the instance. If self_link is provided, this value is ignored. If neither self_link nor zone are provided, the provider zone is used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeInstanceConfig(boot_disk=boot_disk, machine_type=machine_type, name=name, network_interface=network_interface, allow_stopping_for_update=allow_stopping_for_update, attached_disk=attached_disk, can_ip_forward=can_ip_forward, deletion_protection=deletion_protection, description=description, desired_status=desired_status, enable_display=enable_display, guest_accelerator=guest_accelerator, hostname=hostname, labels=labels, metadata=metadata, metadata_startup_script=metadata_startup_script, min_cpu_platform=min_cpu_platform, project=project, resource_policies=resource_policies, scheduling=scheduling, scratch_disk=scratch_disk, service_account=service_account, shielded_instance_config=shielded_instance_config, tags=tags, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeInstance, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="cpuPlatform")
    def cpu_platform(self) -> str:
        return jsii.get(self, "cpuPlatform")

    @builtins.property
    @jsii.member(jsii_name="currentStatus")
    def current_status(self) -> str:
        return jsii.get(self, "currentStatus")

    @builtins.property
    @jsii.member(jsii_name="instanceId")
    def instance_id(self) -> str:
        return jsii.get(self, "instanceId")

    @builtins.property
    @jsii.member(jsii_name="labelFingerprint")
    def label_fingerprint(self) -> str:
        return jsii.get(self, "labelFingerprint")

    @builtins.property
    @jsii.member(jsii_name="metadataFingerprint")
    def metadata_fingerprint(self) -> str:
        return jsii.get(self, "metadataFingerprint")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="tagsFingerprint")
    def tags_fingerprint(self) -> str:
        return jsii.get(self, "tagsFingerprint")

    @builtins.property
    @jsii.member(jsii_name="bootDisk")
    def boot_disk(self) -> typing.List["ComputeInstanceBootDisk"]:
        return jsii.get(self, "bootDisk")

    @boot_disk.setter
    def boot_disk(self, value: typing.List["ComputeInstanceBootDisk"]) -> None:
        jsii.set(self, "bootDisk", value)

    @builtins.property
    @jsii.member(jsii_name="machineType")
    def machine_type(self) -> str:
        return jsii.get(self, "machineType")

    @machine_type.setter
    def machine_type(self, value: str) -> None:
        jsii.set(self, "machineType", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="networkInterface")
    def network_interface(self) -> typing.List["ComputeInstanceNetworkInterface"]:
        return jsii.get(self, "networkInterface")

    @network_interface.setter
    def network_interface(self, value: typing.List["ComputeInstanceNetworkInterface"]) -> None:
        jsii.set(self, "networkInterface", value)

    @builtins.property
    @jsii.member(jsii_name="allowStoppingForUpdate")
    def allow_stopping_for_update(self) -> typing.Optional[bool]:
        return jsii.get(self, "allowStoppingForUpdate")

    @allow_stopping_for_update.setter
    def allow_stopping_for_update(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "allowStoppingForUpdate", value)

    @builtins.property
    @jsii.member(jsii_name="attachedDisk")
    def attached_disk(self) -> typing.Optional[typing.List["ComputeInstanceAttachedDisk"]]:
        return jsii.get(self, "attachedDisk")

    @attached_disk.setter
    def attached_disk(self, value: typing.Optional[typing.List["ComputeInstanceAttachedDisk"]]) -> None:
        jsii.set(self, "attachedDisk", value)

    @builtins.property
    @jsii.member(jsii_name="canIpForward")
    def can_ip_forward(self) -> typing.Optional[bool]:
        return jsii.get(self, "canIpForward")

    @can_ip_forward.setter
    def can_ip_forward(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "canIpForward", value)

    @builtins.property
    @jsii.member(jsii_name="deletionProtection")
    def deletion_protection(self) -> typing.Optional[bool]:
        return jsii.get(self, "deletionProtection")

    @deletion_protection.setter
    def deletion_protection(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "deletionProtection", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="desiredStatus")
    def desired_status(self) -> typing.Optional[str]:
        return jsii.get(self, "desiredStatus")

    @desired_status.setter
    def desired_status(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "desiredStatus", value)

    @builtins.property
    @jsii.member(jsii_name="enableDisplay")
    def enable_display(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableDisplay")

    @enable_display.setter
    def enable_display(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableDisplay", value)

    @builtins.property
    @jsii.member(jsii_name="guestAccelerator")
    def guest_accelerator(self) -> typing.Optional[typing.List["ComputeInstanceGuestAccelerator"]]:
        return jsii.get(self, "guestAccelerator")

    @guest_accelerator.setter
    def guest_accelerator(self, value: typing.Optional[typing.List["ComputeInstanceGuestAccelerator"]]) -> None:
        jsii.set(self, "guestAccelerator", value)

    @builtins.property
    @jsii.member(jsii_name="hostname")
    def hostname(self) -> typing.Optional[str]:
        return jsii.get(self, "hostname")

    @hostname.setter
    def hostname(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "hostname", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "metadata")

    @metadata.setter
    def metadata(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property
    @jsii.member(jsii_name="metadataStartupScript")
    def metadata_startup_script(self) -> typing.Optional[str]:
        return jsii.get(self, "metadataStartupScript")

    @metadata_startup_script.setter
    def metadata_startup_script(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "metadataStartupScript", value)

    @builtins.property
    @jsii.member(jsii_name="minCpuPlatform")
    def min_cpu_platform(self) -> typing.Optional[str]:
        return jsii.get(self, "minCpuPlatform")

    @min_cpu_platform.setter
    def min_cpu_platform(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "minCpuPlatform", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="resourcePolicies")
    def resource_policies(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "resourcePolicies")

    @resource_policies.setter
    def resource_policies(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "resourcePolicies", value)

    @builtins.property
    @jsii.member(jsii_name="scheduling")
    def scheduling(self) -> typing.Optional[typing.List["ComputeInstanceScheduling"]]:
        return jsii.get(self, "scheduling")

    @scheduling.setter
    def scheduling(self, value: typing.Optional[typing.List["ComputeInstanceScheduling"]]) -> None:
        jsii.set(self, "scheduling", value)

    @builtins.property
    @jsii.member(jsii_name="scratchDisk")
    def scratch_disk(self) -> typing.Optional[typing.List["ComputeInstanceScratchDisk"]]:
        return jsii.get(self, "scratchDisk")

    @scratch_disk.setter
    def scratch_disk(self, value: typing.Optional[typing.List["ComputeInstanceScratchDisk"]]) -> None:
        jsii.set(self, "scratchDisk", value)

    @builtins.property
    @jsii.member(jsii_name="serviceAccount")
    def service_account(self) -> typing.Optional[typing.List["ComputeInstanceServiceAccount"]]:
        return jsii.get(self, "serviceAccount")

    @service_account.setter
    def service_account(self, value: typing.Optional[typing.List["ComputeInstanceServiceAccount"]]) -> None:
        jsii.set(self, "serviceAccount", value)

    @builtins.property
    @jsii.member(jsii_name="shieldedInstanceConfig")
    def shielded_instance_config(self) -> typing.Optional[typing.List["ComputeInstanceShieldedInstanceConfig"]]:
        return jsii.get(self, "shieldedInstanceConfig")

    @shielded_instance_config.setter
    def shielded_instance_config(self, value: typing.Optional[typing.List["ComputeInstanceShieldedInstanceConfig"]]) -> None:
        jsii.set(self, "shieldedInstanceConfig", value)

    @builtins.property
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "tags")

    @tags.setter
    def tags(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeInstanceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeInstanceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceAttachedDisk", jsii_struct_bases=[], name_mapping={'source': 'source', 'device_name': 'deviceName', 'disk_encryption_key_raw': 'diskEncryptionKeyRaw', 'kms_key_self_link': 'kmsKeySelfLink', 'mode': 'mode'})
class ComputeInstanceAttachedDisk():
    def __init__(self, *, source: str, device_name: typing.Optional[str]=None, disk_encryption_key_raw: typing.Optional[str]=None, kms_key_self_link: typing.Optional[str]=None, mode: typing.Optional[str]=None) -> None:
        """
        :param source: The name or self_link of the disk attached to this instance.
        :param device_name: Name with which the attached disk is accessible under /dev/disk/by-id/.
        :param disk_encryption_key_raw: A 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to encrypt this disk. Only one of kms_key_self_link and disk_encryption_key_raw may be set.
        :param kms_key_self_link: The self_link of the encryption key that is stored in Google Cloud KMS to encrypt this disk. Only one of kms_key_self_link and disk_encryption_key_raw may be set.
        :param mode: Read/write mode for the disk. One of "READ_ONLY" or "READ_WRITE".
        """
        self._values = {
            'source': source,
        }
        if device_name is not None: self._values["device_name"] = device_name
        if disk_encryption_key_raw is not None: self._values["disk_encryption_key_raw"] = disk_encryption_key_raw
        if kms_key_self_link is not None: self._values["kms_key_self_link"] = kms_key_self_link
        if mode is not None: self._values["mode"] = mode

    @builtins.property
    def source(self) -> str:
        """The name or self_link of the disk attached to this instance."""
        return self._values.get('source')

    @builtins.property
    def device_name(self) -> typing.Optional[str]:
        """Name with which the attached disk is accessible under /dev/disk/by-id/."""
        return self._values.get('device_name')

    @builtins.property
    def disk_encryption_key_raw(self) -> typing.Optional[str]:
        """A 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to encrypt this disk.

        Only one of kms_key_self_link and disk_encryption_key_raw may be set.
        """
        return self._values.get('disk_encryption_key_raw')

    @builtins.property
    def kms_key_self_link(self) -> typing.Optional[str]:
        """The self_link of the encryption key that is stored in Google Cloud KMS to encrypt this disk.

        Only one of kms_key_self_link and disk_encryption_key_raw may be set.
        """
        return self._values.get('kms_key_self_link')

    @builtins.property
    def mode(self) -> typing.Optional[str]:
        """Read/write mode for the disk.

        One of "READ_ONLY" or "READ_WRITE".
        """
        return self._values.get('mode')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceAttachedDisk(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceBootDisk", jsii_struct_bases=[], name_mapping={'auto_delete': 'autoDelete', 'device_name': 'deviceName', 'disk_encryption_key_raw': 'diskEncryptionKeyRaw', 'initialize_params': 'initializeParams', 'kms_key_self_link': 'kmsKeySelfLink', 'mode': 'mode', 'source': 'source'})
class ComputeInstanceBootDisk():
    def __init__(self, *, auto_delete: typing.Optional[bool]=None, device_name: typing.Optional[str]=None, disk_encryption_key_raw: typing.Optional[str]=None, initialize_params: typing.Optional[typing.List["ComputeInstanceBootDiskInitializeParams"]]=None, kms_key_self_link: typing.Optional[str]=None, mode: typing.Optional[str]=None, source: typing.Optional[str]=None) -> None:
        """
        :param auto_delete: Whether the disk will be auto-deleted when the instance is deleted.
        :param device_name: Name with which attached disk will be accessible under /dev/disk/by-id/.
        :param disk_encryption_key_raw: A 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to encrypt this disk. Only one of kms_key_self_link and disk_encryption_key_raw may be set.
        :param initialize_params: initialize_params block.
        :param kms_key_self_link: The self_link of the encryption key that is stored in Google Cloud KMS to encrypt this disk. Only one of kms_key_self_link and disk_encryption_key_raw may be set.
        :param mode: Read/write mode for the disk. One of "READ_ONLY" or "READ_WRITE".
        :param source: The name or self_link of the disk attached to this instance.
        """
        self._values = {
        }
        if auto_delete is not None: self._values["auto_delete"] = auto_delete
        if device_name is not None: self._values["device_name"] = device_name
        if disk_encryption_key_raw is not None: self._values["disk_encryption_key_raw"] = disk_encryption_key_raw
        if initialize_params is not None: self._values["initialize_params"] = initialize_params
        if kms_key_self_link is not None: self._values["kms_key_self_link"] = kms_key_self_link
        if mode is not None: self._values["mode"] = mode
        if source is not None: self._values["source"] = source

    @builtins.property
    def auto_delete(self) -> typing.Optional[bool]:
        """Whether the disk will be auto-deleted when the instance is deleted."""
        return self._values.get('auto_delete')

    @builtins.property
    def device_name(self) -> typing.Optional[str]:
        """Name with which attached disk will be accessible under /dev/disk/by-id/."""
        return self._values.get('device_name')

    @builtins.property
    def disk_encryption_key_raw(self) -> typing.Optional[str]:
        """A 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to encrypt this disk.

        Only one of kms_key_self_link and disk_encryption_key_raw may be set.
        """
        return self._values.get('disk_encryption_key_raw')

    @builtins.property
    def initialize_params(self) -> typing.Optional[typing.List["ComputeInstanceBootDiskInitializeParams"]]:
        """initialize_params block."""
        return self._values.get('initialize_params')

    @builtins.property
    def kms_key_self_link(self) -> typing.Optional[str]:
        """The self_link of the encryption key that is stored in Google Cloud KMS to encrypt this disk.

        Only one of kms_key_self_link and disk_encryption_key_raw may be set.
        """
        return self._values.get('kms_key_self_link')

    @builtins.property
    def mode(self) -> typing.Optional[str]:
        """Read/write mode for the disk.

        One of "READ_ONLY" or "READ_WRITE".
        """
        return self._values.get('mode')

    @builtins.property
    def source(self) -> typing.Optional[str]:
        """The name or self_link of the disk attached to this instance."""
        return self._values.get('source')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceBootDisk(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceBootDiskInitializeParams", jsii_struct_bases=[], name_mapping={'image': 'image', 'labels': 'labels', 'size': 'size', 'type': 'type'})
class ComputeInstanceBootDiskInitializeParams():
    def __init__(self, *, image: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, size: typing.Optional[jsii.Number]=None, type: typing.Optional[str]=None) -> None:
        """
        :param image: The image from which this disk was initialised.
        :param labels: A set of key/value label pairs assigned to the disk.
        :param size: The size of the image in gigabytes.
        :param type: The GCE disk type. One of pd-standard or pd-ssd.
        """
        self._values = {
        }
        if image is not None: self._values["image"] = image
        if labels is not None: self._values["labels"] = labels
        if size is not None: self._values["size"] = size
        if type is not None: self._values["type"] = type

    @builtins.property
    def image(self) -> typing.Optional[str]:
        """The image from which this disk was initialised."""
        return self._values.get('image')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value label pairs assigned to the disk."""
        return self._values.get('labels')

    @builtins.property
    def size(self) -> typing.Optional[jsii.Number]:
        """The size of the image in gigabytes."""
        return self._values.get('size')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        """The GCE disk type.

        One of pd-standard or pd-ssd.
        """
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceBootDiskInitializeParams(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'boot_disk': 'bootDisk', 'machine_type': 'machineType', 'name': 'name', 'network_interface': 'networkInterface', 'allow_stopping_for_update': 'allowStoppingForUpdate', 'attached_disk': 'attachedDisk', 'can_ip_forward': 'canIpForward', 'deletion_protection': 'deletionProtection', 'description': 'description', 'desired_status': 'desiredStatus', 'enable_display': 'enableDisplay', 'guest_accelerator': 'guestAccelerator', 'hostname': 'hostname', 'labels': 'labels', 'metadata': 'metadata', 'metadata_startup_script': 'metadataStartupScript', 'min_cpu_platform': 'minCpuPlatform', 'project': 'project', 'resource_policies': 'resourcePolicies', 'scheduling': 'scheduling', 'scratch_disk': 'scratchDisk', 'service_account': 'serviceAccount', 'shielded_instance_config': 'shieldedInstanceConfig', 'tags': 'tags', 'timeouts': 'timeouts', 'zone': 'zone'})
class ComputeInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, boot_disk: typing.List["ComputeInstanceBootDisk"], machine_type: str, name: str, network_interface: typing.List["ComputeInstanceNetworkInterface"], allow_stopping_for_update: typing.Optional[bool]=None, attached_disk: typing.Optional[typing.List["ComputeInstanceAttachedDisk"]]=None, can_ip_forward: typing.Optional[bool]=None, deletion_protection: typing.Optional[bool]=None, description: typing.Optional[str]=None, desired_status: typing.Optional[str]=None, enable_display: typing.Optional[bool]=None, guest_accelerator: typing.Optional[typing.List["ComputeInstanceGuestAccelerator"]]=None, hostname: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, metadata_startup_script: typing.Optional[str]=None, min_cpu_platform: typing.Optional[str]=None, project: typing.Optional[str]=None, resource_policies: typing.Optional[typing.List[str]]=None, scheduling: typing.Optional[typing.List["ComputeInstanceScheduling"]]=None, scratch_disk: typing.Optional[typing.List["ComputeInstanceScratchDisk"]]=None, service_account: typing.Optional[typing.List["ComputeInstanceServiceAccount"]]=None, shielded_instance_config: typing.Optional[typing.List["ComputeInstanceShieldedInstanceConfig"]]=None, tags: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["ComputeInstanceTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param boot_disk: boot_disk block.
        :param machine_type: The machine type to create.
        :param name: The name of the instance. One of name or self_link must be provided.
        :param network_interface: network_interface block.
        :param allow_stopping_for_update: If true, allows Terraform to stop the instance to update its properties. If you try to update a property that requires stopping the instance without setting this field, the update will fail.
        :param attached_disk: attached_disk block.
        :param can_ip_forward: Whether sending and receiving of packets with non-matching source or destination IPs is allowed.
        :param deletion_protection: Whether deletion protection is enabled on this instance.
        :param description: A brief description of the resource.
        :param desired_status: Desired status of the instance. Either "RUNNING" or "TERMINATED".
        :param enable_display: Whether the instance has virtual displays enabled.
        :param guest_accelerator: List of the type and count of accelerator cards attached to the instance.
        :param hostname: A custom hostname for the instance. Must be a fully qualified DNS name and RFC-1035-valid. Valid format is a series of labels 1-63 characters long matching the regular expression `a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_, concatenated with periods. The entire hostname must not exceed 253 characters. Changing this forces a new resource to be created.
        :param labels: A set of key/value label pairs assigned to the instance.
        :param metadata: Metadata key/value pairs made available within the instance.
        :param metadata_startup_script: Metadata startup scripts made available within the instance.
        :param min_cpu_platform: The minimum CPU platform specified for the VM instance.
        :param project: The ID of the project in which the resource belongs. If self_link is provided, this value is ignored. If neither self_link nor project are provided, the provider project is used.
        :param resource_policies: A list of short names or self_links of resource policies to attach to the instance. Modifying this list will cause the instance to recreate. Currently a max of 1 resource policy is supported.
        :param scheduling: scheduling block.
        :param scratch_disk: scratch_disk block.
        :param service_account: service_account block.
        :param shielded_instance_config: shielded_instance_config block.
        :param tags: The list of tags attached to the instance.
        :param timeouts: timeouts block.
        :param zone: The zone of the instance. If self_link is provided, this value is ignored. If neither self_link nor zone are provided, the provider zone is used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeInstanceTimeouts(**timeouts)
        self._values = {
            'boot_disk': boot_disk,
            'machine_type': machine_type,
            'name': name,
            'network_interface': network_interface,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if allow_stopping_for_update is not None: self._values["allow_stopping_for_update"] = allow_stopping_for_update
        if attached_disk is not None: self._values["attached_disk"] = attached_disk
        if can_ip_forward is not None: self._values["can_ip_forward"] = can_ip_forward
        if deletion_protection is not None: self._values["deletion_protection"] = deletion_protection
        if description is not None: self._values["description"] = description
        if desired_status is not None: self._values["desired_status"] = desired_status
        if enable_display is not None: self._values["enable_display"] = enable_display
        if guest_accelerator is not None: self._values["guest_accelerator"] = guest_accelerator
        if hostname is not None: self._values["hostname"] = hostname
        if labels is not None: self._values["labels"] = labels
        if metadata is not None: self._values["metadata"] = metadata
        if metadata_startup_script is not None: self._values["metadata_startup_script"] = metadata_startup_script
        if min_cpu_platform is not None: self._values["min_cpu_platform"] = min_cpu_platform
        if project is not None: self._values["project"] = project
        if resource_policies is not None: self._values["resource_policies"] = resource_policies
        if scheduling is not None: self._values["scheduling"] = scheduling
        if scratch_disk is not None: self._values["scratch_disk"] = scratch_disk
        if service_account is not None: self._values["service_account"] = service_account
        if shielded_instance_config is not None: self._values["shielded_instance_config"] = shielded_instance_config
        if tags is not None: self._values["tags"] = tags
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def boot_disk(self) -> typing.List["ComputeInstanceBootDisk"]:
        """boot_disk block."""
        return self._values.get('boot_disk')

    @builtins.property
    def machine_type(self) -> str:
        """The machine type to create."""
        return self._values.get('machine_type')

    @builtins.property
    def name(self) -> str:
        """The name of the instance.

        One of name or self_link must be provided.
        """
        return self._values.get('name')

    @builtins.property
    def network_interface(self) -> typing.List["ComputeInstanceNetworkInterface"]:
        """network_interface block."""
        return self._values.get('network_interface')

    @builtins.property
    def allow_stopping_for_update(self) -> typing.Optional[bool]:
        """If true, allows Terraform to stop the instance to update its properties.

        If you try to update a property that requires stopping the instance without setting this field, the update will fail.
        """
        return self._values.get('allow_stopping_for_update')

    @builtins.property
    def attached_disk(self) -> typing.Optional[typing.List["ComputeInstanceAttachedDisk"]]:
        """attached_disk block."""
        return self._values.get('attached_disk')

    @builtins.property
    def can_ip_forward(self) -> typing.Optional[bool]:
        """Whether sending and receiving of packets with non-matching source or destination IPs is allowed."""
        return self._values.get('can_ip_forward')

    @builtins.property
    def deletion_protection(self) -> typing.Optional[bool]:
        """Whether deletion protection is enabled on this instance."""
        return self._values.get('deletion_protection')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A brief description of the resource."""
        return self._values.get('description')

    @builtins.property
    def desired_status(self) -> typing.Optional[str]:
        """Desired status of the instance.

        Either "RUNNING" or "TERMINATED".
        """
        return self._values.get('desired_status')

    @builtins.property
    def enable_display(self) -> typing.Optional[bool]:
        """Whether the instance has virtual displays enabled."""
        return self._values.get('enable_display')

    @builtins.property
    def guest_accelerator(self) -> typing.Optional[typing.List["ComputeInstanceGuestAccelerator"]]:
        """List of the type and count of accelerator cards attached to the instance."""
        return self._values.get('guest_accelerator')

    @builtins.property
    def hostname(self) -> typing.Optional[str]:
        """A custom hostname for the instance.

        Must be a fully qualified DNS name and RFC-1035-valid. Valid format is a series of labels 1-63 characters long matching the regular expression `a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_, concatenated with periods. The entire hostname must not exceed 253 characters. Changing this forces a new resource to be created.
        """
        return self._values.get('hostname')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value label pairs assigned to the instance."""
        return self._values.get('labels')

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Metadata key/value pairs made available within the instance."""
        return self._values.get('metadata')

    @builtins.property
    def metadata_startup_script(self) -> typing.Optional[str]:
        """Metadata startup scripts made available within the instance."""
        return self._values.get('metadata_startup_script')

    @builtins.property
    def min_cpu_platform(self) -> typing.Optional[str]:
        """The minimum CPU platform specified for the VM instance."""
        return self._values.get('min_cpu_platform')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If self_link is provided, this value is ignored. If neither self_link nor project are provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def resource_policies(self) -> typing.Optional[typing.List[str]]:
        """A list of short names or self_links of resource policies to attach to the instance.

        Modifying this list will cause the instance to recreate. Currently a max of 1 resource policy is supported.
        """
        return self._values.get('resource_policies')

    @builtins.property
    def scheduling(self) -> typing.Optional[typing.List["ComputeInstanceScheduling"]]:
        """scheduling block."""
        return self._values.get('scheduling')

    @builtins.property
    def scratch_disk(self) -> typing.Optional[typing.List["ComputeInstanceScratchDisk"]]:
        """scratch_disk block."""
        return self._values.get('scratch_disk')

    @builtins.property
    def service_account(self) -> typing.Optional[typing.List["ComputeInstanceServiceAccount"]]:
        """service_account block."""
        return self._values.get('service_account')

    @builtins.property
    def shielded_instance_config(self) -> typing.Optional[typing.List["ComputeInstanceShieldedInstanceConfig"]]:
        """shielded_instance_config block."""
        return self._values.get('shielded_instance_config')

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[str]]:
        """The list of tags attached to the instance."""
        return self._values.get('tags')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeInstanceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The zone of the instance.

        If self_link is provided, this value is ignored. If neither self_link nor zone are provided, the provider zone is used.
        """
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeInstanceFromTemplate(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplate"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, source_instance_template: str, allow_stopping_for_update: typing.Optional[bool]=None, attached_disk: typing.Optional[typing.List["ComputeInstanceFromTemplateAttachedDisk"]]=None, boot_disk: typing.Optional[typing.List["ComputeInstanceFromTemplateBootDisk"]]=None, can_ip_forward: typing.Optional[bool]=None, deletion_protection: typing.Optional[bool]=None, description: typing.Optional[str]=None, desired_status: typing.Optional[str]=None, enable_display: typing.Optional[bool]=None, guest_accelerator: typing.Optional[typing.List["ComputeInstanceFromTemplateGuestAccelerator"]]=None, hostname: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, machine_type: typing.Optional[str]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, metadata_startup_script: typing.Optional[str]=None, min_cpu_platform: typing.Optional[str]=None, network_interface: typing.Optional[typing.List["ComputeInstanceFromTemplateNetworkInterface"]]=None, project: typing.Optional[str]=None, resource_policies: typing.Optional[typing.List[str]]=None, scheduling: typing.Optional[typing.List["ComputeInstanceFromTemplateScheduling"]]=None, scratch_disk: typing.Optional[typing.List["ComputeInstanceFromTemplateScratchDisk"]]=None, service_account: typing.Optional[typing.List["ComputeInstanceFromTemplateServiceAccount"]]=None, shielded_instance_config: typing.Optional[typing.List["ComputeInstanceFromTemplateShieldedInstanceConfig"]]=None, tags: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["ComputeInstanceFromTemplateTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the instance. One of name or self_link must be provided.
        :param source_instance_template: Name or self link of an instance template to create the instance based on.
        :param allow_stopping_for_update: If true, allows Terraform to stop the instance to update its properties. If you try to update a property that requires stopping the instance without setting this field, the update will fail.
        :param attached_disk: List of disks attached to the instance.
        :param boot_disk: boot_disk block.
        :param can_ip_forward: Whether sending and receiving of packets with non-matching source or destination IPs is allowed.
        :param deletion_protection: Whether deletion protection is enabled on this instance.
        :param description: A brief description of the resource.
        :param desired_status: Desired status of the instance. Either "RUNNING" or "TERMINATED".
        :param enable_display: Whether the instance has virtual displays enabled.
        :param guest_accelerator: List of the type and count of accelerator cards attached to the instance.
        :param hostname: A custom hostname for the instance. Must be a fully qualified DNS name and RFC-1035-valid. Valid format is a series of labels 1-63 characters long matching the regular expression `a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_, concatenated with periods. The entire hostname must not exceed 253 characters. Changing this forces a new resource to be created.
        :param labels: A set of key/value label pairs assigned to the instance.
        :param machine_type: The machine type to create.
        :param metadata: Metadata key/value pairs made available within the instance.
        :param metadata_startup_script: Metadata startup scripts made available within the instance.
        :param min_cpu_platform: The minimum CPU platform specified for the VM instance.
        :param network_interface: network_interface block.
        :param project: The ID of the project in which the resource belongs. If self_link is provided, this value is ignored. If neither self_link nor project are provided, the provider project is used.
        :param resource_policies: A list of short names or self_links of resource policies to attach to the instance. Modifying this list will cause the instance to recreate. Currently a max of 1 resource policy is supported.
        :param scheduling: scheduling block.
        :param scratch_disk: The scratch disks attached to the instance.
        :param service_account: The service account to attach to the instance.
        :param shielded_instance_config: shielded_instance_config block.
        :param tags: The list of tags attached to the instance.
        :param timeouts: timeouts block.
        :param zone: The zone of the instance. If self_link is provided, this value is ignored. If neither self_link nor zone are provided, the provider zone is used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeInstanceFromTemplateConfig(name=name, source_instance_template=source_instance_template, allow_stopping_for_update=allow_stopping_for_update, attached_disk=attached_disk, boot_disk=boot_disk, can_ip_forward=can_ip_forward, deletion_protection=deletion_protection, description=description, desired_status=desired_status, enable_display=enable_display, guest_accelerator=guest_accelerator, hostname=hostname, labels=labels, machine_type=machine_type, metadata=metadata, metadata_startup_script=metadata_startup_script, min_cpu_platform=min_cpu_platform, network_interface=network_interface, project=project, resource_policies=resource_policies, scheduling=scheduling, scratch_disk=scratch_disk, service_account=service_account, shielded_instance_config=shielded_instance_config, tags=tags, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeInstanceFromTemplate, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="cpuPlatform")
    def cpu_platform(self) -> str:
        return jsii.get(self, "cpuPlatform")

    @builtins.property
    @jsii.member(jsii_name="currentStatus")
    def current_status(self) -> str:
        return jsii.get(self, "currentStatus")

    @builtins.property
    @jsii.member(jsii_name="instanceId")
    def instance_id(self) -> str:
        return jsii.get(self, "instanceId")

    @builtins.property
    @jsii.member(jsii_name="labelFingerprint")
    def label_fingerprint(self) -> str:
        return jsii.get(self, "labelFingerprint")

    @builtins.property
    @jsii.member(jsii_name="metadataFingerprint")
    def metadata_fingerprint(self) -> str:
        return jsii.get(self, "metadataFingerprint")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="tagsFingerprint")
    def tags_fingerprint(self) -> str:
        return jsii.get(self, "tagsFingerprint")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="sourceInstanceTemplate")
    def source_instance_template(self) -> str:
        return jsii.get(self, "sourceInstanceTemplate")

    @source_instance_template.setter
    def source_instance_template(self, value: str) -> None:
        jsii.set(self, "sourceInstanceTemplate", value)

    @builtins.property
    @jsii.member(jsii_name="allowStoppingForUpdate")
    def allow_stopping_for_update(self) -> typing.Optional[bool]:
        return jsii.get(self, "allowStoppingForUpdate")

    @allow_stopping_for_update.setter
    def allow_stopping_for_update(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "allowStoppingForUpdate", value)

    @builtins.property
    @jsii.member(jsii_name="attachedDisk")
    def attached_disk(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateAttachedDisk"]]:
        return jsii.get(self, "attachedDisk")

    @attached_disk.setter
    def attached_disk(self, value: typing.Optional[typing.List["ComputeInstanceFromTemplateAttachedDisk"]]) -> None:
        jsii.set(self, "attachedDisk", value)

    @builtins.property
    @jsii.member(jsii_name="bootDisk")
    def boot_disk(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateBootDisk"]]:
        return jsii.get(self, "bootDisk")

    @boot_disk.setter
    def boot_disk(self, value: typing.Optional[typing.List["ComputeInstanceFromTemplateBootDisk"]]) -> None:
        jsii.set(self, "bootDisk", value)

    @builtins.property
    @jsii.member(jsii_name="canIpForward")
    def can_ip_forward(self) -> typing.Optional[bool]:
        return jsii.get(self, "canIpForward")

    @can_ip_forward.setter
    def can_ip_forward(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "canIpForward", value)

    @builtins.property
    @jsii.member(jsii_name="deletionProtection")
    def deletion_protection(self) -> typing.Optional[bool]:
        return jsii.get(self, "deletionProtection")

    @deletion_protection.setter
    def deletion_protection(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "deletionProtection", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="desiredStatus")
    def desired_status(self) -> typing.Optional[str]:
        return jsii.get(self, "desiredStatus")

    @desired_status.setter
    def desired_status(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "desiredStatus", value)

    @builtins.property
    @jsii.member(jsii_name="enableDisplay")
    def enable_display(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableDisplay")

    @enable_display.setter
    def enable_display(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableDisplay", value)

    @builtins.property
    @jsii.member(jsii_name="guestAccelerator")
    def guest_accelerator(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateGuestAccelerator"]]:
        return jsii.get(self, "guestAccelerator")

    @guest_accelerator.setter
    def guest_accelerator(self, value: typing.Optional[typing.List["ComputeInstanceFromTemplateGuestAccelerator"]]) -> None:
        jsii.set(self, "guestAccelerator", value)

    @builtins.property
    @jsii.member(jsii_name="hostname")
    def hostname(self) -> typing.Optional[str]:
        return jsii.get(self, "hostname")

    @hostname.setter
    def hostname(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "hostname", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="machineType")
    def machine_type(self) -> typing.Optional[str]:
        return jsii.get(self, "machineType")

    @machine_type.setter
    def machine_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "machineType", value)

    @builtins.property
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "metadata")

    @metadata.setter
    def metadata(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property
    @jsii.member(jsii_name="metadataStartupScript")
    def metadata_startup_script(self) -> typing.Optional[str]:
        return jsii.get(self, "metadataStartupScript")

    @metadata_startup_script.setter
    def metadata_startup_script(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "metadataStartupScript", value)

    @builtins.property
    @jsii.member(jsii_name="minCpuPlatform")
    def min_cpu_platform(self) -> typing.Optional[str]:
        return jsii.get(self, "minCpuPlatform")

    @min_cpu_platform.setter
    def min_cpu_platform(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "minCpuPlatform", value)

    @builtins.property
    @jsii.member(jsii_name="networkInterface")
    def network_interface(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateNetworkInterface"]]:
        return jsii.get(self, "networkInterface")

    @network_interface.setter
    def network_interface(self, value: typing.Optional[typing.List["ComputeInstanceFromTemplateNetworkInterface"]]) -> None:
        jsii.set(self, "networkInterface", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="resourcePolicies")
    def resource_policies(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "resourcePolicies")

    @resource_policies.setter
    def resource_policies(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "resourcePolicies", value)

    @builtins.property
    @jsii.member(jsii_name="scheduling")
    def scheduling(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateScheduling"]]:
        return jsii.get(self, "scheduling")

    @scheduling.setter
    def scheduling(self, value: typing.Optional[typing.List["ComputeInstanceFromTemplateScheduling"]]) -> None:
        jsii.set(self, "scheduling", value)

    @builtins.property
    @jsii.member(jsii_name="scratchDisk")
    def scratch_disk(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateScratchDisk"]]:
        return jsii.get(self, "scratchDisk")

    @scratch_disk.setter
    def scratch_disk(self, value: typing.Optional[typing.List["ComputeInstanceFromTemplateScratchDisk"]]) -> None:
        jsii.set(self, "scratchDisk", value)

    @builtins.property
    @jsii.member(jsii_name="serviceAccount")
    def service_account(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateServiceAccount"]]:
        return jsii.get(self, "serviceAccount")

    @service_account.setter
    def service_account(self, value: typing.Optional[typing.List["ComputeInstanceFromTemplateServiceAccount"]]) -> None:
        jsii.set(self, "serviceAccount", value)

    @builtins.property
    @jsii.member(jsii_name="shieldedInstanceConfig")
    def shielded_instance_config(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateShieldedInstanceConfig"]]:
        return jsii.get(self, "shieldedInstanceConfig")

    @shielded_instance_config.setter
    def shielded_instance_config(self, value: typing.Optional[typing.List["ComputeInstanceFromTemplateShieldedInstanceConfig"]]) -> None:
        jsii.set(self, "shieldedInstanceConfig", value)

    @builtins.property
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "tags")

    @tags.setter
    def tags(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeInstanceFromTemplateTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeInstanceFromTemplateTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateAttachedDisk", jsii_struct_bases=[], name_mapping={'device_name': 'deviceName', 'disk_encryption_key_raw': 'diskEncryptionKeyRaw', 'disk_encryption_key_sha256': 'diskEncryptionKeySha256', 'kms_key_self_link': 'kmsKeySelfLink', 'mode': 'mode', 'source': 'source'})
class ComputeInstanceFromTemplateAttachedDisk():
    def __init__(self, *, device_name: typing.Optional[str]=None, disk_encryption_key_raw: typing.Optional[str]=None, disk_encryption_key_sha256: typing.Optional[str]=None, kms_key_self_link: typing.Optional[str]=None, mode: typing.Optional[str]=None, source: typing.Optional[str]=None) -> None:
        """
        :param device_name: 
        :param disk_encryption_key_raw: 
        :param disk_encryption_key_sha256: 
        :param kms_key_self_link: 
        :param mode: 
        :param source: 
        """
        self._values = {
        }
        if device_name is not None: self._values["device_name"] = device_name
        if disk_encryption_key_raw is not None: self._values["disk_encryption_key_raw"] = disk_encryption_key_raw
        if disk_encryption_key_sha256 is not None: self._values["disk_encryption_key_sha256"] = disk_encryption_key_sha256
        if kms_key_self_link is not None: self._values["kms_key_self_link"] = kms_key_self_link
        if mode is not None: self._values["mode"] = mode
        if source is not None: self._values["source"] = source

    @builtins.property
    def device_name(self) -> typing.Optional[str]:
        return self._values.get('device_name')

    @builtins.property
    def disk_encryption_key_raw(self) -> typing.Optional[str]:
        return self._values.get('disk_encryption_key_raw')

    @builtins.property
    def disk_encryption_key_sha256(self) -> typing.Optional[str]:
        return self._values.get('disk_encryption_key_sha256')

    @builtins.property
    def kms_key_self_link(self) -> typing.Optional[str]:
        return self._values.get('kms_key_self_link')

    @builtins.property
    def mode(self) -> typing.Optional[str]:
        return self._values.get('mode')

    @builtins.property
    def source(self) -> typing.Optional[str]:
        return self._values.get('source')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateAttachedDisk(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateBootDisk", jsii_struct_bases=[], name_mapping={'auto_delete': 'autoDelete', 'device_name': 'deviceName', 'disk_encryption_key_raw': 'diskEncryptionKeyRaw', 'initialize_params': 'initializeParams', 'kms_key_self_link': 'kmsKeySelfLink', 'mode': 'mode', 'source': 'source'})
class ComputeInstanceFromTemplateBootDisk():
    def __init__(self, *, auto_delete: typing.Optional[bool]=None, device_name: typing.Optional[str]=None, disk_encryption_key_raw: typing.Optional[str]=None, initialize_params: typing.Optional[typing.List["ComputeInstanceFromTemplateBootDiskInitializeParams"]]=None, kms_key_self_link: typing.Optional[str]=None, mode: typing.Optional[str]=None, source: typing.Optional[str]=None) -> None:
        """
        :param auto_delete: Whether the disk will be auto-deleted when the instance is deleted.
        :param device_name: Name with which attached disk will be accessible under /dev/disk/by-id/.
        :param disk_encryption_key_raw: A 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to encrypt this disk. Only one of kms_key_self_link and disk_encryption_key_raw may be set.
        :param initialize_params: initialize_params block.
        :param kms_key_self_link: The self_link of the encryption key that is stored in Google Cloud KMS to encrypt this disk. Only one of kms_key_self_link and disk_encryption_key_raw may be set.
        :param mode: Read/write mode for the disk. One of "READ_ONLY" or "READ_WRITE".
        :param source: The name or self_link of the disk attached to this instance.
        """
        self._values = {
        }
        if auto_delete is not None: self._values["auto_delete"] = auto_delete
        if device_name is not None: self._values["device_name"] = device_name
        if disk_encryption_key_raw is not None: self._values["disk_encryption_key_raw"] = disk_encryption_key_raw
        if initialize_params is not None: self._values["initialize_params"] = initialize_params
        if kms_key_self_link is not None: self._values["kms_key_self_link"] = kms_key_self_link
        if mode is not None: self._values["mode"] = mode
        if source is not None: self._values["source"] = source

    @builtins.property
    def auto_delete(self) -> typing.Optional[bool]:
        """Whether the disk will be auto-deleted when the instance is deleted."""
        return self._values.get('auto_delete')

    @builtins.property
    def device_name(self) -> typing.Optional[str]:
        """Name with which attached disk will be accessible under /dev/disk/by-id/."""
        return self._values.get('device_name')

    @builtins.property
    def disk_encryption_key_raw(self) -> typing.Optional[str]:
        """A 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to encrypt this disk.

        Only one of kms_key_self_link and disk_encryption_key_raw may be set.
        """
        return self._values.get('disk_encryption_key_raw')

    @builtins.property
    def initialize_params(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateBootDiskInitializeParams"]]:
        """initialize_params block."""
        return self._values.get('initialize_params')

    @builtins.property
    def kms_key_self_link(self) -> typing.Optional[str]:
        """The self_link of the encryption key that is stored in Google Cloud KMS to encrypt this disk.

        Only one of kms_key_self_link and disk_encryption_key_raw may be set.
        """
        return self._values.get('kms_key_self_link')

    @builtins.property
    def mode(self) -> typing.Optional[str]:
        """Read/write mode for the disk.

        One of "READ_ONLY" or "READ_WRITE".
        """
        return self._values.get('mode')

    @builtins.property
    def source(self) -> typing.Optional[str]:
        """The name or self_link of the disk attached to this instance."""
        return self._values.get('source')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateBootDisk(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateBootDiskInitializeParams", jsii_struct_bases=[], name_mapping={'image': 'image', 'labels': 'labels', 'size': 'size', 'type': 'type'})
class ComputeInstanceFromTemplateBootDiskInitializeParams():
    def __init__(self, *, image: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, size: typing.Optional[jsii.Number]=None, type: typing.Optional[str]=None) -> None:
        """
        :param image: The image from which this disk was initialised.
        :param labels: A set of key/value label pairs assigned to the disk.
        :param size: The size of the image in gigabytes.
        :param type: The GCE disk type. One of pd-standard or pd-ssd.
        """
        self._values = {
        }
        if image is not None: self._values["image"] = image
        if labels is not None: self._values["labels"] = labels
        if size is not None: self._values["size"] = size
        if type is not None: self._values["type"] = type

    @builtins.property
    def image(self) -> typing.Optional[str]:
        """The image from which this disk was initialised."""
        return self._values.get('image')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value label pairs assigned to the disk."""
        return self._values.get('labels')

    @builtins.property
    def size(self) -> typing.Optional[jsii.Number]:
        """The size of the image in gigabytes."""
        return self._values.get('size')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        """The GCE disk type.

        One of pd-standard or pd-ssd.
        """
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateBootDiskInitializeParams(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'source_instance_template': 'sourceInstanceTemplate', 'allow_stopping_for_update': 'allowStoppingForUpdate', 'attached_disk': 'attachedDisk', 'boot_disk': 'bootDisk', 'can_ip_forward': 'canIpForward', 'deletion_protection': 'deletionProtection', 'description': 'description', 'desired_status': 'desiredStatus', 'enable_display': 'enableDisplay', 'guest_accelerator': 'guestAccelerator', 'hostname': 'hostname', 'labels': 'labels', 'machine_type': 'machineType', 'metadata': 'metadata', 'metadata_startup_script': 'metadataStartupScript', 'min_cpu_platform': 'minCpuPlatform', 'network_interface': 'networkInterface', 'project': 'project', 'resource_policies': 'resourcePolicies', 'scheduling': 'scheduling', 'scratch_disk': 'scratchDisk', 'service_account': 'serviceAccount', 'shielded_instance_config': 'shieldedInstanceConfig', 'tags': 'tags', 'timeouts': 'timeouts', 'zone': 'zone'})
class ComputeInstanceFromTemplateConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, source_instance_template: str, allow_stopping_for_update: typing.Optional[bool]=None, attached_disk: typing.Optional[typing.List["ComputeInstanceFromTemplateAttachedDisk"]]=None, boot_disk: typing.Optional[typing.List["ComputeInstanceFromTemplateBootDisk"]]=None, can_ip_forward: typing.Optional[bool]=None, deletion_protection: typing.Optional[bool]=None, description: typing.Optional[str]=None, desired_status: typing.Optional[str]=None, enable_display: typing.Optional[bool]=None, guest_accelerator: typing.Optional[typing.List["ComputeInstanceFromTemplateGuestAccelerator"]]=None, hostname: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, machine_type: typing.Optional[str]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, metadata_startup_script: typing.Optional[str]=None, min_cpu_platform: typing.Optional[str]=None, network_interface: typing.Optional[typing.List["ComputeInstanceFromTemplateNetworkInterface"]]=None, project: typing.Optional[str]=None, resource_policies: typing.Optional[typing.List[str]]=None, scheduling: typing.Optional[typing.List["ComputeInstanceFromTemplateScheduling"]]=None, scratch_disk: typing.Optional[typing.List["ComputeInstanceFromTemplateScratchDisk"]]=None, service_account: typing.Optional[typing.List["ComputeInstanceFromTemplateServiceAccount"]]=None, shielded_instance_config: typing.Optional[typing.List["ComputeInstanceFromTemplateShieldedInstanceConfig"]]=None, tags: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["ComputeInstanceFromTemplateTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the instance. One of name or self_link must be provided.
        :param source_instance_template: Name or self link of an instance template to create the instance based on.
        :param allow_stopping_for_update: If true, allows Terraform to stop the instance to update its properties. If you try to update a property that requires stopping the instance without setting this field, the update will fail.
        :param attached_disk: List of disks attached to the instance.
        :param boot_disk: boot_disk block.
        :param can_ip_forward: Whether sending and receiving of packets with non-matching source or destination IPs is allowed.
        :param deletion_protection: Whether deletion protection is enabled on this instance.
        :param description: A brief description of the resource.
        :param desired_status: Desired status of the instance. Either "RUNNING" or "TERMINATED".
        :param enable_display: Whether the instance has virtual displays enabled.
        :param guest_accelerator: List of the type and count of accelerator cards attached to the instance.
        :param hostname: A custom hostname for the instance. Must be a fully qualified DNS name and RFC-1035-valid. Valid format is a series of labels 1-63 characters long matching the regular expression `a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_, concatenated with periods. The entire hostname must not exceed 253 characters. Changing this forces a new resource to be created.
        :param labels: A set of key/value label pairs assigned to the instance.
        :param machine_type: The machine type to create.
        :param metadata: Metadata key/value pairs made available within the instance.
        :param metadata_startup_script: Metadata startup scripts made available within the instance.
        :param min_cpu_platform: The minimum CPU platform specified for the VM instance.
        :param network_interface: network_interface block.
        :param project: The ID of the project in which the resource belongs. If self_link is provided, this value is ignored. If neither self_link nor project are provided, the provider project is used.
        :param resource_policies: A list of short names or self_links of resource policies to attach to the instance. Modifying this list will cause the instance to recreate. Currently a max of 1 resource policy is supported.
        :param scheduling: scheduling block.
        :param scratch_disk: The scratch disks attached to the instance.
        :param service_account: The service account to attach to the instance.
        :param shielded_instance_config: shielded_instance_config block.
        :param tags: The list of tags attached to the instance.
        :param timeouts: timeouts block.
        :param zone: The zone of the instance. If self_link is provided, this value is ignored. If neither self_link nor zone are provided, the provider zone is used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeInstanceFromTemplateTimeouts(**timeouts)
        self._values = {
            'name': name,
            'source_instance_template': source_instance_template,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if allow_stopping_for_update is not None: self._values["allow_stopping_for_update"] = allow_stopping_for_update
        if attached_disk is not None: self._values["attached_disk"] = attached_disk
        if boot_disk is not None: self._values["boot_disk"] = boot_disk
        if can_ip_forward is not None: self._values["can_ip_forward"] = can_ip_forward
        if deletion_protection is not None: self._values["deletion_protection"] = deletion_protection
        if description is not None: self._values["description"] = description
        if desired_status is not None: self._values["desired_status"] = desired_status
        if enable_display is not None: self._values["enable_display"] = enable_display
        if guest_accelerator is not None: self._values["guest_accelerator"] = guest_accelerator
        if hostname is not None: self._values["hostname"] = hostname
        if labels is not None: self._values["labels"] = labels
        if machine_type is not None: self._values["machine_type"] = machine_type
        if metadata is not None: self._values["metadata"] = metadata
        if metadata_startup_script is not None: self._values["metadata_startup_script"] = metadata_startup_script
        if min_cpu_platform is not None: self._values["min_cpu_platform"] = min_cpu_platform
        if network_interface is not None: self._values["network_interface"] = network_interface
        if project is not None: self._values["project"] = project
        if resource_policies is not None: self._values["resource_policies"] = resource_policies
        if scheduling is not None: self._values["scheduling"] = scheduling
        if scratch_disk is not None: self._values["scratch_disk"] = scratch_disk
        if service_account is not None: self._values["service_account"] = service_account
        if shielded_instance_config is not None: self._values["shielded_instance_config"] = shielded_instance_config
        if tags is not None: self._values["tags"] = tags
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name of the instance.

        One of name or self_link must be provided.
        """
        return self._values.get('name')

    @builtins.property
    def source_instance_template(self) -> str:
        """Name or self link of an instance template to create the instance based on."""
        return self._values.get('source_instance_template')

    @builtins.property
    def allow_stopping_for_update(self) -> typing.Optional[bool]:
        """If true, allows Terraform to stop the instance to update its properties.

        If you try to update a property that requires stopping the instance without setting this field, the update will fail.
        """
        return self._values.get('allow_stopping_for_update')

    @builtins.property
    def attached_disk(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateAttachedDisk"]]:
        """List of disks attached to the instance."""
        return self._values.get('attached_disk')

    @builtins.property
    def boot_disk(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateBootDisk"]]:
        """boot_disk block."""
        return self._values.get('boot_disk')

    @builtins.property
    def can_ip_forward(self) -> typing.Optional[bool]:
        """Whether sending and receiving of packets with non-matching source or destination IPs is allowed."""
        return self._values.get('can_ip_forward')

    @builtins.property
    def deletion_protection(self) -> typing.Optional[bool]:
        """Whether deletion protection is enabled on this instance."""
        return self._values.get('deletion_protection')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A brief description of the resource."""
        return self._values.get('description')

    @builtins.property
    def desired_status(self) -> typing.Optional[str]:
        """Desired status of the instance.

        Either "RUNNING" or "TERMINATED".
        """
        return self._values.get('desired_status')

    @builtins.property
    def enable_display(self) -> typing.Optional[bool]:
        """Whether the instance has virtual displays enabled."""
        return self._values.get('enable_display')

    @builtins.property
    def guest_accelerator(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateGuestAccelerator"]]:
        """List of the type and count of accelerator cards attached to the instance."""
        return self._values.get('guest_accelerator')

    @builtins.property
    def hostname(self) -> typing.Optional[str]:
        """A custom hostname for the instance.

        Must be a fully qualified DNS name and RFC-1035-valid. Valid format is a series of labels 1-63 characters long matching the regular expression `a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_, concatenated with periods. The entire hostname must not exceed 253 characters. Changing this forces a new resource to be created.
        """
        return self._values.get('hostname')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value label pairs assigned to the instance."""
        return self._values.get('labels')

    @builtins.property
    def machine_type(self) -> typing.Optional[str]:
        """The machine type to create."""
        return self._values.get('machine_type')

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Metadata key/value pairs made available within the instance."""
        return self._values.get('metadata')

    @builtins.property
    def metadata_startup_script(self) -> typing.Optional[str]:
        """Metadata startup scripts made available within the instance."""
        return self._values.get('metadata_startup_script')

    @builtins.property
    def min_cpu_platform(self) -> typing.Optional[str]:
        """The minimum CPU platform specified for the VM instance."""
        return self._values.get('min_cpu_platform')

    @builtins.property
    def network_interface(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateNetworkInterface"]]:
        """network_interface block."""
        return self._values.get('network_interface')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If self_link is provided, this value is ignored. If neither self_link nor project are provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def resource_policies(self) -> typing.Optional[typing.List[str]]:
        """A list of short names or self_links of resource policies to attach to the instance.

        Modifying this list will cause the instance to recreate. Currently a max of 1 resource policy is supported.
        """
        return self._values.get('resource_policies')

    @builtins.property
    def scheduling(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateScheduling"]]:
        """scheduling block."""
        return self._values.get('scheduling')

    @builtins.property
    def scratch_disk(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateScratchDisk"]]:
        """The scratch disks attached to the instance."""
        return self._values.get('scratch_disk')

    @builtins.property
    def service_account(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateServiceAccount"]]:
        """The service account to attach to the instance."""
        return self._values.get('service_account')

    @builtins.property
    def shielded_instance_config(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateShieldedInstanceConfig"]]:
        """shielded_instance_config block."""
        return self._values.get('shielded_instance_config')

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[str]]:
        """The list of tags attached to the instance."""
        return self._values.get('tags')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeInstanceFromTemplateTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The zone of the instance.

        If self_link is provided, this value is ignored. If neither self_link nor zone are provided, the provider zone is used.
        """
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateGuestAccelerator", jsii_struct_bases=[], name_mapping={'count': 'count', 'type': 'type'})
class ComputeInstanceFromTemplateGuestAccelerator():
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, type: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param type: 
        """
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if type is not None: self._values["type"] = type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        return self._values.get('count')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateGuestAccelerator(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateNetworkInterface", jsii_struct_bases=[], name_mapping={'access_config': 'accessConfig', 'alias_ip_range': 'aliasIpRange', 'network': 'network', 'network_ip': 'networkIp', 'subnetwork': 'subnetwork', 'subnetwork_project': 'subnetworkProject'})
class ComputeInstanceFromTemplateNetworkInterface():
    def __init__(self, *, access_config: typing.Optional[typing.List["ComputeInstanceFromTemplateNetworkInterfaceAccessConfig"]]=None, alias_ip_range: typing.Optional[typing.List["ComputeInstanceFromTemplateNetworkInterfaceAliasIpRange"]]=None, network: typing.Optional[str]=None, network_ip: typing.Optional[str]=None, subnetwork: typing.Optional[str]=None, subnetwork_project: typing.Optional[str]=None) -> None:
        """
        :param access_config: Access configurations, i.e. IPs via which this instance can be accessed via the Internet.
        :param alias_ip_range: An array of alias IP ranges for this network interface.
        :param network: The name or self_link of the network attached to this interface.
        :param network_ip: The private IP address assigned to the instance.
        :param subnetwork: The name or self_link of the subnetwork attached to this interface.
        :param subnetwork_project: The project in which the subnetwork belongs.
        """
        self._values = {
        }
        if access_config is not None: self._values["access_config"] = access_config
        if alias_ip_range is not None: self._values["alias_ip_range"] = alias_ip_range
        if network is not None: self._values["network"] = network
        if network_ip is not None: self._values["network_ip"] = network_ip
        if subnetwork is not None: self._values["subnetwork"] = subnetwork
        if subnetwork_project is not None: self._values["subnetwork_project"] = subnetwork_project

    @builtins.property
    def access_config(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateNetworkInterfaceAccessConfig"]]:
        """Access configurations, i.e. IPs via which this instance can be accessed via the Internet."""
        return self._values.get('access_config')

    @builtins.property
    def alias_ip_range(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateNetworkInterfaceAliasIpRange"]]:
        """An array of alias IP ranges for this network interface."""
        return self._values.get('alias_ip_range')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """The name or self_link of the network attached to this interface."""
        return self._values.get('network')

    @builtins.property
    def network_ip(self) -> typing.Optional[str]:
        """The private IP address assigned to the instance."""
        return self._values.get('network_ip')

    @builtins.property
    def subnetwork(self) -> typing.Optional[str]:
        """The name or self_link of the subnetwork attached to this interface."""
        return self._values.get('subnetwork')

    @builtins.property
    def subnetwork_project(self) -> typing.Optional[str]:
        """The project in which the subnetwork belongs."""
        return self._values.get('subnetwork_project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateNetworkInterface(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateNetworkInterfaceAccessConfig", jsii_struct_bases=[], name_mapping={'nat_ip': 'natIp', 'network_tier': 'networkTier', 'public_ptr_domain_name': 'publicPtrDomainName'})
class ComputeInstanceFromTemplateNetworkInterfaceAccessConfig():
    def __init__(self, *, nat_ip: typing.Optional[str]=None, network_tier: typing.Optional[str]=None, public_ptr_domain_name: typing.Optional[str]=None) -> None:
        """
        :param nat_ip: 
        :param network_tier: 
        :param public_ptr_domain_name: 
        """
        self._values = {
        }
        if nat_ip is not None: self._values["nat_ip"] = nat_ip
        if network_tier is not None: self._values["network_tier"] = network_tier
        if public_ptr_domain_name is not None: self._values["public_ptr_domain_name"] = public_ptr_domain_name

    @builtins.property
    def nat_ip(self) -> typing.Optional[str]:
        return self._values.get('nat_ip')

    @builtins.property
    def network_tier(self) -> typing.Optional[str]:
        return self._values.get('network_tier')

    @builtins.property
    def public_ptr_domain_name(self) -> typing.Optional[str]:
        return self._values.get('public_ptr_domain_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateNetworkInterfaceAccessConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateNetworkInterfaceAliasIpRange", jsii_struct_bases=[], name_mapping={'ip_cidr_range': 'ipCidrRange', 'subnetwork_range_name': 'subnetworkRangeName'})
class ComputeInstanceFromTemplateNetworkInterfaceAliasIpRange():
    def __init__(self, *, ip_cidr_range: typing.Optional[str]=None, subnetwork_range_name: typing.Optional[str]=None) -> None:
        """
        :param ip_cidr_range: 
        :param subnetwork_range_name: 
        """
        self._values = {
        }
        if ip_cidr_range is not None: self._values["ip_cidr_range"] = ip_cidr_range
        if subnetwork_range_name is not None: self._values["subnetwork_range_name"] = subnetwork_range_name

    @builtins.property
    def ip_cidr_range(self) -> typing.Optional[str]:
        return self._values.get('ip_cidr_range')

    @builtins.property
    def subnetwork_range_name(self) -> typing.Optional[str]:
        return self._values.get('subnetwork_range_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateNetworkInterfaceAliasIpRange(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateScheduling", jsii_struct_bases=[], name_mapping={'automatic_restart': 'automaticRestart', 'node_affinities': 'nodeAffinities', 'on_host_maintenance': 'onHostMaintenance', 'preemptible': 'preemptible'})
class ComputeInstanceFromTemplateScheduling():
    def __init__(self, *, automatic_restart: typing.Optional[bool]=None, node_affinities: typing.Optional[typing.List["ComputeInstanceFromTemplateSchedulingNodeAffinities"]]=None, on_host_maintenance: typing.Optional[str]=None, preemptible: typing.Optional[bool]=None) -> None:
        """
        :param automatic_restart: Specifies if the instance should be restarted if it was terminated by Compute Engine (not a user).
        :param node_affinities: node_affinities block.
        :param on_host_maintenance: Describes maintenance behavior for the instance. One of MIGRATE or TERMINATE,
        :param preemptible: Whether the instance is preemptible.
        """
        self._values = {
        }
        if automatic_restart is not None: self._values["automatic_restart"] = automatic_restart
        if node_affinities is not None: self._values["node_affinities"] = node_affinities
        if on_host_maintenance is not None: self._values["on_host_maintenance"] = on_host_maintenance
        if preemptible is not None: self._values["preemptible"] = preemptible

    @builtins.property
    def automatic_restart(self) -> typing.Optional[bool]:
        """Specifies if the instance should be restarted if it was terminated by Compute Engine (not a user)."""
        return self._values.get('automatic_restart')

    @builtins.property
    def node_affinities(self) -> typing.Optional[typing.List["ComputeInstanceFromTemplateSchedulingNodeAffinities"]]:
        """node_affinities block."""
        return self._values.get('node_affinities')

    @builtins.property
    def on_host_maintenance(self) -> typing.Optional[str]:
        """Describes maintenance behavior for the instance.

        One of MIGRATE or TERMINATE,
        """
        return self._values.get('on_host_maintenance')

    @builtins.property
    def preemptible(self) -> typing.Optional[bool]:
        """Whether the instance is preemptible."""
        return self._values.get('preemptible')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateScheduling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateSchedulingNodeAffinities", jsii_struct_bases=[], name_mapping={'key': 'key', 'operator': 'operator', 'values': 'values'})
class ComputeInstanceFromTemplateSchedulingNodeAffinities():
    def __init__(self, *, key: str, operator: str, values: typing.List[str]) -> None:
        """
        :param key: 
        :param operator: 
        :param values: 
        """
        self._values = {
            'key': key,
            'operator': operator,
            'values': values,
        }

    @builtins.property
    def key(self) -> str:
        return self._values.get('key')

    @builtins.property
    def operator(self) -> str:
        return self._values.get('operator')

    @builtins.property
    def values(self) -> typing.List[str]:
        return self._values.get('values')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateSchedulingNodeAffinities(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateScratchDisk", jsii_struct_bases=[], name_mapping={'interface': 'interface'})
class ComputeInstanceFromTemplateScratchDisk():
    def __init__(self, *, interface: typing.Optional[str]=None) -> None:
        """
        :param interface: 
        """
        self._values = {
        }
        if interface is not None: self._values["interface"] = interface

    @builtins.property
    def interface(self) -> typing.Optional[str]:
        return self._values.get('interface')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateScratchDisk(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateServiceAccount", jsii_struct_bases=[], name_mapping={'email': 'email', 'scopes': 'scopes'})
class ComputeInstanceFromTemplateServiceAccount():
    def __init__(self, *, email: typing.Optional[str]=None, scopes: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param email: 
        :param scopes: 
        """
        self._values = {
        }
        if email is not None: self._values["email"] = email
        if scopes is not None: self._values["scopes"] = scopes

    @builtins.property
    def email(self) -> typing.Optional[str]:
        return self._values.get('email')

    @builtins.property
    def scopes(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('scopes')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateServiceAccount(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateShieldedInstanceConfig", jsii_struct_bases=[], name_mapping={'enable_integrity_monitoring': 'enableIntegrityMonitoring', 'enable_secure_boot': 'enableSecureBoot', 'enable_vtpm': 'enableVtpm'})
class ComputeInstanceFromTemplateShieldedInstanceConfig():
    def __init__(self, *, enable_integrity_monitoring: typing.Optional[bool]=None, enable_secure_boot: typing.Optional[bool]=None, enable_vtpm: typing.Optional[bool]=None) -> None:
        """
        :param enable_integrity_monitoring: Whether integrity monitoring is enabled for the instance.
        :param enable_secure_boot: Whether secure boot is enabled for the instance.
        :param enable_vtpm: Whether the instance uses vTPM.
        """
        self._values = {
        }
        if enable_integrity_monitoring is not None: self._values["enable_integrity_monitoring"] = enable_integrity_monitoring
        if enable_secure_boot is not None: self._values["enable_secure_boot"] = enable_secure_boot
        if enable_vtpm is not None: self._values["enable_vtpm"] = enable_vtpm

    @builtins.property
    def enable_integrity_monitoring(self) -> typing.Optional[bool]:
        """Whether integrity monitoring is enabled for the instance."""
        return self._values.get('enable_integrity_monitoring')

    @builtins.property
    def enable_secure_boot(self) -> typing.Optional[bool]:
        """Whether secure boot is enabled for the instance."""
        return self._values.get('enable_secure_boot')

    @builtins.property
    def enable_vtpm(self) -> typing.Optional[bool]:
        """Whether the instance uses vTPM."""
        return self._values.get('enable_vtpm')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateShieldedInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceFromTemplateTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeInstanceFromTemplateTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceFromTemplateTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeInstanceGroup(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeInstanceGroup"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, description: typing.Optional[str]=None, instances: typing.Optional[typing.List[str]]=None, named_port: typing.Optional[typing.List["ComputeInstanceGroupNamedPort"]]=None, network: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeInstanceGroupTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the instance group. Must be 1-63 characters long and comply with RFC1035. Supported characters include lowercase letters, numbers, and hyphens.
        :param description: An optional textual description of the instance group.
        :param instances: List of instances in the group. They should be given as self_link URLs. When adding instances they must all be in the same network and zone as the instance group.
        :param named_port: named_port block.
        :param network: The URL of the network the instance group is in. If this is different from the network where the instances are in, the creation fails. Defaults to the network where the instances are in (if neither network nor instances is specified, this field will be blank).
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        :param zone: The zone that this instance group should be created in.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeInstanceGroupConfig(name=name, description=description, instances=instances, named_port=named_port, network=network, project=project, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeInstanceGroup, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="size")
    def size(self) -> jsii.Number:
        return jsii.get(self, "size")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="instances")
    def instances(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "instances")

    @instances.setter
    def instances(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "instances", value)

    @builtins.property
    @jsii.member(jsii_name="namedPort")
    def named_port(self) -> typing.Optional[typing.List["ComputeInstanceGroupNamedPort"]]:
        return jsii.get(self, "namedPort")

    @named_port.setter
    def named_port(self, value: typing.Optional[typing.List["ComputeInstanceGroupNamedPort"]]) -> None:
        jsii.set(self, "namedPort", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> typing.Optional[str]:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeInstanceGroupTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeInstanceGroupTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGroupConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'description': 'description', 'instances': 'instances', 'named_port': 'namedPort', 'network': 'network', 'project': 'project', 'timeouts': 'timeouts', 'zone': 'zone'})
class ComputeInstanceGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, description: typing.Optional[str]=None, instances: typing.Optional[typing.List[str]]=None, named_port: typing.Optional[typing.List["ComputeInstanceGroupNamedPort"]]=None, network: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeInstanceGroupTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the instance group. Must be 1-63 characters long and comply with RFC1035. Supported characters include lowercase letters, numbers, and hyphens.
        :param description: An optional textual description of the instance group.
        :param instances: List of instances in the group. They should be given as self_link URLs. When adding instances they must all be in the same network and zone as the instance group.
        :param named_port: named_port block.
        :param network: The URL of the network the instance group is in. If this is different from the network where the instances are in, the creation fails. Defaults to the network where the instances are in (if neither network nor instances is specified, this field will be blank).
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        :param zone: The zone that this instance group should be created in.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeInstanceGroupTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if instances is not None: self._values["instances"] = instances
        if named_port is not None: self._values["named_port"] = named_port
        if network is not None: self._values["network"] = network
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name of the instance group.

        Must be 1-63 characters long and comply with RFC1035. Supported characters include lowercase letters, numbers, and hyphens.
        """
        return self._values.get('name')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional textual description of the instance group."""
        return self._values.get('description')

    @builtins.property
    def instances(self) -> typing.Optional[typing.List[str]]:
        """List of instances in the group.

        They should be given as self_link URLs. When adding instances they must all be in the same network and zone as the instance group.
        """
        return self._values.get('instances')

    @builtins.property
    def named_port(self) -> typing.Optional[typing.List["ComputeInstanceGroupNamedPort"]]:
        """named_port block."""
        return self._values.get('named_port')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """The URL of the network the instance group is in.

        If this is different from the network where the instances are in, the creation fails. Defaults to the network where the instances are in (if neither network nor instances is specified, this field will be blank).
        """
        return self._values.get('network')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeInstanceGroupTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The zone that this instance group should be created in."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGroupConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeInstanceGroupManager(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeInstanceGroupManager"):
    def __init__(self, scope: constructs.Construct, id: str, *, base_instance_name: str, name: str, version: typing.List["ComputeInstanceGroupManagerVersion"], auto_healing_policies: typing.Optional[typing.List["ComputeInstanceGroupManagerAutoHealingPolicies"]]=None, description: typing.Optional[str]=None, instance_template: typing.Optional[str]=None, named_port: typing.Optional[typing.List["ComputeInstanceGroupManagerNamedPort"]]=None, project: typing.Optional[str]=None, target_pools: typing.Optional[typing.List[str]]=None, target_size: typing.Optional[jsii.Number]=None, timeouts: typing.Optional["ComputeInstanceGroupManagerTimeouts"]=None, update_policy: typing.Optional[typing.List["ComputeInstanceGroupManagerUpdatePolicy"]]=None, wait_for_instances: typing.Optional[bool]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param base_instance_name: The base instance name to use for instances in this group. The value must be a valid RFC1035 name. Supported characters are lowercase letters, numbers, and hyphens (-). Instances are named by appending a hyphen and a random four-character string to the base instance name.
        :param name: The name of the instance group manager. Must be 1-63 characters long and comply with RFC1035. Supported characters include lowercase letters, numbers, and hyphens.
        :param version: version block.
        :param auto_healing_policies: auto_healing_policies block.
        :param description: An optional textual description of the instance group manager.
        :param instance_template: The full URL to an instance template from which all new instances of this version will be created.
        :param named_port: named_port block.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param target_pools: The full URL of all target pools to which new instances in the group are added. Updating the target pools attribute does not affect existing instances.
        :param target_size: The target number of running instances for this managed instance group. This value should always be explicitly set unless this resource is attached to an autoscaler, in which case it should never be set. Defaults to 0.
        :param timeouts: timeouts block.
        :param update_policy: update_policy block.
        :param wait_for_instances: Whether to wait for all instances to be created/updated before returning. Note that if this is set to true and the operation does not succeed, Terraform will continue trying until it times out.
        :param zone: The zone that instances in this group should be created in.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeInstanceGroupManagerConfig(base_instance_name=base_instance_name, name=name, version=version, auto_healing_policies=auto_healing_policies, description=description, instance_template=instance_template, named_port=named_port, project=project, target_pools=target_pools, target_size=target_size, timeouts=timeouts, update_policy=update_policy, wait_for_instances=wait_for_instances, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeInstanceGroupManager, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="fingerprint")
    def fingerprint(self) -> str:
        return jsii.get(self, "fingerprint")

    @builtins.property
    @jsii.member(jsii_name="instanceGroup")
    def instance_group(self) -> str:
        return jsii.get(self, "instanceGroup")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="updateStrategy")
    def update_strategy(self) -> str:
        return jsii.get(self, "updateStrategy")

    @builtins.property
    @jsii.member(jsii_name="baseInstanceName")
    def base_instance_name(self) -> str:
        return jsii.get(self, "baseInstanceName")

    @base_instance_name.setter
    def base_instance_name(self, value: str) -> None:
        jsii.set(self, "baseInstanceName", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> typing.List["ComputeInstanceGroupManagerVersion"]:
        return jsii.get(self, "version")

    @version.setter
    def version(self, value: typing.List["ComputeInstanceGroupManagerVersion"]) -> None:
        jsii.set(self, "version", value)

    @builtins.property
    @jsii.member(jsii_name="autoHealingPolicies")
    def auto_healing_policies(self) -> typing.Optional[typing.List["ComputeInstanceGroupManagerAutoHealingPolicies"]]:
        return jsii.get(self, "autoHealingPolicies")

    @auto_healing_policies.setter
    def auto_healing_policies(self, value: typing.Optional[typing.List["ComputeInstanceGroupManagerAutoHealingPolicies"]]) -> None:
        jsii.set(self, "autoHealingPolicies", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="instanceTemplate")
    def instance_template(self) -> typing.Optional[str]:
        return jsii.get(self, "instanceTemplate")

    @instance_template.setter
    def instance_template(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "instanceTemplate", value)

    @builtins.property
    @jsii.member(jsii_name="namedPort")
    def named_port(self) -> typing.Optional[typing.List["ComputeInstanceGroupManagerNamedPort"]]:
        return jsii.get(self, "namedPort")

    @named_port.setter
    def named_port(self, value: typing.Optional[typing.List["ComputeInstanceGroupManagerNamedPort"]]) -> None:
        jsii.set(self, "namedPort", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="targetPools")
    def target_pools(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "targetPools")

    @target_pools.setter
    def target_pools(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "targetPools", value)

    @builtins.property
    @jsii.member(jsii_name="targetSize")
    def target_size(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "targetSize")

    @target_size.setter
    def target_size(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "targetSize", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeInstanceGroupManagerTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeInstanceGroupManagerTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="updatePolicy")
    def update_policy(self) -> typing.Optional[typing.List["ComputeInstanceGroupManagerUpdatePolicy"]]:
        return jsii.get(self, "updatePolicy")

    @update_policy.setter
    def update_policy(self, value: typing.Optional[typing.List["ComputeInstanceGroupManagerUpdatePolicy"]]) -> None:
        jsii.set(self, "updatePolicy", value)

    @builtins.property
    @jsii.member(jsii_name="waitForInstances")
    def wait_for_instances(self) -> typing.Optional[bool]:
        return jsii.get(self, "waitForInstances")

    @wait_for_instances.setter
    def wait_for_instances(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "waitForInstances", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGroupManagerAutoHealingPolicies", jsii_struct_bases=[], name_mapping={'health_check': 'healthCheck', 'initial_delay_sec': 'initialDelaySec'})
class ComputeInstanceGroupManagerAutoHealingPolicies():
    def __init__(self, *, health_check: str, initial_delay_sec: jsii.Number) -> None:
        """
        :param health_check: The health check resource that signals autohealing.
        :param initial_delay_sec: The number of seconds that the managed instance group waits before it applies autohealing policies to new instances or recently recreated instances. Between 0 and 3600.
        """
        self._values = {
            'health_check': health_check,
            'initial_delay_sec': initial_delay_sec,
        }

    @builtins.property
    def health_check(self) -> str:
        """The health check resource that signals autohealing."""
        return self._values.get('health_check')

    @builtins.property
    def initial_delay_sec(self) -> jsii.Number:
        """The number of seconds that the managed instance group waits before it applies autohealing policies to new instances or recently recreated instances.

        Between 0 and 3600.
        """
        return self._values.get('initial_delay_sec')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGroupManagerAutoHealingPolicies(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGroupManagerConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'base_instance_name': 'baseInstanceName', 'name': 'name', 'version': 'version', 'auto_healing_policies': 'autoHealingPolicies', 'description': 'description', 'instance_template': 'instanceTemplate', 'named_port': 'namedPort', 'project': 'project', 'target_pools': 'targetPools', 'target_size': 'targetSize', 'timeouts': 'timeouts', 'update_policy': 'updatePolicy', 'wait_for_instances': 'waitForInstances', 'zone': 'zone'})
class ComputeInstanceGroupManagerConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, base_instance_name: str, name: str, version: typing.List["ComputeInstanceGroupManagerVersion"], auto_healing_policies: typing.Optional[typing.List["ComputeInstanceGroupManagerAutoHealingPolicies"]]=None, description: typing.Optional[str]=None, instance_template: typing.Optional[str]=None, named_port: typing.Optional[typing.List["ComputeInstanceGroupManagerNamedPort"]]=None, project: typing.Optional[str]=None, target_pools: typing.Optional[typing.List[str]]=None, target_size: typing.Optional[jsii.Number]=None, timeouts: typing.Optional["ComputeInstanceGroupManagerTimeouts"]=None, update_policy: typing.Optional[typing.List["ComputeInstanceGroupManagerUpdatePolicy"]]=None, wait_for_instances: typing.Optional[bool]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param base_instance_name: The base instance name to use for instances in this group. The value must be a valid RFC1035 name. Supported characters are lowercase letters, numbers, and hyphens (-). Instances are named by appending a hyphen and a random four-character string to the base instance name.
        :param name: The name of the instance group manager. Must be 1-63 characters long and comply with RFC1035. Supported characters include lowercase letters, numbers, and hyphens.
        :param version: version block.
        :param auto_healing_policies: auto_healing_policies block.
        :param description: An optional textual description of the instance group manager.
        :param instance_template: The full URL to an instance template from which all new instances of this version will be created.
        :param named_port: named_port block.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param target_pools: The full URL of all target pools to which new instances in the group are added. Updating the target pools attribute does not affect existing instances.
        :param target_size: The target number of running instances for this managed instance group. This value should always be explicitly set unless this resource is attached to an autoscaler, in which case it should never be set. Defaults to 0.
        :param timeouts: timeouts block.
        :param update_policy: update_policy block.
        :param wait_for_instances: Whether to wait for all instances to be created/updated before returning. Note that if this is set to true and the operation does not succeed, Terraform will continue trying until it times out.
        :param zone: The zone that instances in this group should be created in.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeInstanceGroupManagerTimeouts(**timeouts)
        self._values = {
            'base_instance_name': base_instance_name,
            'name': name,
            'version': version,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if auto_healing_policies is not None: self._values["auto_healing_policies"] = auto_healing_policies
        if description is not None: self._values["description"] = description
        if instance_template is not None: self._values["instance_template"] = instance_template
        if named_port is not None: self._values["named_port"] = named_port
        if project is not None: self._values["project"] = project
        if target_pools is not None: self._values["target_pools"] = target_pools
        if target_size is not None: self._values["target_size"] = target_size
        if timeouts is not None: self._values["timeouts"] = timeouts
        if update_policy is not None: self._values["update_policy"] = update_policy
        if wait_for_instances is not None: self._values["wait_for_instances"] = wait_for_instances
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def base_instance_name(self) -> str:
        """The base instance name to use for instances in this group.

        The value must be a valid RFC1035 name. Supported characters are lowercase letters, numbers, and hyphens (-). Instances are named by appending a hyphen and a random four-character string to the base instance name.
        """
        return self._values.get('base_instance_name')

    @builtins.property
    def name(self) -> str:
        """The name of the instance group manager.

        Must be 1-63 characters long and comply with RFC1035. Supported characters include lowercase letters, numbers, and hyphens.
        """
        return self._values.get('name')

    @builtins.property
    def version(self) -> typing.List["ComputeInstanceGroupManagerVersion"]:
        """version block."""
        return self._values.get('version')

    @builtins.property
    def auto_healing_policies(self) -> typing.Optional[typing.List["ComputeInstanceGroupManagerAutoHealingPolicies"]]:
        """auto_healing_policies block."""
        return self._values.get('auto_healing_policies')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional textual description of the instance group manager."""
        return self._values.get('description')

    @builtins.property
    def instance_template(self) -> typing.Optional[str]:
        """The full URL to an instance template from which all new instances of this version will be created."""
        return self._values.get('instance_template')

    @builtins.property
    def named_port(self) -> typing.Optional[typing.List["ComputeInstanceGroupManagerNamedPort"]]:
        """named_port block."""
        return self._values.get('named_port')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def target_pools(self) -> typing.Optional[typing.List[str]]:
        """The full URL of all target pools to which new instances in the group are added.

        Updating the target pools attribute does not affect existing instances.
        """
        return self._values.get('target_pools')

    @builtins.property
    def target_size(self) -> typing.Optional[jsii.Number]:
        """The target number of running instances for this managed instance group.

        This value should always be explicitly set unless this resource is attached to an autoscaler, in which case it should never be set. Defaults to 0.
        """
        return self._values.get('target_size')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeInstanceGroupManagerTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def update_policy(self) -> typing.Optional[typing.List["ComputeInstanceGroupManagerUpdatePolicy"]]:
        """update_policy block."""
        return self._values.get('update_policy')

    @builtins.property
    def wait_for_instances(self) -> typing.Optional[bool]:
        """Whether to wait for all instances to be created/updated before returning.

        Note that if this is set to true and the operation does not succeed, Terraform will continue trying until it times out.
        """
        return self._values.get('wait_for_instances')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The zone that instances in this group should be created in."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGroupManagerConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGroupManagerNamedPort", jsii_struct_bases=[], name_mapping={'name': 'name', 'port': 'port'})
class ComputeInstanceGroupManagerNamedPort():
    def __init__(self, *, name: str, port: jsii.Number) -> None:
        """
        :param name: The name of the port.
        :param port: The port number.
        """
        self._values = {
            'name': name,
            'port': port,
        }

    @builtins.property
    def name(self) -> str:
        """The name of the port."""
        return self._values.get('name')

    @builtins.property
    def port(self) -> jsii.Number:
        """The port number."""
        return self._values.get('port')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGroupManagerNamedPort(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGroupManagerTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeInstanceGroupManagerTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGroupManagerTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGroupManagerUpdatePolicy", jsii_struct_bases=[], name_mapping={'minimal_action': 'minimalAction', 'type': 'type', 'max_surge_fixed': 'maxSurgeFixed', 'max_surge_percent': 'maxSurgePercent', 'max_unavailable_fixed': 'maxUnavailableFixed', 'max_unavailable_percent': 'maxUnavailablePercent', 'min_ready_sec': 'minReadySec'})
class ComputeInstanceGroupManagerUpdatePolicy():
    def __init__(self, *, minimal_action: str, type: str, max_surge_fixed: typing.Optional[jsii.Number]=None, max_surge_percent: typing.Optional[jsii.Number]=None, max_unavailable_fixed: typing.Optional[jsii.Number]=None, max_unavailable_percent: typing.Optional[jsii.Number]=None, min_ready_sec: typing.Optional[jsii.Number]=None) -> None:
        """
        :param minimal_action: Minimal action to be taken on an instance. You can specify either RESTART to restart existing instances or REPLACE to delete and create new instances from the target template. If you specify a RESTART, the Updater will attempt to perform that action only. However, if the Updater determines that the minimal action you specify is not enough to perform the update, it might perform a more disruptive action.
        :param type: The type of update process. You can specify either PROACTIVE so that the instance group manager proactively executes actions in order to bring instances to their target versions or OPPORTUNISTIC so that no action is proactively executed but the update will be performed as part of other actions (for example, resizes or recreateInstances calls).
        :param max_surge_fixed: The maximum number of instances that can be created above the specified targetSize during the update process. Conflicts with max_surge_percent. If neither is set, defaults to 1
        :param max_surge_percent: The maximum number of instances(calculated as percentage) that can be created above the specified targetSize during the update process. Conflicts with max_surge_fixed.
        :param max_unavailable_fixed: The maximum number of instances that can be unavailable during the update process. Conflicts with max_unavailable_percent. If neither is set, defaults to 1.
        :param max_unavailable_percent: The maximum number of instances(calculated as percentage) that can be unavailable during the update process. Conflicts with max_unavailable_fixed.
        :param min_ready_sec: Minimum number of seconds to wait for after a newly created instance becomes available. This value must be from range [0, 3600].
        """
        self._values = {
            'minimal_action': minimal_action,
            'type': type,
        }
        if max_surge_fixed is not None: self._values["max_surge_fixed"] = max_surge_fixed
        if max_surge_percent is not None: self._values["max_surge_percent"] = max_surge_percent
        if max_unavailable_fixed is not None: self._values["max_unavailable_fixed"] = max_unavailable_fixed
        if max_unavailable_percent is not None: self._values["max_unavailable_percent"] = max_unavailable_percent
        if min_ready_sec is not None: self._values["min_ready_sec"] = min_ready_sec

    @builtins.property
    def minimal_action(self) -> str:
        """Minimal action to be taken on an instance.

        You can specify either RESTART to restart existing instances or REPLACE to delete and create new instances from the target template. If you specify a RESTART, the Updater will attempt to perform that action only. However, if the Updater determines that the minimal action you specify is not enough to perform the update, it might perform a more disruptive action.
        """
        return self._values.get('minimal_action')

    @builtins.property
    def type(self) -> str:
        """The type of update process.

        You can specify either PROACTIVE so that the instance group manager proactively executes actions in order to bring instances to their target versions or OPPORTUNISTIC so that no action is proactively executed but the update will be performed as part of other actions (for example, resizes or recreateInstances calls).
        """
        return self._values.get('type')

    @builtins.property
    def max_surge_fixed(self) -> typing.Optional[jsii.Number]:
        """The maximum number of instances that can be created above the specified targetSize during the update process.

        Conflicts with max_surge_percent. If neither is set, defaults to 1
        """
        return self._values.get('max_surge_fixed')

    @builtins.property
    def max_surge_percent(self) -> typing.Optional[jsii.Number]:
        """The maximum number of instances(calculated as percentage) that can be created above the specified targetSize during the update process.

        Conflicts with max_surge_fixed.
        """
        return self._values.get('max_surge_percent')

    @builtins.property
    def max_unavailable_fixed(self) -> typing.Optional[jsii.Number]:
        """The maximum number of instances that can be unavailable during the update process.

        Conflicts with max_unavailable_percent. If neither is set, defaults to 1.
        """
        return self._values.get('max_unavailable_fixed')

    @builtins.property
    def max_unavailable_percent(self) -> typing.Optional[jsii.Number]:
        """The maximum number of instances(calculated as percentage) that can be unavailable during the update process.

        Conflicts with max_unavailable_fixed.
        """
        return self._values.get('max_unavailable_percent')

    @builtins.property
    def min_ready_sec(self) -> typing.Optional[jsii.Number]:
        """Minimum number of seconds to wait for after a newly created instance becomes available.

        This value must be from range [0, 3600].
        """
        return self._values.get('min_ready_sec')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGroupManagerUpdatePolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGroupManagerVersion", jsii_struct_bases=[], name_mapping={'instance_template': 'instanceTemplate', 'name': 'name', 'target_size': 'targetSize'})
class ComputeInstanceGroupManagerVersion():
    def __init__(self, *, instance_template: str, name: typing.Optional[str]=None, target_size: typing.Optional[typing.List["ComputeInstanceGroupManagerVersionTargetSize"]]=None) -> None:
        """
        :param instance_template: The full URL to an instance template from which all new instances of this version will be created.
        :param name: Version name.
        :param target_size: target_size block.
        """
        self._values = {
            'instance_template': instance_template,
        }
        if name is not None: self._values["name"] = name
        if target_size is not None: self._values["target_size"] = target_size

    @builtins.property
    def instance_template(self) -> str:
        """The full URL to an instance template from which all new instances of this version will be created."""
        return self._values.get('instance_template')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Version name."""
        return self._values.get('name')

    @builtins.property
    def target_size(self) -> typing.Optional[typing.List["ComputeInstanceGroupManagerVersionTargetSize"]]:
        """target_size block."""
        return self._values.get('target_size')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGroupManagerVersion(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGroupManagerVersionTargetSize", jsii_struct_bases=[], name_mapping={'fixed': 'fixed', 'percent': 'percent'})
class ComputeInstanceGroupManagerVersionTargetSize():
    def __init__(self, *, fixed: typing.Optional[jsii.Number]=None, percent: typing.Optional[jsii.Number]=None) -> None:
        """
        :param fixed: The number of instances which are managed for this version. Conflicts with percent.
        :param percent: The number of instances (calculated as percentage) which are managed for this version. Conflicts with fixed. Note that when using percent, rounding will be in favor of explicitly set target_size values; a managed instance group with 2 instances and 2 versions, one of which has a target_size.percent of 60 will create 2 instances of that version.
        """
        self._values = {
        }
        if fixed is not None: self._values["fixed"] = fixed
        if percent is not None: self._values["percent"] = percent

    @builtins.property
    def fixed(self) -> typing.Optional[jsii.Number]:
        """The number of instances which are managed for this version.

        Conflicts with percent.
        """
        return self._values.get('fixed')

    @builtins.property
    def percent(self) -> typing.Optional[jsii.Number]:
        """The number of instances (calculated as percentage) which are managed for this version.

        Conflicts with fixed. Note that when using percent, rounding will be in favor of explicitly set target_size values; a managed instance group with 2 instances and 2 versions, one of which has a target_size.percent of 60 will create 2 instances of that version.
        """
        return self._values.get('percent')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGroupManagerVersionTargetSize(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGroupNamedPort", jsii_struct_bases=[], name_mapping={'name': 'name', 'port': 'port'})
class ComputeInstanceGroupNamedPort():
    def __init__(self, *, name: str, port: jsii.Number) -> None:
        """
        :param name: The name which the port will be mapped to.
        :param port: The port number to map the name to.
        """
        self._values = {
            'name': name,
            'port': port,
        }

    @builtins.property
    def name(self) -> str:
        """The name which the port will be mapped to."""
        return self._values.get('name')

    @builtins.property
    def port(self) -> jsii.Number:
        """The port number to map the name to."""
        return self._values.get('port')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGroupNamedPort(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeInstanceGroupNamedPortA(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeInstanceGroupNamedPortA"):
    def __init__(self, scope: constructs.Construct, id: str, *, group: str, name: str, port: jsii.Number, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeInstanceGroupNamedPortTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param group: The name of the instance group.
        :param name: The name for this named port. The name must be 1-63 characters long, and comply with RFC1035.
        :param port: The port number, which can be a value between 1 and 65535.
        :param project: 
        :param timeouts: timeouts block.
        :param zone: The zone of the instance group.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeInstanceGroupNamedPortAConfig(group=group, name=name, port=port, project=project, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeInstanceGroupNamedPortA, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="group")
    def group(self) -> str:
        return jsii.get(self, "group")

    @group.setter
    def group(self, value: str) -> None:
        jsii.set(self, "group", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")

    @port.setter
    def port(self, value: jsii.Number) -> None:
        jsii.set(self, "port", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeInstanceGroupNamedPortTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeInstanceGroupNamedPortTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGroupNamedPortAConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'group': 'group', 'name': 'name', 'port': 'port', 'project': 'project', 'timeouts': 'timeouts', 'zone': 'zone'})
class ComputeInstanceGroupNamedPortAConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, group: str, name: str, port: jsii.Number, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeInstanceGroupNamedPortTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param group: The name of the instance group.
        :param name: The name for this named port. The name must be 1-63 characters long, and comply with RFC1035.
        :param port: The port number, which can be a value between 1 and 65535.
        :param project: 
        :param timeouts: timeouts block.
        :param zone: The zone of the instance group.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeInstanceGroupNamedPortTimeouts(**timeouts)
        self._values = {
            'group': group,
            'name': name,
            'port': port,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def group(self) -> str:
        """The name of the instance group."""
        return self._values.get('group')

    @builtins.property
    def name(self) -> str:
        """The name for this named port.

        The name must be 1-63 characters
        long, and comply with RFC1035.
        """
        return self._values.get('name')

    @builtins.property
    def port(self) -> jsii.Number:
        """The port number, which can be a value between 1 and 65535."""
        return self._values.get('port')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeInstanceGroupNamedPortTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The zone of the instance group."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGroupNamedPortAConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGroupNamedPortTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeInstanceGroupNamedPortTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGroupNamedPortTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGroupTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeInstanceGroupTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGroupTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceGuestAccelerator", jsii_struct_bases=[], name_mapping={'count': 'count', 'type': 'type'})
class ComputeInstanceGuestAccelerator():
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, type: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param type: 
        """
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if type is not None: self._values["type"] = type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        return self._values.get('count')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceGuestAccelerator(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeInstanceIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeInstanceIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance_name: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["ComputeInstanceIamBindingCondition"]]=None, project: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance_name: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param zone: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeInstanceIamBindingConfig(instance_name=instance_name, members=members, role=role, condition=condition, project=project, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeInstanceIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="instanceName")
    def instance_name(self) -> str:
        return jsii.get(self, "instanceName")

    @instance_name.setter
    def instance_name(self, value: str) -> None:
        jsii.set(self, "instanceName", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["ComputeInstanceIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["ComputeInstanceIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class ComputeInstanceIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance_name': 'instanceName', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project', 'zone': 'zone'})
class ComputeInstanceIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance_name: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["ComputeInstanceIamBindingCondition"]]=None, project: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance_name: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param zone: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance_name': instance_name,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance_name(self) -> str:
        return self._values.get('instance_name')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["ComputeInstanceIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeInstanceIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeInstanceIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance_name: str, member: str, role: str, condition: typing.Optional[typing.List["ComputeInstanceIamMemberCondition"]]=None, project: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance_name: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param zone: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeInstanceIamMemberConfig(instance_name=instance_name, member=member, role=role, condition=condition, project=project, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeInstanceIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="instanceName")
    def instance_name(self) -> str:
        return jsii.get(self, "instanceName")

    @instance_name.setter
    def instance_name(self, value: str) -> None:
        jsii.set(self, "instanceName", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["ComputeInstanceIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["ComputeInstanceIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class ComputeInstanceIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance_name': 'instanceName', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project', 'zone': 'zone'})
class ComputeInstanceIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance_name: str, member: str, role: str, condition: typing.Optional[typing.List["ComputeInstanceIamMemberCondition"]]=None, project: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance_name: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param zone: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance_name': instance_name,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance_name(self) -> str:
        return self._values.get('instance_name')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["ComputeInstanceIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeInstanceIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeInstanceIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance_name: str, policy_data: str, project: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance_name: 
        :param policy_data: 
        :param project: 
        :param zone: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeInstanceIamPolicyConfig(instance_name=instance_name, policy_data=policy_data, project=project, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeInstanceIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="instanceName")
    def instance_name(self) -> str:
        return jsii.get(self, "instanceName")

    @instance_name.setter
    def instance_name(self, value: str) -> None:
        jsii.set(self, "instanceName", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance_name': 'instanceName', 'policy_data': 'policyData', 'project': 'project', 'zone': 'zone'})
class ComputeInstanceIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance_name: str, policy_data: str, project: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance_name: 
        :param policy_data: 
        :param project: 
        :param zone: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance_name': instance_name,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance_name(self) -> str:
        return self._values.get('instance_name')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceNetworkInterface", jsii_struct_bases=[], name_mapping={'access_config': 'accessConfig', 'alias_ip_range': 'aliasIpRange', 'network': 'network', 'network_ip': 'networkIp', 'subnetwork': 'subnetwork', 'subnetwork_project': 'subnetworkProject'})
class ComputeInstanceNetworkInterface():
    def __init__(self, *, access_config: typing.Optional[typing.List["ComputeInstanceNetworkInterfaceAccessConfig"]]=None, alias_ip_range: typing.Optional[typing.List["ComputeInstanceNetworkInterfaceAliasIpRange"]]=None, network: typing.Optional[str]=None, network_ip: typing.Optional[str]=None, subnetwork: typing.Optional[str]=None, subnetwork_project: typing.Optional[str]=None) -> None:
        """
        :param access_config: access_config block.
        :param alias_ip_range: alias_ip_range block.
        :param network: The name or self_link of the network attached to this interface.
        :param network_ip: The private IP address assigned to the instance.
        :param subnetwork: The name or self_link of the subnetwork attached to this interface.
        :param subnetwork_project: The project in which the subnetwork belongs.
        """
        self._values = {
        }
        if access_config is not None: self._values["access_config"] = access_config
        if alias_ip_range is not None: self._values["alias_ip_range"] = alias_ip_range
        if network is not None: self._values["network"] = network
        if network_ip is not None: self._values["network_ip"] = network_ip
        if subnetwork is not None: self._values["subnetwork"] = subnetwork
        if subnetwork_project is not None: self._values["subnetwork_project"] = subnetwork_project

    @builtins.property
    def access_config(self) -> typing.Optional[typing.List["ComputeInstanceNetworkInterfaceAccessConfig"]]:
        """access_config block."""
        return self._values.get('access_config')

    @builtins.property
    def alias_ip_range(self) -> typing.Optional[typing.List["ComputeInstanceNetworkInterfaceAliasIpRange"]]:
        """alias_ip_range block."""
        return self._values.get('alias_ip_range')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """The name or self_link of the network attached to this interface."""
        return self._values.get('network')

    @builtins.property
    def network_ip(self) -> typing.Optional[str]:
        """The private IP address assigned to the instance."""
        return self._values.get('network_ip')

    @builtins.property
    def subnetwork(self) -> typing.Optional[str]:
        """The name or self_link of the subnetwork attached to this interface."""
        return self._values.get('subnetwork')

    @builtins.property
    def subnetwork_project(self) -> typing.Optional[str]:
        """The project in which the subnetwork belongs."""
        return self._values.get('subnetwork_project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceNetworkInterface(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceNetworkInterfaceAccessConfig", jsii_struct_bases=[], name_mapping={'nat_ip': 'natIp', 'network_tier': 'networkTier', 'public_ptr_domain_name': 'publicPtrDomainName'})
class ComputeInstanceNetworkInterfaceAccessConfig():
    def __init__(self, *, nat_ip: typing.Optional[str]=None, network_tier: typing.Optional[str]=None, public_ptr_domain_name: typing.Optional[str]=None) -> None:
        """
        :param nat_ip: The IP address that is be 1:1 mapped to the instance's network ip.
        :param network_tier: The networking tier used for configuring this instance. One of PREMIUM or STANDARD.
        :param public_ptr_domain_name: The DNS domain name for the public PTR record.
        """
        self._values = {
        }
        if nat_ip is not None: self._values["nat_ip"] = nat_ip
        if network_tier is not None: self._values["network_tier"] = network_tier
        if public_ptr_domain_name is not None: self._values["public_ptr_domain_name"] = public_ptr_domain_name

    @builtins.property
    def nat_ip(self) -> typing.Optional[str]:
        """The IP address that is be 1:1 mapped to the instance's network ip."""
        return self._values.get('nat_ip')

    @builtins.property
    def network_tier(self) -> typing.Optional[str]:
        """The networking tier used for configuring this instance.

        One of PREMIUM or STANDARD.
        """
        return self._values.get('network_tier')

    @builtins.property
    def public_ptr_domain_name(self) -> typing.Optional[str]:
        """The DNS domain name for the public PTR record."""
        return self._values.get('public_ptr_domain_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceNetworkInterfaceAccessConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceNetworkInterfaceAliasIpRange", jsii_struct_bases=[], name_mapping={'ip_cidr_range': 'ipCidrRange', 'subnetwork_range_name': 'subnetworkRangeName'})
class ComputeInstanceNetworkInterfaceAliasIpRange():
    def __init__(self, *, ip_cidr_range: str, subnetwork_range_name: typing.Optional[str]=None) -> None:
        """
        :param ip_cidr_range: The IP CIDR range represented by this alias IP range.
        :param subnetwork_range_name: The subnetwork secondary range name specifying the secondary range from which to allocate the IP CIDR range for this alias IP range.
        """
        self._values = {
            'ip_cidr_range': ip_cidr_range,
        }
        if subnetwork_range_name is not None: self._values["subnetwork_range_name"] = subnetwork_range_name

    @builtins.property
    def ip_cidr_range(self) -> str:
        """The IP CIDR range represented by this alias IP range."""
        return self._values.get('ip_cidr_range')

    @builtins.property
    def subnetwork_range_name(self) -> typing.Optional[str]:
        """The subnetwork secondary range name specifying the secondary range from which to allocate the IP CIDR range for this alias IP range."""
        return self._values.get('subnetwork_range_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceNetworkInterfaceAliasIpRange(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceScheduling", jsii_struct_bases=[], name_mapping={'automatic_restart': 'automaticRestart', 'node_affinities': 'nodeAffinities', 'on_host_maintenance': 'onHostMaintenance', 'preemptible': 'preemptible'})
class ComputeInstanceScheduling():
    def __init__(self, *, automatic_restart: typing.Optional[bool]=None, node_affinities: typing.Optional[typing.List["ComputeInstanceSchedulingNodeAffinities"]]=None, on_host_maintenance: typing.Optional[str]=None, preemptible: typing.Optional[bool]=None) -> None:
        """
        :param automatic_restart: Specifies if the instance should be restarted if it was terminated by Compute Engine (not a user).
        :param node_affinities: node_affinities block.
        :param on_host_maintenance: Describes maintenance behavior for the instance. One of MIGRATE or TERMINATE,
        :param preemptible: Whether the instance is preemptible.
        """
        self._values = {
        }
        if automatic_restart is not None: self._values["automatic_restart"] = automatic_restart
        if node_affinities is not None: self._values["node_affinities"] = node_affinities
        if on_host_maintenance is not None: self._values["on_host_maintenance"] = on_host_maintenance
        if preemptible is not None: self._values["preemptible"] = preemptible

    @builtins.property
    def automatic_restart(self) -> typing.Optional[bool]:
        """Specifies if the instance should be restarted if it was terminated by Compute Engine (not a user)."""
        return self._values.get('automatic_restart')

    @builtins.property
    def node_affinities(self) -> typing.Optional[typing.List["ComputeInstanceSchedulingNodeAffinities"]]:
        """node_affinities block."""
        return self._values.get('node_affinities')

    @builtins.property
    def on_host_maintenance(self) -> typing.Optional[str]:
        """Describes maintenance behavior for the instance.

        One of MIGRATE or TERMINATE,
        """
        return self._values.get('on_host_maintenance')

    @builtins.property
    def preemptible(self) -> typing.Optional[bool]:
        """Whether the instance is preemptible."""
        return self._values.get('preemptible')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceScheduling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceSchedulingNodeAffinities", jsii_struct_bases=[], name_mapping={'key': 'key', 'operator': 'operator', 'values': 'values'})
class ComputeInstanceSchedulingNodeAffinities():
    def __init__(self, *, key: str, operator: str, values: typing.List[str]) -> None:
        """
        :param key: 
        :param operator: 
        :param values: 
        """
        self._values = {
            'key': key,
            'operator': operator,
            'values': values,
        }

    @builtins.property
    def key(self) -> str:
        return self._values.get('key')

    @builtins.property
    def operator(self) -> str:
        return self._values.get('operator')

    @builtins.property
    def values(self) -> typing.List[str]:
        return self._values.get('values')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceSchedulingNodeAffinities(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceScratchDisk", jsii_struct_bases=[], name_mapping={'interface': 'interface'})
class ComputeInstanceScratchDisk():
    def __init__(self, *, interface: str) -> None:
        """
        :param interface: The disk interface used for attaching this disk. One of SCSI or NVME.
        """
        self._values = {
            'interface': interface,
        }

    @builtins.property
    def interface(self) -> str:
        """The disk interface used for attaching this disk.

        One of SCSI or NVME.
        """
        return self._values.get('interface')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceScratchDisk(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceServiceAccount", jsii_struct_bases=[], name_mapping={'scopes': 'scopes', 'email': 'email'})
class ComputeInstanceServiceAccount():
    def __init__(self, *, scopes: typing.List[str], email: typing.Optional[str]=None) -> None:
        """
        :param scopes: A list of service scopes.
        :param email: The service account e-mail address.
        """
        self._values = {
            'scopes': scopes,
        }
        if email is not None: self._values["email"] = email

    @builtins.property
    def scopes(self) -> typing.List[str]:
        """A list of service scopes."""
        return self._values.get('scopes')

    @builtins.property
    def email(self) -> typing.Optional[str]:
        """The service account e-mail address."""
        return self._values.get('email')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceServiceAccount(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceShieldedInstanceConfig", jsii_struct_bases=[], name_mapping={'enable_integrity_monitoring': 'enableIntegrityMonitoring', 'enable_secure_boot': 'enableSecureBoot', 'enable_vtpm': 'enableVtpm'})
class ComputeInstanceShieldedInstanceConfig():
    def __init__(self, *, enable_integrity_monitoring: typing.Optional[bool]=None, enable_secure_boot: typing.Optional[bool]=None, enable_vtpm: typing.Optional[bool]=None) -> None:
        """
        :param enable_integrity_monitoring: Whether integrity monitoring is enabled for the instance.
        :param enable_secure_boot: Whether secure boot is enabled for the instance.
        :param enable_vtpm: Whether the instance uses vTPM.
        """
        self._values = {
        }
        if enable_integrity_monitoring is not None: self._values["enable_integrity_monitoring"] = enable_integrity_monitoring
        if enable_secure_boot is not None: self._values["enable_secure_boot"] = enable_secure_boot
        if enable_vtpm is not None: self._values["enable_vtpm"] = enable_vtpm

    @builtins.property
    def enable_integrity_monitoring(self) -> typing.Optional[bool]:
        """Whether integrity monitoring is enabled for the instance."""
        return self._values.get('enable_integrity_monitoring')

    @builtins.property
    def enable_secure_boot(self) -> typing.Optional[bool]:
        """Whether secure boot is enabled for the instance."""
        return self._values.get('enable_secure_boot')

    @builtins.property
    def enable_vtpm(self) -> typing.Optional[bool]:
        """Whether the instance uses vTPM."""
        return self._values.get('enable_vtpm')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceShieldedInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeInstanceTemplate(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeInstanceTemplate"):
    def __init__(self, scope: constructs.Construct, id: str, *, disk: typing.List["ComputeInstanceTemplateDisk"], machine_type: str, can_ip_forward: typing.Optional[bool]=None, description: typing.Optional[str]=None, enable_display: typing.Optional[bool]=None, guest_accelerator: typing.Optional[typing.List["ComputeInstanceTemplateGuestAccelerator"]]=None, instance_description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, metadata_startup_script: typing.Optional[str]=None, min_cpu_platform: typing.Optional[str]=None, name: typing.Optional[str]=None, name_prefix: typing.Optional[str]=None, network_interface: typing.Optional[typing.List["ComputeInstanceTemplateNetworkInterface"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, scheduling: typing.Optional[typing.List["ComputeInstanceTemplateScheduling"]]=None, service_account: typing.Optional[typing.List["ComputeInstanceTemplateServiceAccount"]]=None, shielded_instance_config: typing.Optional[typing.List["ComputeInstanceTemplateShieldedInstanceConfig"]]=None, tags: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["ComputeInstanceTemplateTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param disk: disk block.
        :param machine_type: The machine type to create. To create a machine with a custom type (such as extended memory), format the value like custom-VCPUS-MEM_IN_MB like custom-6-20480 for 6 vCPU and 20GB of RAM.
        :param can_ip_forward: Whether to allow sending and receiving of packets with non-matching source or destination IPs. This defaults to false.
        :param description: A brief description of this resource.
        :param enable_display: Enable Virtual Displays on this instance. Note: allow_stopping_for_update must be set to true in order to update this field.
        :param guest_accelerator: guest_accelerator block.
        :param instance_description: A description of the instance.
        :param labels: A set of key/value label pairs to assign to instances created from this template,.
        :param metadata: Metadata key/value pairs to make available from within instances created from this template.
        :param metadata_startup_script: An alternative to using the startup-script metadata key, mostly to match the compute_instance resource. This replaces the startup-script metadata key on the created instance and thus the two mechanisms are not allowed to be used simultaneously.
        :param min_cpu_platform: Specifies a minimum CPU platform. Applicable values are the friendly names of CPU platforms, such as Intel Haswell or Intel Skylake.
        :param name: The name of the instance template. If you leave this blank, Terraform will auto-generate a unique name.
        :param name_prefix: Creates a unique name beginning with the specified prefix. Conflicts with name.
        :param network_interface: network_interface block.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param region: An instance template is a global resource that is not bound to a zone or a region. However, you can still specify some regional resources in an instance template, which restricts the template to the region where that resource resides. For example, a custom subnetwork resource is tied to a specific region. Defaults to the region of the Provider if no value is given.
        :param scheduling: scheduling block.
        :param service_account: service_account block.
        :param shielded_instance_config: shielded_instance_config block.
        :param tags: Tags to attach to the instance.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeInstanceTemplateConfig(disk=disk, machine_type=machine_type, can_ip_forward=can_ip_forward, description=description, enable_display=enable_display, guest_accelerator=guest_accelerator, instance_description=instance_description, labels=labels, metadata=metadata, metadata_startup_script=metadata_startup_script, min_cpu_platform=min_cpu_platform, name=name, name_prefix=name_prefix, network_interface=network_interface, project=project, region=region, scheduling=scheduling, service_account=service_account, shielded_instance_config=shielded_instance_config, tags=tags, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeInstanceTemplate, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="metadataFingerprint")
    def metadata_fingerprint(self) -> str:
        return jsii.get(self, "metadataFingerprint")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="tagsFingerprint")
    def tags_fingerprint(self) -> str:
        return jsii.get(self, "tagsFingerprint")

    @builtins.property
    @jsii.member(jsii_name="disk")
    def disk(self) -> typing.List["ComputeInstanceTemplateDisk"]:
        return jsii.get(self, "disk")

    @disk.setter
    def disk(self, value: typing.List["ComputeInstanceTemplateDisk"]) -> None:
        jsii.set(self, "disk", value)

    @builtins.property
    @jsii.member(jsii_name="machineType")
    def machine_type(self) -> str:
        return jsii.get(self, "machineType")

    @machine_type.setter
    def machine_type(self, value: str) -> None:
        jsii.set(self, "machineType", value)

    @builtins.property
    @jsii.member(jsii_name="canIpForward")
    def can_ip_forward(self) -> typing.Optional[bool]:
        return jsii.get(self, "canIpForward")

    @can_ip_forward.setter
    def can_ip_forward(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "canIpForward", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="enableDisplay")
    def enable_display(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableDisplay")

    @enable_display.setter
    def enable_display(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableDisplay", value)

    @builtins.property
    @jsii.member(jsii_name="guestAccelerator")
    def guest_accelerator(self) -> typing.Optional[typing.List["ComputeInstanceTemplateGuestAccelerator"]]:
        return jsii.get(self, "guestAccelerator")

    @guest_accelerator.setter
    def guest_accelerator(self, value: typing.Optional[typing.List["ComputeInstanceTemplateGuestAccelerator"]]) -> None:
        jsii.set(self, "guestAccelerator", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="instanceDescription")
    def instance_description(self) -> typing.Optional[str]:
        return jsii.get(self, "instanceDescription")

    @instance_description.setter
    def instance_description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "instanceDescription", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "metadata")

    @metadata.setter
    def metadata(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property
    @jsii.member(jsii_name="metadataStartupScript")
    def metadata_startup_script(self) -> typing.Optional[str]:
        return jsii.get(self, "metadataStartupScript")

    @metadata_startup_script.setter
    def metadata_startup_script(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "metadataStartupScript", value)

    @builtins.property
    @jsii.member(jsii_name="minCpuPlatform")
    def min_cpu_platform(self) -> typing.Optional[str]:
        return jsii.get(self, "minCpuPlatform")

    @min_cpu_platform.setter
    def min_cpu_platform(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "minCpuPlatform", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="namePrefix")
    def name_prefix(self) -> typing.Optional[str]:
        return jsii.get(self, "namePrefix")

    @name_prefix.setter
    def name_prefix(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "namePrefix", value)

    @builtins.property
    @jsii.member(jsii_name="networkInterface")
    def network_interface(self) -> typing.Optional[typing.List["ComputeInstanceTemplateNetworkInterface"]]:
        return jsii.get(self, "networkInterface")

    @network_interface.setter
    def network_interface(self, value: typing.Optional[typing.List["ComputeInstanceTemplateNetworkInterface"]]) -> None:
        jsii.set(self, "networkInterface", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="scheduling")
    def scheduling(self) -> typing.Optional[typing.List["ComputeInstanceTemplateScheduling"]]:
        return jsii.get(self, "scheduling")

    @scheduling.setter
    def scheduling(self, value: typing.Optional[typing.List["ComputeInstanceTemplateScheduling"]]) -> None:
        jsii.set(self, "scheduling", value)

    @builtins.property
    @jsii.member(jsii_name="serviceAccount")
    def service_account(self) -> typing.Optional[typing.List["ComputeInstanceTemplateServiceAccount"]]:
        return jsii.get(self, "serviceAccount")

    @service_account.setter
    def service_account(self, value: typing.Optional[typing.List["ComputeInstanceTemplateServiceAccount"]]) -> None:
        jsii.set(self, "serviceAccount", value)

    @builtins.property
    @jsii.member(jsii_name="shieldedInstanceConfig")
    def shielded_instance_config(self) -> typing.Optional[typing.List["ComputeInstanceTemplateShieldedInstanceConfig"]]:
        return jsii.get(self, "shieldedInstanceConfig")

    @shielded_instance_config.setter
    def shielded_instance_config(self, value: typing.Optional[typing.List["ComputeInstanceTemplateShieldedInstanceConfig"]]) -> None:
        jsii.set(self, "shieldedInstanceConfig", value)

    @builtins.property
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "tags")

    @tags.setter
    def tags(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeInstanceTemplateTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeInstanceTemplateTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTemplateConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'disk': 'disk', 'machine_type': 'machineType', 'can_ip_forward': 'canIpForward', 'description': 'description', 'enable_display': 'enableDisplay', 'guest_accelerator': 'guestAccelerator', 'instance_description': 'instanceDescription', 'labels': 'labels', 'metadata': 'metadata', 'metadata_startup_script': 'metadataStartupScript', 'min_cpu_platform': 'minCpuPlatform', 'name': 'name', 'name_prefix': 'namePrefix', 'network_interface': 'networkInterface', 'project': 'project', 'region': 'region', 'scheduling': 'scheduling', 'service_account': 'serviceAccount', 'shielded_instance_config': 'shieldedInstanceConfig', 'tags': 'tags', 'timeouts': 'timeouts'})
class ComputeInstanceTemplateConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, disk: typing.List["ComputeInstanceTemplateDisk"], machine_type: str, can_ip_forward: typing.Optional[bool]=None, description: typing.Optional[str]=None, enable_display: typing.Optional[bool]=None, guest_accelerator: typing.Optional[typing.List["ComputeInstanceTemplateGuestAccelerator"]]=None, instance_description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, metadata_startup_script: typing.Optional[str]=None, min_cpu_platform: typing.Optional[str]=None, name: typing.Optional[str]=None, name_prefix: typing.Optional[str]=None, network_interface: typing.Optional[typing.List["ComputeInstanceTemplateNetworkInterface"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, scheduling: typing.Optional[typing.List["ComputeInstanceTemplateScheduling"]]=None, service_account: typing.Optional[typing.List["ComputeInstanceTemplateServiceAccount"]]=None, shielded_instance_config: typing.Optional[typing.List["ComputeInstanceTemplateShieldedInstanceConfig"]]=None, tags: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["ComputeInstanceTemplateTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param disk: disk block.
        :param machine_type: The machine type to create. To create a machine with a custom type (such as extended memory), format the value like custom-VCPUS-MEM_IN_MB like custom-6-20480 for 6 vCPU and 20GB of RAM.
        :param can_ip_forward: Whether to allow sending and receiving of packets with non-matching source or destination IPs. This defaults to false.
        :param description: A brief description of this resource.
        :param enable_display: Enable Virtual Displays on this instance. Note: allow_stopping_for_update must be set to true in order to update this field.
        :param guest_accelerator: guest_accelerator block.
        :param instance_description: A description of the instance.
        :param labels: A set of key/value label pairs to assign to instances created from this template,.
        :param metadata: Metadata key/value pairs to make available from within instances created from this template.
        :param metadata_startup_script: An alternative to using the startup-script metadata key, mostly to match the compute_instance resource. This replaces the startup-script metadata key on the created instance and thus the two mechanisms are not allowed to be used simultaneously.
        :param min_cpu_platform: Specifies a minimum CPU platform. Applicable values are the friendly names of CPU platforms, such as Intel Haswell or Intel Skylake.
        :param name: The name of the instance template. If you leave this blank, Terraform will auto-generate a unique name.
        :param name_prefix: Creates a unique name beginning with the specified prefix. Conflicts with name.
        :param network_interface: network_interface block.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param region: An instance template is a global resource that is not bound to a zone or a region. However, you can still specify some regional resources in an instance template, which restricts the template to the region where that resource resides. For example, a custom subnetwork resource is tied to a specific region. Defaults to the region of the Provider if no value is given.
        :param scheduling: scheduling block.
        :param service_account: service_account block.
        :param shielded_instance_config: shielded_instance_config block.
        :param tags: Tags to attach to the instance.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeInstanceTemplateTimeouts(**timeouts)
        self._values = {
            'disk': disk,
            'machine_type': machine_type,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if can_ip_forward is not None: self._values["can_ip_forward"] = can_ip_forward
        if description is not None: self._values["description"] = description
        if enable_display is not None: self._values["enable_display"] = enable_display
        if guest_accelerator is not None: self._values["guest_accelerator"] = guest_accelerator
        if instance_description is not None: self._values["instance_description"] = instance_description
        if labels is not None: self._values["labels"] = labels
        if metadata is not None: self._values["metadata"] = metadata
        if metadata_startup_script is not None: self._values["metadata_startup_script"] = metadata_startup_script
        if min_cpu_platform is not None: self._values["min_cpu_platform"] = min_cpu_platform
        if name is not None: self._values["name"] = name
        if name_prefix is not None: self._values["name_prefix"] = name_prefix
        if network_interface is not None: self._values["network_interface"] = network_interface
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if scheduling is not None: self._values["scheduling"] = scheduling
        if service_account is not None: self._values["service_account"] = service_account
        if shielded_instance_config is not None: self._values["shielded_instance_config"] = shielded_instance_config
        if tags is not None: self._values["tags"] = tags
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def disk(self) -> typing.List["ComputeInstanceTemplateDisk"]:
        """disk block."""
        return self._values.get('disk')

    @builtins.property
    def machine_type(self) -> str:
        """The machine type to create.

        To create a machine with a custom type (such as extended memory), format the value like custom-VCPUS-MEM_IN_MB like custom-6-20480 for 6 vCPU and 20GB of RAM.
        """
        return self._values.get('machine_type')

    @builtins.property
    def can_ip_forward(self) -> typing.Optional[bool]:
        """Whether to allow sending and receiving of packets with non-matching source or destination IPs.

        This defaults to false.
        """
        return self._values.get('can_ip_forward')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A brief description of this resource."""
        return self._values.get('description')

    @builtins.property
    def enable_display(self) -> typing.Optional[bool]:
        """Enable Virtual Displays on this instance.

        Note: allow_stopping_for_update must be set to true in order to update this field.
        """
        return self._values.get('enable_display')

    @builtins.property
    def guest_accelerator(self) -> typing.Optional[typing.List["ComputeInstanceTemplateGuestAccelerator"]]:
        """guest_accelerator block."""
        return self._values.get('guest_accelerator')

    @builtins.property
    def instance_description(self) -> typing.Optional[str]:
        """A description of the instance."""
        return self._values.get('instance_description')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value label pairs to assign to instances created from this template,."""
        return self._values.get('labels')

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Metadata key/value pairs to make available from within instances created from this template."""
        return self._values.get('metadata')

    @builtins.property
    def metadata_startup_script(self) -> typing.Optional[str]:
        """An alternative to using the startup-script metadata key, mostly to match the compute_instance resource.

        This replaces the startup-script metadata key on the created instance and thus the two mechanisms are not allowed to be used simultaneously.
        """
        return self._values.get('metadata_startup_script')

    @builtins.property
    def min_cpu_platform(self) -> typing.Optional[str]:
        """Specifies a minimum CPU platform.

        Applicable values are the friendly names of CPU platforms, such as Intel Haswell or Intel Skylake.
        """
        return self._values.get('min_cpu_platform')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """The name of the instance template.

        If you leave this blank, Terraform will auto-generate a unique name.
        """
        return self._values.get('name')

    @builtins.property
    def name_prefix(self) -> typing.Optional[str]:
        """Creates a unique name beginning with the specified prefix.

        Conflicts with name.
        """
        return self._values.get('name_prefix')

    @builtins.property
    def network_interface(self) -> typing.Optional[typing.List["ComputeInstanceTemplateNetworkInterface"]]:
        """network_interface block."""
        return self._values.get('network_interface')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """An instance template is a global resource that is not bound to a zone or a region.

        However, you can still specify some regional resources in an instance template, which restricts the template to the region where that resource resides. For example, a custom subnetwork resource is tied to a specific region. Defaults to the region of the Provider if no value is given.
        """
        return self._values.get('region')

    @builtins.property
    def scheduling(self) -> typing.Optional[typing.List["ComputeInstanceTemplateScheduling"]]:
        """scheduling block."""
        return self._values.get('scheduling')

    @builtins.property
    def service_account(self) -> typing.Optional[typing.List["ComputeInstanceTemplateServiceAccount"]]:
        """service_account block."""
        return self._values.get('service_account')

    @builtins.property
    def shielded_instance_config(self) -> typing.Optional[typing.List["ComputeInstanceTemplateShieldedInstanceConfig"]]:
        """shielded_instance_config block."""
        return self._values.get('shielded_instance_config')

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[str]]:
        """Tags to attach to the instance."""
        return self._values.get('tags')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeInstanceTemplateTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTemplateConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTemplateDisk", jsii_struct_bases=[], name_mapping={'auto_delete': 'autoDelete', 'boot': 'boot', 'device_name': 'deviceName', 'disk_encryption_key': 'diskEncryptionKey', 'disk_name': 'diskName', 'disk_size_gb': 'diskSizeGb', 'disk_type': 'diskType', 'interface': 'interface', 'labels': 'labels', 'mode': 'mode', 'source': 'source', 'source_image': 'sourceImage', 'type': 'type'})
class ComputeInstanceTemplateDisk():
    def __init__(self, *, auto_delete: typing.Optional[bool]=None, boot: typing.Optional[bool]=None, device_name: typing.Optional[str]=None, disk_encryption_key: typing.Optional[typing.List["ComputeInstanceTemplateDiskDiskEncryptionKey"]]=None, disk_name: typing.Optional[str]=None, disk_size_gb: typing.Optional[jsii.Number]=None, disk_type: typing.Optional[str]=None, interface: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, mode: typing.Optional[str]=None, source: typing.Optional[str]=None, source_image: typing.Optional[str]=None, type: typing.Optional[str]=None) -> None:
        """
        :param auto_delete: Whether or not the disk should be auto-deleted. This defaults to true.
        :param boot: Indicates that this is a boot disk.
        :param device_name: A unique device name that is reflected into the /dev/ tree of a Linux operating system running within the instance. If not specified, the server chooses a default device name to apply to this disk.
        :param disk_encryption_key: disk_encryption_key block.
        :param disk_name: Name of the disk. When not provided, this defaults to the name of the instance.
        :param disk_size_gb: The size of the image in gigabytes. If not specified, it will inherit the size of its base image. For SCRATCH disks, the size must be exactly 375GB.
        :param disk_type: The GCE disk type. Can be either "pd-ssd", "local-ssd", or "pd-standard".
        :param interface: Specifies the disk interface to use for attaching this disk.
        :param labels: A set of key/value label pairs to assign to disks,.
        :param mode: The mode in which to attach this disk, either READ_WRITE or READ_ONLY. If you are attaching or creating a boot disk, this must read-write mode.
        :param source: The name (not self_link) of the disk (such as those managed by google_compute_disk) to attach. ~> Note: Either source or source_image is required when creating a new instance except for when creating a local SSD.
        :param source_image: The image from which to initialize this disk. This can be one of: the image's self_link, projects/{project}/global/images/{image}, projects/{project}/global/images/family/{family}, global/images/{image}, global/images/family/{family}, family/{family}, {project}/{family}, {project}/{image}, {family}, or {image}. ~> Note: Either source or source_image is required when creating a new instance except for when creating a local SSD.
        :param type: The type of GCE disk, can be either "SCRATCH" or "PERSISTENT".
        """
        self._values = {
        }
        if auto_delete is not None: self._values["auto_delete"] = auto_delete
        if boot is not None: self._values["boot"] = boot
        if device_name is not None: self._values["device_name"] = device_name
        if disk_encryption_key is not None: self._values["disk_encryption_key"] = disk_encryption_key
        if disk_name is not None: self._values["disk_name"] = disk_name
        if disk_size_gb is not None: self._values["disk_size_gb"] = disk_size_gb
        if disk_type is not None: self._values["disk_type"] = disk_type
        if interface is not None: self._values["interface"] = interface
        if labels is not None: self._values["labels"] = labels
        if mode is not None: self._values["mode"] = mode
        if source is not None: self._values["source"] = source
        if source_image is not None: self._values["source_image"] = source_image
        if type is not None: self._values["type"] = type

    @builtins.property
    def auto_delete(self) -> typing.Optional[bool]:
        """Whether or not the disk should be auto-deleted.

        This defaults to true.
        """
        return self._values.get('auto_delete')

    @builtins.property
    def boot(self) -> typing.Optional[bool]:
        """Indicates that this is a boot disk."""
        return self._values.get('boot')

    @builtins.property
    def device_name(self) -> typing.Optional[str]:
        """A unique device name that is reflected into the /dev/ tree of a Linux operating system running within the instance.

        If not specified, the server chooses a default device name to apply to this disk.
        """
        return self._values.get('device_name')

    @builtins.property
    def disk_encryption_key(self) -> typing.Optional[typing.List["ComputeInstanceTemplateDiskDiskEncryptionKey"]]:
        """disk_encryption_key block."""
        return self._values.get('disk_encryption_key')

    @builtins.property
    def disk_name(self) -> typing.Optional[str]:
        """Name of the disk.

        When not provided, this defaults to the name of the instance.
        """
        return self._values.get('disk_name')

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        """The size of the image in gigabytes.

        If not specified, it will inherit the size of its base image. For SCRATCH disks, the size must be exactly 375GB.
        """
        return self._values.get('disk_size_gb')

    @builtins.property
    def disk_type(self) -> typing.Optional[str]:
        """The GCE disk type.

        Can be either "pd-ssd", "local-ssd", or "pd-standard".
        """
        return self._values.get('disk_type')

    @builtins.property
    def interface(self) -> typing.Optional[str]:
        """Specifies the disk interface to use for attaching this disk."""
        return self._values.get('interface')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value label pairs to assign to disks,."""
        return self._values.get('labels')

    @builtins.property
    def mode(self) -> typing.Optional[str]:
        """The mode in which to attach this disk, either READ_WRITE or READ_ONLY.

        If you are attaching or creating a boot disk, this must read-write mode.
        """
        return self._values.get('mode')

    @builtins.property
    def source(self) -> typing.Optional[str]:
        """The name (not self_link) of the disk (such as those managed by google_compute_disk) to attach.

        ~> Note: Either source or source_image is required when creating a new instance except for when creating a local SSD.
        """
        return self._values.get('source')

    @builtins.property
    def source_image(self) -> typing.Optional[str]:
        """The image from which to initialize this disk.

        This can be one of: the image's self_link, projects/{project}/global/images/{image}, projects/{project}/global/images/family/{family}, global/images/{image}, global/images/family/{family}, family/{family}, {project}/{family}, {project}/{image}, {family}, or {image}. ~> Note: Either source or source_image is required when creating a new instance except for when creating a local SSD.
        """
        return self._values.get('source_image')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        """The type of GCE disk, can be either "SCRATCH" or "PERSISTENT"."""
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTemplateDisk(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTemplateDiskDiskEncryptionKey", jsii_struct_bases=[], name_mapping={'kms_key_self_link': 'kmsKeySelfLink'})
class ComputeInstanceTemplateDiskDiskEncryptionKey():
    def __init__(self, *, kms_key_self_link: str) -> None:
        """
        :param kms_key_self_link: The self link of the encryption key that is stored in Google Cloud KMS.
        """
        self._values = {
            'kms_key_self_link': kms_key_self_link,
        }

    @builtins.property
    def kms_key_self_link(self) -> str:
        """The self link of the encryption key that is stored in Google Cloud KMS."""
        return self._values.get('kms_key_self_link')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTemplateDiskDiskEncryptionKey(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTemplateGuestAccelerator", jsii_struct_bases=[], name_mapping={'count': 'count', 'type': 'type'})
class ComputeInstanceTemplateGuestAccelerator():
    def __init__(self, *, count: jsii.Number, type: str) -> None:
        """
        :param count: The number of the guest accelerator cards exposed to this instance.
        :param type: The accelerator type resource to expose to this instance. E.g. nvidia-tesla-k80.
        """
        self._values = {
            'count': count,
            'type': type,
        }

    @builtins.property
    def count(self) -> jsii.Number:
        """The number of the guest accelerator cards exposed to this instance."""
        return self._values.get('count')

    @builtins.property
    def type(self) -> str:
        """The accelerator type resource to expose to this instance.

        E.g. nvidia-tesla-k80.
        """
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTemplateGuestAccelerator(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTemplateNetworkInterface", jsii_struct_bases=[], name_mapping={'access_config': 'accessConfig', 'alias_ip_range': 'aliasIpRange', 'network': 'network', 'network_ip': 'networkIp', 'subnetwork': 'subnetwork', 'subnetwork_project': 'subnetworkProject'})
class ComputeInstanceTemplateNetworkInterface():
    def __init__(self, *, access_config: typing.Optional[typing.List["ComputeInstanceTemplateNetworkInterfaceAccessConfig"]]=None, alias_ip_range: typing.Optional[typing.List["ComputeInstanceTemplateNetworkInterfaceAliasIpRange"]]=None, network: typing.Optional[str]=None, network_ip: typing.Optional[str]=None, subnetwork: typing.Optional[str]=None, subnetwork_project: typing.Optional[str]=None) -> None:
        """
        :param access_config: access_config block.
        :param alias_ip_range: alias_ip_range block.
        :param network: The name or self_link of the network to attach this interface to. Use network attribute for Legacy or Auto subnetted networks and subnetwork for custom subnetted networks.
        :param network_ip: The private IP address to assign to the instance. If empty, the address will be automatically assigned.
        :param subnetwork: The name of the subnetwork to attach this interface to. The subnetwork must exist in the same region this instance will be created in. Either network or subnetwork must be provided.
        :param subnetwork_project: The ID of the project in which the subnetwork belongs. If it is not provided, the provider project is used.
        """
        self._values = {
        }
        if access_config is not None: self._values["access_config"] = access_config
        if alias_ip_range is not None: self._values["alias_ip_range"] = alias_ip_range
        if network is not None: self._values["network"] = network
        if network_ip is not None: self._values["network_ip"] = network_ip
        if subnetwork is not None: self._values["subnetwork"] = subnetwork
        if subnetwork_project is not None: self._values["subnetwork_project"] = subnetwork_project

    @builtins.property
    def access_config(self) -> typing.Optional[typing.List["ComputeInstanceTemplateNetworkInterfaceAccessConfig"]]:
        """access_config block."""
        return self._values.get('access_config')

    @builtins.property
    def alias_ip_range(self) -> typing.Optional[typing.List["ComputeInstanceTemplateNetworkInterfaceAliasIpRange"]]:
        """alias_ip_range block."""
        return self._values.get('alias_ip_range')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """The name or self_link of the network to attach this interface to.

        Use network attribute for Legacy or Auto subnetted networks and subnetwork for custom subnetted networks.
        """
        return self._values.get('network')

    @builtins.property
    def network_ip(self) -> typing.Optional[str]:
        """The private IP address to assign to the instance.

        If empty, the address will be automatically assigned.
        """
        return self._values.get('network_ip')

    @builtins.property
    def subnetwork(self) -> typing.Optional[str]:
        """The name of the subnetwork to attach this interface to.

        The subnetwork must exist in the same region this instance will be created in. Either network or subnetwork must be provided.
        """
        return self._values.get('subnetwork')

    @builtins.property
    def subnetwork_project(self) -> typing.Optional[str]:
        """The ID of the project in which the subnetwork belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('subnetwork_project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTemplateNetworkInterface(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTemplateNetworkInterfaceAccessConfig", jsii_struct_bases=[], name_mapping={'nat_ip': 'natIp', 'network_tier': 'networkTier'})
class ComputeInstanceTemplateNetworkInterfaceAccessConfig():
    def __init__(self, *, nat_ip: typing.Optional[str]=None, network_tier: typing.Optional[str]=None) -> None:
        """
        :param nat_ip: The IP address that will be 1:1 mapped to the instance's network ip. If not given, one will be generated.
        :param network_tier: The networking tier used for configuring this instance template. This field can take the following values: PREMIUM or STANDARD. If this field is not specified, it is assumed to be PREMIUM.
        """
        self._values = {
        }
        if nat_ip is not None: self._values["nat_ip"] = nat_ip
        if network_tier is not None: self._values["network_tier"] = network_tier

    @builtins.property
    def nat_ip(self) -> typing.Optional[str]:
        """The IP address that will be 1:1 mapped to the instance's network ip.

        If not given, one will be generated.
        """
        return self._values.get('nat_ip')

    @builtins.property
    def network_tier(self) -> typing.Optional[str]:
        """The networking tier used for configuring this instance template.

        This field can take the following values: PREMIUM or STANDARD. If this field is not specified, it is assumed to be PREMIUM.
        """
        return self._values.get('network_tier')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTemplateNetworkInterfaceAccessConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTemplateNetworkInterfaceAliasIpRange", jsii_struct_bases=[], name_mapping={'ip_cidr_range': 'ipCidrRange', 'subnetwork_range_name': 'subnetworkRangeName'})
class ComputeInstanceTemplateNetworkInterfaceAliasIpRange():
    def __init__(self, *, ip_cidr_range: str, subnetwork_range_name: typing.Optional[str]=None) -> None:
        """
        :param ip_cidr_range: The IP CIDR range represented by this alias IP range. This IP CIDR range must belong to the specified subnetwork and cannot contain IP addresses reserved by system or used by other network interfaces. At the time of writing only a netmask (e.g. /24) may be supplied, with a CIDR format resulting in an API error.
        :param subnetwork_range_name: The subnetwork secondary range name specifying the secondary range from which to allocate the IP CIDR range for this alias IP range. If left unspecified, the primary range of the subnetwork will be used.
        """
        self._values = {
            'ip_cidr_range': ip_cidr_range,
        }
        if subnetwork_range_name is not None: self._values["subnetwork_range_name"] = subnetwork_range_name

    @builtins.property
    def ip_cidr_range(self) -> str:
        """The IP CIDR range represented by this alias IP range.

        This IP CIDR range must belong to the specified subnetwork and cannot contain IP addresses reserved by system or used by other network interfaces. At the time of writing only a netmask (e.g. /24) may be supplied, with a CIDR format resulting in an API error.
        """
        return self._values.get('ip_cidr_range')

    @builtins.property
    def subnetwork_range_name(self) -> typing.Optional[str]:
        """The subnetwork secondary range name specifying the secondary range from which to allocate the IP CIDR range for this alias IP range.

        If left unspecified, the primary range of the subnetwork will be used.
        """
        return self._values.get('subnetwork_range_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTemplateNetworkInterfaceAliasIpRange(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTemplateScheduling", jsii_struct_bases=[], name_mapping={'automatic_restart': 'automaticRestart', 'node_affinities': 'nodeAffinities', 'on_host_maintenance': 'onHostMaintenance', 'preemptible': 'preemptible'})
class ComputeInstanceTemplateScheduling():
    def __init__(self, *, automatic_restart: typing.Optional[bool]=None, node_affinities: typing.Optional[typing.List["ComputeInstanceTemplateSchedulingNodeAffinities"]]=None, on_host_maintenance: typing.Optional[str]=None, preemptible: typing.Optional[bool]=None) -> None:
        """
        :param automatic_restart: Specifies whether the instance should be automatically restarted if it is terminated by Compute Engine (not terminated by a user). This defaults to true.
        :param node_affinities: node_affinities block.
        :param on_host_maintenance: Defines the maintenance behavior for this instance.
        :param preemptible: Allows instance to be preempted. This defaults to false.
        """
        self._values = {
        }
        if automatic_restart is not None: self._values["automatic_restart"] = automatic_restart
        if node_affinities is not None: self._values["node_affinities"] = node_affinities
        if on_host_maintenance is not None: self._values["on_host_maintenance"] = on_host_maintenance
        if preemptible is not None: self._values["preemptible"] = preemptible

    @builtins.property
    def automatic_restart(self) -> typing.Optional[bool]:
        """Specifies whether the instance should be automatically restarted if it is terminated by Compute Engine (not terminated by a user).

        This defaults to true.
        """
        return self._values.get('automatic_restart')

    @builtins.property
    def node_affinities(self) -> typing.Optional[typing.List["ComputeInstanceTemplateSchedulingNodeAffinities"]]:
        """node_affinities block."""
        return self._values.get('node_affinities')

    @builtins.property
    def on_host_maintenance(self) -> typing.Optional[str]:
        """Defines the maintenance behavior for this instance."""
        return self._values.get('on_host_maintenance')

    @builtins.property
    def preemptible(self) -> typing.Optional[bool]:
        """Allows instance to be preempted.

        This defaults to false.
        """
        return self._values.get('preemptible')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTemplateScheduling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTemplateSchedulingNodeAffinities", jsii_struct_bases=[], name_mapping={'key': 'key', 'operator': 'operator', 'values': 'values'})
class ComputeInstanceTemplateSchedulingNodeAffinities():
    def __init__(self, *, key: str, operator: str, values: typing.List[str]) -> None:
        """
        :param key: 
        :param operator: 
        :param values: 
        """
        self._values = {
            'key': key,
            'operator': operator,
            'values': values,
        }

    @builtins.property
    def key(self) -> str:
        return self._values.get('key')

    @builtins.property
    def operator(self) -> str:
        return self._values.get('operator')

    @builtins.property
    def values(self) -> typing.List[str]:
        return self._values.get('values')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTemplateSchedulingNodeAffinities(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTemplateServiceAccount", jsii_struct_bases=[], name_mapping={'scopes': 'scopes', 'email': 'email'})
class ComputeInstanceTemplateServiceAccount():
    def __init__(self, *, scopes: typing.List[str], email: typing.Optional[str]=None) -> None:
        """
        :param scopes: A list of service scopes. Both OAuth2 URLs and gcloud short names are supported. To allow full access to all Cloud APIs, use the cloud-platform scope.
        :param email: The service account e-mail address. If not given, the default Google Compute Engine service account is used.
        """
        self._values = {
            'scopes': scopes,
        }
        if email is not None: self._values["email"] = email

    @builtins.property
    def scopes(self) -> typing.List[str]:
        """A list of service scopes.

        Both OAuth2 URLs and gcloud short names are supported. To allow full access to all Cloud APIs, use the cloud-platform scope.
        """
        return self._values.get('scopes')

    @builtins.property
    def email(self) -> typing.Optional[str]:
        """The service account e-mail address.

        If not given, the default Google Compute Engine service account is used.
        """
        return self._values.get('email')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTemplateServiceAccount(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTemplateShieldedInstanceConfig", jsii_struct_bases=[], name_mapping={'enable_integrity_monitoring': 'enableIntegrityMonitoring', 'enable_secure_boot': 'enableSecureBoot', 'enable_vtpm': 'enableVtpm'})
class ComputeInstanceTemplateShieldedInstanceConfig():
    def __init__(self, *, enable_integrity_monitoring: typing.Optional[bool]=None, enable_secure_boot: typing.Optional[bool]=None, enable_vtpm: typing.Optional[bool]=None) -> None:
        """
        :param enable_integrity_monitoring: Compare the most recent boot measurements to the integrity policy baseline and return a pair of pass/fail results depending on whether they match or not. Defaults to true.
        :param enable_secure_boot: Verify the digital signature of all boot components, and halt the boot process if signature verification fails. Defaults to false.
        :param enable_vtpm: Use a virtualized trusted platform module, which is a specialized computer chip you can use to encrypt objects like keys and certificates. Defaults to true.
        """
        self._values = {
        }
        if enable_integrity_monitoring is not None: self._values["enable_integrity_monitoring"] = enable_integrity_monitoring
        if enable_secure_boot is not None: self._values["enable_secure_boot"] = enable_secure_boot
        if enable_vtpm is not None: self._values["enable_vtpm"] = enable_vtpm

    @builtins.property
    def enable_integrity_monitoring(self) -> typing.Optional[bool]:
        """Compare the most recent boot measurements to the integrity policy baseline and return a pair of pass/fail results depending on whether they match or not.

        Defaults to true.
        """
        return self._values.get('enable_integrity_monitoring')

    @builtins.property
    def enable_secure_boot(self) -> typing.Optional[bool]:
        """Verify the digital signature of all boot components, and halt the boot process if signature verification fails.

        Defaults to false.
        """
        return self._values.get('enable_secure_boot')

    @builtins.property
    def enable_vtpm(self) -> typing.Optional[bool]:
        """Use a virtualized trusted platform module, which is a specialized computer chip you can use to encrypt objects like keys and certificates.

        Defaults to true.
        """
        return self._values.get('enable_vtpm')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTemplateShieldedInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTemplateTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeInstanceTemplateTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTemplateTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInstanceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeInstanceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInstanceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeInterconnectAttachment(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeInterconnectAttachment"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, router: str, admin_enabled: typing.Optional[bool]=None, bandwidth: typing.Optional[str]=None, candidate_subnets: typing.Optional[typing.List[str]]=None, description: typing.Optional[str]=None, edge_availability_domain: typing.Optional[str]=None, interconnect: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeInterconnectAttachmentTimeouts"]=None, type: typing.Optional[str]=None, vlan_tag8021_q: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param router: URL of the cloud router to be used for dynamic routing. This router must be in the same region as this InterconnectAttachment. The InterconnectAttachment will automatically connect the Interconnect to the network & region within which the Cloud Router is configured.
        :param admin_enabled: Whether the VLAN attachment is enabled or disabled. When using PARTNER type this will Pre-Activate the interconnect attachment
        :param bandwidth: Provisioned bandwidth capacity for the interconnect attachment. For attachments of type DEDICATED, the user can set the bandwidth. For attachments of type PARTNER, the Google Partner that is operating the interconnect must set the bandwidth. Output only for PARTNER type, mutable for PARTNER_PROVIDER and DEDICATED, Defaults to BPS_10G Possible values: ["BPS_50M", "BPS_100M", "BPS_200M", "BPS_300M", "BPS_400M", "BPS_500M", "BPS_1G", "BPS_2G", "BPS_5G", "BPS_10G", "BPS_20G", "BPS_50G"]
        :param candidate_subnets: Up to 16 candidate prefixes that can be used to restrict the allocation of cloudRouterIpAddress and customerRouterIpAddress for this attachment. All prefixes must be within link-local address space (169.254.0.0/16) and must be /29 or shorter (/28, /27, etc). Google will attempt to select an unused /29 from the supplied candidate prefix(es). The request will fail if all possible /29s are in use on Google's edge. If not supplied, Google will randomly select an unused /29 from all of link-local space.
        :param description: An optional description of this resource.
        :param edge_availability_domain: Desired availability domain for the attachment. Only available for type PARTNER, at creation time. For improved reliability, customers should configure a pair of attachments with one per availability domain. The selected availability domain will be provided to the Partner via the pairing key so that the provisioned circuit will lie in the specified domain. If not specified, the value will default to AVAILABILITY_DOMAIN_ANY.
        :param interconnect: URL of the underlying Interconnect object that this attachment's traffic will traverse through. Required if type is DEDICATED, must not be set if type is PARTNER.
        :param project: 
        :param region: Region where the regional interconnect attachment resides.
        :param timeouts: timeouts block.
        :param type: The type of InterconnectAttachment you wish to create. Defaults to DEDICATED. Possible values: ["DEDICATED", "PARTNER", "PARTNER_PROVIDER"]
        :param vlan_tag8021_q: The IEEE 802.1Q VLAN tag for this attachment, in the range 2-4094. When using PARTNER type this will be managed upstream.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeInterconnectAttachmentConfig(name=name, router=router, admin_enabled=admin_enabled, bandwidth=bandwidth, candidate_subnets=candidate_subnets, description=description, edge_availability_domain=edge_availability_domain, interconnect=interconnect, project=project, region=region, timeouts=timeouts, type=type, vlan_tag8021_q=vlan_tag8021_q, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeInterconnectAttachment, self, [scope, id, config])

    @jsii.member(jsii_name="privateInterconnectInfo")
    def private_interconnect_info(self, index: str) -> "ComputeInterconnectAttachmentPrivateInterconnectInfo":
        """
        :param index: -
        """
        return jsii.invoke(self, "privateInterconnectInfo", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="cloudRouterIpAddress")
    def cloud_router_ip_address(self) -> str:
        return jsii.get(self, "cloudRouterIpAddress")

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="customerRouterIpAddress")
    def customer_router_ip_address(self) -> str:
        return jsii.get(self, "customerRouterIpAddress")

    @builtins.property
    @jsii.member(jsii_name="googleReferenceId")
    def google_reference_id(self) -> str:
        return jsii.get(self, "googleReferenceId")

    @builtins.property
    @jsii.member(jsii_name="pairingKey")
    def pairing_key(self) -> str:
        return jsii.get(self, "pairingKey")

    @builtins.property
    @jsii.member(jsii_name="partnerAsn")
    def partner_asn(self) -> str:
        return jsii.get(self, "partnerAsn")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="state")
    def state(self) -> str:
        return jsii.get(self, "state")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="router")
    def router(self) -> str:
        return jsii.get(self, "router")

    @router.setter
    def router(self, value: str) -> None:
        jsii.set(self, "router", value)

    @builtins.property
    @jsii.member(jsii_name="adminEnabled")
    def admin_enabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "adminEnabled")

    @admin_enabled.setter
    def admin_enabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "adminEnabled", value)

    @builtins.property
    @jsii.member(jsii_name="bandwidth")
    def bandwidth(self) -> typing.Optional[str]:
        return jsii.get(self, "bandwidth")

    @bandwidth.setter
    def bandwidth(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "bandwidth", value)

    @builtins.property
    @jsii.member(jsii_name="candidateSubnets")
    def candidate_subnets(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "candidateSubnets")

    @candidate_subnets.setter
    def candidate_subnets(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "candidateSubnets", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="edgeAvailabilityDomain")
    def edge_availability_domain(self) -> typing.Optional[str]:
        return jsii.get(self, "edgeAvailabilityDomain")

    @edge_availability_domain.setter
    def edge_availability_domain(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "edgeAvailabilityDomain", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="interconnect")
    def interconnect(self) -> typing.Optional[str]:
        return jsii.get(self, "interconnect")

    @interconnect.setter
    def interconnect(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "interconnect", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeInterconnectAttachmentTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeInterconnectAttachmentTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> typing.Optional[str]:
        return jsii.get(self, "type")

    @type.setter
    def type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "type", value)

    @builtins.property
    @jsii.member(jsii_name="vlanTag8021Q")
    def vlan_tag8021_q(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "vlanTag8021Q")

    @vlan_tag8021_q.setter
    def vlan_tag8021_q(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "vlanTag8021Q", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInterconnectAttachmentConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'router': 'router', 'admin_enabled': 'adminEnabled', 'bandwidth': 'bandwidth', 'candidate_subnets': 'candidateSubnets', 'description': 'description', 'edge_availability_domain': 'edgeAvailabilityDomain', 'interconnect': 'interconnect', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts', 'type': 'type', 'vlan_tag8021_q': 'vlanTag8021Q'})
class ComputeInterconnectAttachmentConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, router: str, admin_enabled: typing.Optional[bool]=None, bandwidth: typing.Optional[str]=None, candidate_subnets: typing.Optional[typing.List[str]]=None, description: typing.Optional[str]=None, edge_availability_domain: typing.Optional[str]=None, interconnect: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeInterconnectAttachmentTimeouts"]=None, type: typing.Optional[str]=None, vlan_tag8021_q: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param router: URL of the cloud router to be used for dynamic routing. This router must be in the same region as this InterconnectAttachment. The InterconnectAttachment will automatically connect the Interconnect to the network & region within which the Cloud Router is configured.
        :param admin_enabled: Whether the VLAN attachment is enabled or disabled. When using PARTNER type this will Pre-Activate the interconnect attachment
        :param bandwidth: Provisioned bandwidth capacity for the interconnect attachment. For attachments of type DEDICATED, the user can set the bandwidth. For attachments of type PARTNER, the Google Partner that is operating the interconnect must set the bandwidth. Output only for PARTNER type, mutable for PARTNER_PROVIDER and DEDICATED, Defaults to BPS_10G Possible values: ["BPS_50M", "BPS_100M", "BPS_200M", "BPS_300M", "BPS_400M", "BPS_500M", "BPS_1G", "BPS_2G", "BPS_5G", "BPS_10G", "BPS_20G", "BPS_50G"]
        :param candidate_subnets: Up to 16 candidate prefixes that can be used to restrict the allocation of cloudRouterIpAddress and customerRouterIpAddress for this attachment. All prefixes must be within link-local address space (169.254.0.0/16) and must be /29 or shorter (/28, /27, etc). Google will attempt to select an unused /29 from the supplied candidate prefix(es). The request will fail if all possible /29s are in use on Google's edge. If not supplied, Google will randomly select an unused /29 from all of link-local space.
        :param description: An optional description of this resource.
        :param edge_availability_domain: Desired availability domain for the attachment. Only available for type PARTNER, at creation time. For improved reliability, customers should configure a pair of attachments with one per availability domain. The selected availability domain will be provided to the Partner via the pairing key so that the provisioned circuit will lie in the specified domain. If not specified, the value will default to AVAILABILITY_DOMAIN_ANY.
        :param interconnect: URL of the underlying Interconnect object that this attachment's traffic will traverse through. Required if type is DEDICATED, must not be set if type is PARTNER.
        :param project: 
        :param region: Region where the regional interconnect attachment resides.
        :param timeouts: timeouts block.
        :param type: The type of InterconnectAttachment you wish to create. Defaults to DEDICATED. Possible values: ["DEDICATED", "PARTNER", "PARTNER_PROVIDER"]
        :param vlan_tag8021_q: The IEEE 802.1Q VLAN tag for this attachment, in the range 2-4094. When using PARTNER type this will be managed upstream.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeInterconnectAttachmentTimeouts(**timeouts)
        self._values = {
            'name': name,
            'router': router,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if admin_enabled is not None: self._values["admin_enabled"] = admin_enabled
        if bandwidth is not None: self._values["bandwidth"] = bandwidth
        if candidate_subnets is not None: self._values["candidate_subnets"] = candidate_subnets
        if description is not None: self._values["description"] = description
        if edge_availability_domain is not None: self._values["edge_availability_domain"] = edge_availability_domain
        if interconnect is not None: self._values["interconnect"] = interconnect
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts
        if type is not None: self._values["type"] = type
        if vlan_tag8021_q is not None: self._values["vlan_tag8021_q"] = vlan_tag8021_q

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is created. The
        name must be 1-63 characters long, and comply with RFC1035. Specifically, the
        name must be 1-63 characters long and match the regular expression
        '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a
        lowercase letter, and all following characters must be a dash, lowercase
        letter, or digit, except the last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def router(self) -> str:
        """URL of the cloud router to be used for dynamic routing.

        This router must be in
        the same region as this InterconnectAttachment. The InterconnectAttachment will
        automatically connect the Interconnect to the network & region within which the
        Cloud Router is configured.
        """
        return self._values.get('router')

    @builtins.property
    def admin_enabled(self) -> typing.Optional[bool]:
        """Whether the VLAN attachment is enabled or disabled.

        When using
        PARTNER type this will Pre-Activate the interconnect attachment
        """
        return self._values.get('admin_enabled')

    @builtins.property
    def bandwidth(self) -> typing.Optional[str]:
        """Provisioned bandwidth capacity for the interconnect attachment.

        For attachments of type DEDICATED, the user can set the bandwidth.
        For attachments of type PARTNER, the Google Partner that is operating the interconnect must set the bandwidth.
        Output only for PARTNER type, mutable for PARTNER_PROVIDER and DEDICATED,
        Defaults to BPS_10G Possible values: ["BPS_50M", "BPS_100M", "BPS_200M", "BPS_300M", "BPS_400M", "BPS_500M", "BPS_1G", "BPS_2G", "BPS_5G", "BPS_10G", "BPS_20G", "BPS_50G"]
        """
        return self._values.get('bandwidth')

    @builtins.property
    def candidate_subnets(self) -> typing.Optional[typing.List[str]]:
        """Up to 16 candidate prefixes that can be used to restrict the allocation of cloudRouterIpAddress and customerRouterIpAddress for this attachment.

        All prefixes must be within link-local address space (169.254.0.0/16)
        and must be /29 or shorter (/28, /27, etc). Google will attempt to select
        an unused /29 from the supplied candidate prefix(es). The request will
        fail if all possible /29s are in use on Google's edge. If not supplied,
        Google will randomly select an unused /29 from all of link-local space.
        """
        return self._values.get('candidate_subnets')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def edge_availability_domain(self) -> typing.Optional[str]:
        """Desired availability domain for the attachment.

        Only available for type
        PARTNER, at creation time. For improved reliability, customers should
        configure a pair of attachments with one per availability domain. The
        selected availability domain will be provided to the Partner via the
        pairing key so that the provisioned circuit will lie in the specified
        domain. If not specified, the value will default to AVAILABILITY_DOMAIN_ANY.
        """
        return self._values.get('edge_availability_domain')

    @builtins.property
    def interconnect(self) -> typing.Optional[str]:
        """URL of the underlying Interconnect object that this attachment's traffic will traverse through.

        Required if type is DEDICATED, must not
        be set if type is PARTNER.
        """
        return self._values.get('interconnect')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """Region where the regional interconnect attachment resides."""
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeInterconnectAttachmentTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        """The type of InterconnectAttachment you wish to create.

        Defaults to
        DEDICATED. Possible values: ["DEDICATED", "PARTNER", "PARTNER_PROVIDER"]
        """
        return self._values.get('type')

    @builtins.property
    def vlan_tag8021_q(self) -> typing.Optional[jsii.Number]:
        """The IEEE 802.1Q VLAN tag for this attachment, in the range 2-4094. When using PARTNER type this will be managed upstream."""
        return self._values.get('vlan_tag8021_q')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInterconnectAttachmentConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeInterconnectAttachmentPrivateInterconnectInfo(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeInterconnectAttachmentPrivateInterconnectInfo"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(ComputeInterconnectAttachmentPrivateInterconnectInfo, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="tag8021Q")
    def tag8021_q(self) -> jsii.Number:
        return jsii.get(self, "tag8021Q")


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeInterconnectAttachmentTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeInterconnectAttachmentTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeInterconnectAttachmentTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeNetwork(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeNetwork"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, auto_create_subnetworks: typing.Optional[bool]=None, delete_default_routes_on_create: typing.Optional[bool]=None, description: typing.Optional[str]=None, project: typing.Optional[str]=None, routing_mode: typing.Optional[str]=None, timeouts: typing.Optional["ComputeNetworkTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param auto_create_subnetworks: When set to 'true', the network is created in "auto subnet mode" and it will create a subnet for each region automatically across the '10.128.0.0/9' address range. When set to 'false', the network is created in "custom subnet mode" so the user can explicitly connect subnetwork resources.
        :param delete_default_routes_on_create: 
        :param description: An optional description of this resource. The resource must be recreated to modify this field.
        :param project: 
        :param routing_mode: The network-wide routing mode to use. If set to 'REGIONAL', this network's cloud routers will only advertise routes with subnetworks of this network in the same region as the router. If set to 'GLOBAL', this network's cloud routers will advertise routes with all subnetworks of this network, across regions. Possible values: ["REGIONAL", "GLOBAL"]
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeNetworkConfig(name=name, auto_create_subnetworks=auto_create_subnetworks, delete_default_routes_on_create=delete_default_routes_on_create, description=description, project=project, routing_mode=routing_mode, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeNetwork, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="gatewayIpv4")
    def gateway_ipv4(self) -> str:
        return jsii.get(self, "gatewayIpv4")

    @builtins.property
    @jsii.member(jsii_name="ipv4Range")
    def ipv4_range(self) -> str:
        return jsii.get(self, "ipv4Range")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="autoCreateSubnetworks")
    def auto_create_subnetworks(self) -> typing.Optional[bool]:
        return jsii.get(self, "autoCreateSubnetworks")

    @auto_create_subnetworks.setter
    def auto_create_subnetworks(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "autoCreateSubnetworks", value)

    @builtins.property
    @jsii.member(jsii_name="deleteDefaultRoutesOnCreate")
    def delete_default_routes_on_create(self) -> typing.Optional[bool]:
        return jsii.get(self, "deleteDefaultRoutesOnCreate")

    @delete_default_routes_on_create.setter
    def delete_default_routes_on_create(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "deleteDefaultRoutesOnCreate", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="routingMode")
    def routing_mode(self) -> typing.Optional[str]:
        return jsii.get(self, "routingMode")

    @routing_mode.setter
    def routing_mode(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "routingMode", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeNetworkTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeNetworkTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNetworkConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'auto_create_subnetworks': 'autoCreateSubnetworks', 'delete_default_routes_on_create': 'deleteDefaultRoutesOnCreate', 'description': 'description', 'project': 'project', 'routing_mode': 'routingMode', 'timeouts': 'timeouts'})
class ComputeNetworkConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, auto_create_subnetworks: typing.Optional[bool]=None, delete_default_routes_on_create: typing.Optional[bool]=None, description: typing.Optional[str]=None, project: typing.Optional[str]=None, routing_mode: typing.Optional[str]=None, timeouts: typing.Optional["ComputeNetworkTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param auto_create_subnetworks: When set to 'true', the network is created in "auto subnet mode" and it will create a subnet for each region automatically across the '10.128.0.0/9' address range. When set to 'false', the network is created in "custom subnet mode" so the user can explicitly connect subnetwork resources.
        :param delete_default_routes_on_create: 
        :param description: An optional description of this resource. The resource must be recreated to modify this field.
        :param project: 
        :param routing_mode: The network-wide routing mode to use. If set to 'REGIONAL', this network's cloud routers will only advertise routes with subnetworks of this network in the same region as the router. If set to 'GLOBAL', this network's cloud routers will advertise routes with all subnetworks of this network, across regions. Possible values: ["REGIONAL", "GLOBAL"]
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeNetworkTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if auto_create_subnetworks is not None: self._values["auto_create_subnetworks"] = auto_create_subnetworks
        if delete_default_routes_on_create is not None: self._values["delete_default_routes_on_create"] = delete_default_routes_on_create
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if routing_mode is not None: self._values["routing_mode"] = routing_mode
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def auto_create_subnetworks(self) -> typing.Optional[bool]:
        """When set to 'true', the network is created in "auto subnet mode" and it will create a subnet for each region automatically across the '10.128.0.0/9' address range.

        When set to 'false', the network is created in "custom subnet mode" so
        the user can explicitly connect subnetwork resources.
        """
        return self._values.get('auto_create_subnetworks')

    @builtins.property
    def delete_default_routes_on_create(self) -> typing.Optional[bool]:
        return self._values.get('delete_default_routes_on_create')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        The resource must be
        recreated to modify this field.
        """
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def routing_mode(self) -> typing.Optional[str]:
        """The network-wide routing mode to use.

        If set to 'REGIONAL', this
        network's cloud routers will only advertise routes with subnetworks
        of this network in the same region as the router. If set to 'GLOBAL',
        this network's cloud routers will advertise routes with all
        subnetworks of this network, across regions. Possible values: ["REGIONAL", "GLOBAL"]
        """
        return self._values.get('routing_mode')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeNetworkTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNetworkConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeNetworkEndpoint(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeNetworkEndpoint"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, ip_address: str, network_endpoint_group: str, port: jsii.Number, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeNetworkEndpointTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: The name for a specific VM instance that the IP address belongs to. This is required for network endpoints of type GCE_VM_IP_PORT. The instance must be in the same zone of network endpoint group.
        :param ip_address: IPv4 address of network endpoint. The IP address must belong to a VM in GCE (either the primary IP or as part of an aliased IP range).
        :param network_endpoint_group: The network endpoint group this endpoint is part of.
        :param port: Port number of network endpoint.
        :param project: 
        :param timeouts: timeouts block.
        :param zone: Zone where the containing network endpoint group is located.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeNetworkEndpointConfig(instance=instance, ip_address=ip_address, network_endpoint_group=network_endpoint_group, port=port, project=project, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeNetworkEndpoint, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> str:
        return jsii.get(self, "ipAddress")

    @ip_address.setter
    def ip_address(self, value: str) -> None:
        jsii.set(self, "ipAddress", value)

    @builtins.property
    @jsii.member(jsii_name="networkEndpointGroup")
    def network_endpoint_group(self) -> str:
        return jsii.get(self, "networkEndpointGroup")

    @network_endpoint_group.setter
    def network_endpoint_group(self, value: str) -> None:
        jsii.set(self, "networkEndpointGroup", value)

    @builtins.property
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")

    @port.setter
    def port(self, value: jsii.Number) -> None:
        jsii.set(self, "port", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeNetworkEndpointTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeNetworkEndpointTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNetworkEndpointConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'ip_address': 'ipAddress', 'network_endpoint_group': 'networkEndpointGroup', 'port': 'port', 'project': 'project', 'timeouts': 'timeouts', 'zone': 'zone'})
class ComputeNetworkEndpointConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, ip_address: str, network_endpoint_group: str, port: jsii.Number, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeNetworkEndpointTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: The name for a specific VM instance that the IP address belongs to. This is required for network endpoints of type GCE_VM_IP_PORT. The instance must be in the same zone of network endpoint group.
        :param ip_address: IPv4 address of network endpoint. The IP address must belong to a VM in GCE (either the primary IP or as part of an aliased IP range).
        :param network_endpoint_group: The network endpoint group this endpoint is part of.
        :param port: Port number of network endpoint.
        :param project: 
        :param timeouts: timeouts block.
        :param zone: Zone where the containing network endpoint group is located.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeNetworkEndpointTimeouts(**timeouts)
        self._values = {
            'instance': instance,
            'ip_address': ip_address,
            'network_endpoint_group': network_endpoint_group,
            'port': port,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        """The name for a specific VM instance that the IP address belongs to.

        This is required for network endpoints of type GCE_VM_IP_PORT.
        The instance must be in the same zone of network endpoint group.
        """
        return self._values.get('instance')

    @builtins.property
    def ip_address(self) -> str:
        """IPv4 address of network endpoint.

        The IP address must belong
        to a VM in GCE (either the primary IP or as part of an aliased IP
        range).
        """
        return self._values.get('ip_address')

    @builtins.property
    def network_endpoint_group(self) -> str:
        """The network endpoint group this endpoint is part of."""
        return self._values.get('network_endpoint_group')

    @builtins.property
    def port(self) -> jsii.Number:
        """Port number of network endpoint."""
        return self._values.get('port')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeNetworkEndpointTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """Zone where the containing network endpoint group is located."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNetworkEndpointConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeNetworkEndpointGroup(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeNetworkEndpointGroup"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, network: str, default_port: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, network_endpoint_type: typing.Optional[str]=None, project: typing.Optional[str]=None, subnetwork: typing.Optional[str]=None, timeouts: typing.Optional["ComputeNetworkEndpointGroupTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: The network to which all network endpoints in the NEG belong. Uses "default" project network if unspecified.
        :param default_port: The default port used if the port number is not specified in the network endpoint.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param network_endpoint_type: Type of network endpoints in this network endpoint group. Default value: "GCE_VM_IP_PORT" Possible values: ["GCE_VM_IP_PORT"]
        :param project: 
        :param subnetwork: Optional subnetwork to which all network endpoints in the NEG belong.
        :param timeouts: timeouts block.
        :param zone: Zone where the network endpoint group is located.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeNetworkEndpointGroupConfig(name=name, network=network, default_port=default_port, description=description, network_endpoint_type=network_endpoint_type, project=project, subnetwork=subnetwork, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeNetworkEndpointGroup, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="size")
    def size(self) -> jsii.Number:
        return jsii.get(self, "size")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: str) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="defaultPort")
    def default_port(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "defaultPort")

    @default_port.setter
    def default_port(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "defaultPort", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="networkEndpointType")
    def network_endpoint_type(self) -> typing.Optional[str]:
        return jsii.get(self, "networkEndpointType")

    @network_endpoint_type.setter
    def network_endpoint_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "networkEndpointType", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> typing.Optional[str]:
        return jsii.get(self, "subnetwork")

    @subnetwork.setter
    def subnetwork(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "subnetwork", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeNetworkEndpointGroupTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeNetworkEndpointGroupTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNetworkEndpointGroupConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'network': 'network', 'default_port': 'defaultPort', 'description': 'description', 'network_endpoint_type': 'networkEndpointType', 'project': 'project', 'subnetwork': 'subnetwork', 'timeouts': 'timeouts', 'zone': 'zone'})
class ComputeNetworkEndpointGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, network: str, default_port: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, network_endpoint_type: typing.Optional[str]=None, project: typing.Optional[str]=None, subnetwork: typing.Optional[str]=None, timeouts: typing.Optional["ComputeNetworkEndpointGroupTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: The network to which all network endpoints in the NEG belong. Uses "default" project network if unspecified.
        :param default_port: The default port used if the port number is not specified in the network endpoint.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param network_endpoint_type: Type of network endpoints in this network endpoint group. Default value: "GCE_VM_IP_PORT" Possible values: ["GCE_VM_IP_PORT"]
        :param project: 
        :param subnetwork: Optional subnetwork to which all network endpoints in the NEG belong.
        :param timeouts: timeouts block.
        :param zone: Zone where the network endpoint group is located.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeNetworkEndpointGroupTimeouts(**timeouts)
        self._values = {
            'name': name,
            'network': network,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if default_port is not None: self._values["default_port"] = default_port
        if description is not None: self._values["description"] = description
        if network_endpoint_type is not None: self._values["network_endpoint_type"] = network_endpoint_type
        if project is not None: self._values["project"] = project
        if subnetwork is not None: self._values["subnetwork"] = subnetwork
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource;

        provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def network(self) -> str:
        """The network to which all network endpoints in the NEG belong.

        Uses "default" project network if unspecified.
        """
        return self._values.get('network')

    @builtins.property
    def default_port(self) -> typing.Optional[jsii.Number]:
        """The default port used if the port number is not specified in the network endpoint."""
        return self._values.get('default_port')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def network_endpoint_type(self) -> typing.Optional[str]:
        """Type of network endpoints in this network endpoint group.

        Default value: "GCE_VM_IP_PORT" Possible values: ["GCE_VM_IP_PORT"]
        """
        return self._values.get('network_endpoint_type')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def subnetwork(self) -> typing.Optional[str]:
        """Optional subnetwork to which all network endpoints in the NEG belong."""
        return self._values.get('subnetwork')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeNetworkEndpointGroupTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """Zone where the network endpoint group is located."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNetworkEndpointGroupConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNetworkEndpointGroupTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeNetworkEndpointGroupTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNetworkEndpointGroupTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNetworkEndpointTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeNetworkEndpointTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNetworkEndpointTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeNetworkPeering(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeNetworkPeering"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, network: str, peer_network: str, auto_create_routes: typing.Optional[bool]=None, export_custom_routes: typing.Optional[bool]=None, export_subnet_routes_with_public_ip: typing.Optional[bool]=None, import_custom_routes: typing.Optional[bool]=None, import_subnet_routes_with_public_ip: typing.Optional[bool]=None, timeouts: typing.Optional["ComputeNetworkPeeringTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the peering.
        :param network: The primary network of the peering.
        :param peer_network: The peer network in the peering. The peer network may belong to a different project.
        :param auto_create_routes: 
        :param export_custom_routes: Whether to export the custom routes to the peer network. Defaults to false.
        :param export_subnet_routes_with_public_ip: 
        :param import_custom_routes: Whether to export the custom routes from the peer network. Defaults to false.
        :param import_subnet_routes_with_public_ip: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeNetworkPeeringConfig(name=name, network=network, peer_network=peer_network, auto_create_routes=auto_create_routes, export_custom_routes=export_custom_routes, export_subnet_routes_with_public_ip=export_subnet_routes_with_public_ip, import_custom_routes=import_custom_routes, import_subnet_routes_with_public_ip=import_subnet_routes_with_public_ip, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeNetworkPeering, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="state")
    def state(self) -> str:
        return jsii.get(self, "state")

    @builtins.property
    @jsii.member(jsii_name="stateDetails")
    def state_details(self) -> str:
        return jsii.get(self, "stateDetails")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: str) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="peerNetwork")
    def peer_network(self) -> str:
        return jsii.get(self, "peerNetwork")

    @peer_network.setter
    def peer_network(self, value: str) -> None:
        jsii.set(self, "peerNetwork", value)

    @builtins.property
    @jsii.member(jsii_name="autoCreateRoutes")
    def auto_create_routes(self) -> typing.Optional[bool]:
        return jsii.get(self, "autoCreateRoutes")

    @auto_create_routes.setter
    def auto_create_routes(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "autoCreateRoutes", value)

    @builtins.property
    @jsii.member(jsii_name="exportCustomRoutes")
    def export_custom_routes(self) -> typing.Optional[bool]:
        return jsii.get(self, "exportCustomRoutes")

    @export_custom_routes.setter
    def export_custom_routes(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "exportCustomRoutes", value)

    @builtins.property
    @jsii.member(jsii_name="exportSubnetRoutesWithPublicIp")
    def export_subnet_routes_with_public_ip(self) -> typing.Optional[bool]:
        return jsii.get(self, "exportSubnetRoutesWithPublicIp")

    @export_subnet_routes_with_public_ip.setter
    def export_subnet_routes_with_public_ip(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "exportSubnetRoutesWithPublicIp", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="importCustomRoutes")
    def import_custom_routes(self) -> typing.Optional[bool]:
        return jsii.get(self, "importCustomRoutes")

    @import_custom_routes.setter
    def import_custom_routes(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "importCustomRoutes", value)

    @builtins.property
    @jsii.member(jsii_name="importSubnetRoutesWithPublicIp")
    def import_subnet_routes_with_public_ip(self) -> typing.Optional[bool]:
        return jsii.get(self, "importSubnetRoutesWithPublicIp")

    @import_subnet_routes_with_public_ip.setter
    def import_subnet_routes_with_public_ip(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "importSubnetRoutesWithPublicIp", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeNetworkPeeringTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeNetworkPeeringTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNetworkPeeringConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'network': 'network', 'peer_network': 'peerNetwork', 'auto_create_routes': 'autoCreateRoutes', 'export_custom_routes': 'exportCustomRoutes', 'export_subnet_routes_with_public_ip': 'exportSubnetRoutesWithPublicIp', 'import_custom_routes': 'importCustomRoutes', 'import_subnet_routes_with_public_ip': 'importSubnetRoutesWithPublicIp', 'timeouts': 'timeouts'})
class ComputeNetworkPeeringConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, network: str, peer_network: str, auto_create_routes: typing.Optional[bool]=None, export_custom_routes: typing.Optional[bool]=None, export_subnet_routes_with_public_ip: typing.Optional[bool]=None, import_custom_routes: typing.Optional[bool]=None, import_subnet_routes_with_public_ip: typing.Optional[bool]=None, timeouts: typing.Optional["ComputeNetworkPeeringTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the peering.
        :param network: The primary network of the peering.
        :param peer_network: The peer network in the peering. The peer network may belong to a different project.
        :param auto_create_routes: 
        :param export_custom_routes: Whether to export the custom routes to the peer network. Defaults to false.
        :param export_subnet_routes_with_public_ip: 
        :param import_custom_routes: Whether to export the custom routes from the peer network. Defaults to false.
        :param import_subnet_routes_with_public_ip: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeNetworkPeeringTimeouts(**timeouts)
        self._values = {
            'name': name,
            'network': network,
            'peer_network': peer_network,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if auto_create_routes is not None: self._values["auto_create_routes"] = auto_create_routes
        if export_custom_routes is not None: self._values["export_custom_routes"] = export_custom_routes
        if export_subnet_routes_with_public_ip is not None: self._values["export_subnet_routes_with_public_ip"] = export_subnet_routes_with_public_ip
        if import_custom_routes is not None: self._values["import_custom_routes"] = import_custom_routes
        if import_subnet_routes_with_public_ip is not None: self._values["import_subnet_routes_with_public_ip"] = import_subnet_routes_with_public_ip
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the peering."""
        return self._values.get('name')

    @builtins.property
    def network(self) -> str:
        """The primary network of the peering."""
        return self._values.get('network')

    @builtins.property
    def peer_network(self) -> str:
        """The peer network in the peering.

        The peer network may belong to a different project.
        """
        return self._values.get('peer_network')

    @builtins.property
    def auto_create_routes(self) -> typing.Optional[bool]:
        return self._values.get('auto_create_routes')

    @builtins.property
    def export_custom_routes(self) -> typing.Optional[bool]:
        """Whether to export the custom routes to the peer network.

        Defaults to false.
        """
        return self._values.get('export_custom_routes')

    @builtins.property
    def export_subnet_routes_with_public_ip(self) -> typing.Optional[bool]:
        return self._values.get('export_subnet_routes_with_public_ip')

    @builtins.property
    def import_custom_routes(self) -> typing.Optional[bool]:
        """Whether to export the custom routes from the peer network.

        Defaults to false.
        """
        return self._values.get('import_custom_routes')

    @builtins.property
    def import_subnet_routes_with_public_ip(self) -> typing.Optional[bool]:
        return self._values.get('import_subnet_routes_with_public_ip')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeNetworkPeeringTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNetworkPeeringConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeNetworkPeeringRoutesConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeNetworkPeeringRoutesConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, export_custom_routes: bool, import_custom_routes: bool, network: str, peering: str, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeNetworkPeeringRoutesConfigTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param export_custom_routes: Whether to export the custom routes to the peer network.
        :param import_custom_routes: Whether to import the custom routes to the peer network.
        :param network: The name of the primary network for the peering.
        :param peering: Name of the peering.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeNetworkPeeringRoutesConfigConfig(export_custom_routes=export_custom_routes, import_custom_routes=import_custom_routes, network=network, peering=peering, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeNetworkPeeringRoutesConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="exportCustomRoutes")
    def export_custom_routes(self) -> bool:
        return jsii.get(self, "exportCustomRoutes")

    @export_custom_routes.setter
    def export_custom_routes(self, value: bool) -> None:
        jsii.set(self, "exportCustomRoutes", value)

    @builtins.property
    @jsii.member(jsii_name="importCustomRoutes")
    def import_custom_routes(self) -> bool:
        return jsii.get(self, "importCustomRoutes")

    @import_custom_routes.setter
    def import_custom_routes(self, value: bool) -> None:
        jsii.set(self, "importCustomRoutes", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: str) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="peering")
    def peering(self) -> str:
        return jsii.get(self, "peering")

    @peering.setter
    def peering(self, value: str) -> None:
        jsii.set(self, "peering", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeNetworkPeeringRoutesConfigTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeNetworkPeeringRoutesConfigTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNetworkPeeringRoutesConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'export_custom_routes': 'exportCustomRoutes', 'import_custom_routes': 'importCustomRoutes', 'network': 'network', 'peering': 'peering', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeNetworkPeeringRoutesConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, export_custom_routes: bool, import_custom_routes: bool, network: str, peering: str, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeNetworkPeeringRoutesConfigTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param export_custom_routes: Whether to export the custom routes to the peer network.
        :param import_custom_routes: Whether to import the custom routes to the peer network.
        :param network: The name of the primary network for the peering.
        :param peering: Name of the peering.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeNetworkPeeringRoutesConfigTimeouts(**timeouts)
        self._values = {
            'export_custom_routes': export_custom_routes,
            'import_custom_routes': import_custom_routes,
            'network': network,
            'peering': peering,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def export_custom_routes(self) -> bool:
        """Whether to export the custom routes to the peer network."""
        return self._values.get('export_custom_routes')

    @builtins.property
    def import_custom_routes(self) -> bool:
        """Whether to import the custom routes to the peer network."""
        return self._values.get('import_custom_routes')

    @builtins.property
    def network(self) -> str:
        """The name of the primary network for the peering."""
        return self._values.get('network')

    @builtins.property
    def peering(self) -> str:
        """Name of the peering."""
        return self._values.get('peering')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeNetworkPeeringRoutesConfigTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNetworkPeeringRoutesConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNetworkPeeringRoutesConfigTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeNetworkPeeringRoutesConfigTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNetworkPeeringRoutesConfigTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNetworkPeeringTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeNetworkPeeringTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNetworkPeeringTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNetworkTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeNetworkTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNetworkTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeNodeGroup(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeNodeGroup"):
    def __init__(self, scope: constructs.Construct, id: str, *, node_template: str, size: jsii.Number, description: typing.Optional[str]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeNodeGroupTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param node_template: The URL of the node template to which this node group belongs.
        :param size: The total number of nodes in the node group.
        :param description: An optional textual description of the resource.
        :param name: Name of the resource.
        :param project: 
        :param timeouts: timeouts block.
        :param zone: Zone where this node group is located.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeNodeGroupConfig(node_template=node_template, size=size, description=description, name=name, project=project, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeNodeGroup, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="nodeTemplate")
    def node_template(self) -> str:
        return jsii.get(self, "nodeTemplate")

    @node_template.setter
    def node_template(self, value: str) -> None:
        jsii.set(self, "nodeTemplate", value)

    @builtins.property
    @jsii.member(jsii_name="size")
    def size(self) -> jsii.Number:
        return jsii.get(self, "size")

    @size.setter
    def size(self, value: jsii.Number) -> None:
        jsii.set(self, "size", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeNodeGroupTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeNodeGroupTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNodeGroupConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'node_template': 'nodeTemplate', 'size': 'size', 'description': 'description', 'name': 'name', 'project': 'project', 'timeouts': 'timeouts', 'zone': 'zone'})
class ComputeNodeGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, node_template: str, size: jsii.Number, description: typing.Optional[str]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeNodeGroupTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param node_template: The URL of the node template to which this node group belongs.
        :param size: The total number of nodes in the node group.
        :param description: An optional textual description of the resource.
        :param name: Name of the resource.
        :param project: 
        :param timeouts: timeouts block.
        :param zone: Zone where this node group is located.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeNodeGroupTimeouts(**timeouts)
        self._values = {
            'node_template': node_template,
            'size': size,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if name is not None: self._values["name"] = name
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def node_template(self) -> str:
        """The URL of the node template to which this node group belongs."""
        return self._values.get('node_template')

    @builtins.property
    def size(self) -> jsii.Number:
        """The total number of nodes in the node group."""
        return self._values.get('size')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional textual description of the resource."""
        return self._values.get('description')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Name of the resource."""
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeNodeGroupTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """Zone where this node group is located."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNodeGroupConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNodeGroupTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeNodeGroupTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNodeGroupTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeNodeTemplate(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeNodeTemplate"):
    def __init__(self, scope: constructs.Construct, id: str, *, description: typing.Optional[str]=None, name: typing.Optional[str]=None, node_affinity_labels: typing.Optional[typing.Mapping[str, str]]=None, node_type: typing.Optional[str]=None, node_type_flexibility: typing.Optional[typing.List["ComputeNodeTemplateNodeTypeFlexibility"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeNodeTemplateTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param description: An optional textual description of the resource.
        :param name: Name of the resource.
        :param node_affinity_labels: Labels to use for node affinity, which will be used in instance scheduling.
        :param node_type: Node type to use for nodes group that are created from this template. Only one of nodeTypeFlexibility and nodeType can be specified.
        :param node_type_flexibility: node_type_flexibility block.
        :param project: 
        :param region: Region where nodes using the node template will be created. If it is not provided, the provider region is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeNodeTemplateConfig(description=description, name=name, node_affinity_labels=node_affinity_labels, node_type=node_type, node_type_flexibility=node_type_flexibility, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeNodeTemplate, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="nodeAffinityLabels")
    def node_affinity_labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "nodeAffinityLabels")

    @node_affinity_labels.setter
    def node_affinity_labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "nodeAffinityLabels", value)

    @builtins.property
    @jsii.member(jsii_name="nodeType")
    def node_type(self) -> typing.Optional[str]:
        return jsii.get(self, "nodeType")

    @node_type.setter
    def node_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "nodeType", value)

    @builtins.property
    @jsii.member(jsii_name="nodeTypeFlexibility")
    def node_type_flexibility(self) -> typing.Optional[typing.List["ComputeNodeTemplateNodeTypeFlexibility"]]:
        return jsii.get(self, "nodeTypeFlexibility")

    @node_type_flexibility.setter
    def node_type_flexibility(self, value: typing.Optional[typing.List["ComputeNodeTemplateNodeTypeFlexibility"]]) -> None:
        jsii.set(self, "nodeTypeFlexibility", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeNodeTemplateTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeNodeTemplateTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNodeTemplateConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'description': 'description', 'name': 'name', 'node_affinity_labels': 'nodeAffinityLabels', 'node_type': 'nodeType', 'node_type_flexibility': 'nodeTypeFlexibility', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class ComputeNodeTemplateConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, description: typing.Optional[str]=None, name: typing.Optional[str]=None, node_affinity_labels: typing.Optional[typing.Mapping[str, str]]=None, node_type: typing.Optional[str]=None, node_type_flexibility: typing.Optional[typing.List["ComputeNodeTemplateNodeTypeFlexibility"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeNodeTemplateTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param description: An optional textual description of the resource.
        :param name: Name of the resource.
        :param node_affinity_labels: Labels to use for node affinity, which will be used in instance scheduling.
        :param node_type: Node type to use for nodes group that are created from this template. Only one of nodeTypeFlexibility and nodeType can be specified.
        :param node_type_flexibility: node_type_flexibility block.
        :param project: 
        :param region: Region where nodes using the node template will be created. If it is not provided, the provider region is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeNodeTemplateTimeouts(**timeouts)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if name is not None: self._values["name"] = name
        if node_affinity_labels is not None: self._values["node_affinity_labels"] = node_affinity_labels
        if node_type is not None: self._values["node_type"] = node_type
        if node_type_flexibility is not None: self._values["node_type_flexibility"] = node_type_flexibility
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional textual description of the resource."""
        return self._values.get('description')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Name of the resource."""
        return self._values.get('name')

    @builtins.property
    def node_affinity_labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Labels to use for node affinity, which will be used in instance scheduling."""
        return self._values.get('node_affinity_labels')

    @builtins.property
    def node_type(self) -> typing.Optional[str]:
        """Node type to use for nodes group that are created from this template.

        Only one of nodeTypeFlexibility and nodeType can be specified.
        """
        return self._values.get('node_type')

    @builtins.property
    def node_type_flexibility(self) -> typing.Optional[typing.List["ComputeNodeTemplateNodeTypeFlexibility"]]:
        """node_type_flexibility block."""
        return self._values.get('node_type_flexibility')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """Region where nodes using the node template will be created.

        If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeNodeTemplateTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNodeTemplateConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNodeTemplateNodeTypeFlexibility", jsii_struct_bases=[], name_mapping={'cpus': 'cpus', 'memory': 'memory'})
class ComputeNodeTemplateNodeTypeFlexibility():
    def __init__(self, *, cpus: typing.Optional[str]=None, memory: typing.Optional[str]=None) -> None:
        """
        :param cpus: Number of virtual CPUs to use.
        :param memory: Physical memory available to the node, defined in MB.
        """
        self._values = {
        }
        if cpus is not None: self._values["cpus"] = cpus
        if memory is not None: self._values["memory"] = memory

    @builtins.property
    def cpus(self) -> typing.Optional[str]:
        """Number of virtual CPUs to use."""
        return self._values.get('cpus')

    @builtins.property
    def memory(self) -> typing.Optional[str]:
        """Physical memory available to the node, defined in MB."""
        return self._values.get('memory')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNodeTemplateNodeTypeFlexibility(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeNodeTemplateTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeNodeTemplateTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeNodeTemplateTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeProjectDefaultNetworkTier(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeProjectDefaultNetworkTier"):
    def __init__(self, scope: constructs.Construct, id: str, *, network_tier: str, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeProjectDefaultNetworkTierTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param network_tier: The default network tier to be configured for the project. This field can take the following values: PREMIUM or STANDARD.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeProjectDefaultNetworkTierConfig(network_tier=network_tier, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeProjectDefaultNetworkTier, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="networkTier")
    def network_tier(self) -> str:
        return jsii.get(self, "networkTier")

    @network_tier.setter
    def network_tier(self, value: str) -> None:
        jsii.set(self, "networkTier", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeProjectDefaultNetworkTierTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeProjectDefaultNetworkTierTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeProjectDefaultNetworkTierConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'network_tier': 'networkTier', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeProjectDefaultNetworkTierConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, network_tier: str, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeProjectDefaultNetworkTierTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param network_tier: The default network tier to be configured for the project. This field can take the following values: PREMIUM or STANDARD.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeProjectDefaultNetworkTierTimeouts(**timeouts)
        self._values = {
            'network_tier': network_tier,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def network_tier(self) -> str:
        """The default network tier to be configured for the project.

        This field can take the following values: PREMIUM or STANDARD.
        """
        return self._values.get('network_tier')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeProjectDefaultNetworkTierTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeProjectDefaultNetworkTierConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeProjectDefaultNetworkTierTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create'})
class ComputeProjectDefaultNetworkTierTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None) -> None:
        """
        :param create: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeProjectDefaultNetworkTierTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeProjectMetadata(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeProjectMetadata"):
    def __init__(self, scope: constructs.Construct, id: str, *, metadata: typing.Mapping[str, str], project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeProjectMetadataTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param metadata: A series of key value pairs.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeProjectMetadataConfig(metadata=metadata, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeProjectMetadata, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Mapping[str, str]:
        return jsii.get(self, "metadata")

    @metadata.setter
    def metadata(self, value: typing.Mapping[str, str]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeProjectMetadataTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeProjectMetadataTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeProjectMetadataConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'metadata': 'metadata', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeProjectMetadataConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, metadata: typing.Mapping[str, str], project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeProjectMetadataTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param metadata: A series of key value pairs.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeProjectMetadataTimeouts(**timeouts)
        self._values = {
            'metadata': metadata,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def metadata(self) -> typing.Mapping[str, str]:
        """A series of key value pairs."""
        return self._values.get('metadata')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeProjectMetadataTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeProjectMetadataConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeProjectMetadataItem(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeProjectMetadataItem"):
    def __init__(self, scope: constructs.Construct, id: str, *, key: str, value: str, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeProjectMetadataItemTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param key: The metadata key to set.
        :param value: The value to set for the given metadata key.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeProjectMetadataItemConfig(key=key, value=value, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeProjectMetadataItem, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="key")
    def key(self) -> str:
        return jsii.get(self, "key")

    @key.setter
    def key(self, value: str) -> None:
        jsii.set(self, "key", value)

    @builtins.property
    @jsii.member(jsii_name="value")
    def value(self) -> str:
        return jsii.get(self, "value")

    @value.setter
    def value(self, value: str) -> None:
        jsii.set(self, "value", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeProjectMetadataItemTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeProjectMetadataItemTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeProjectMetadataItemConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'key': 'key', 'value': 'value', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeProjectMetadataItemConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, key: str, value: str, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeProjectMetadataItemTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key: The metadata key to set.
        :param value: The value to set for the given metadata key.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeProjectMetadataItemTimeouts(**timeouts)
        self._values = {
            'key': key,
            'value': value,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def key(self) -> str:
        """The metadata key to set."""
        return self._values.get('key')

    @builtins.property
    def value(self) -> str:
        """The value to set for the given metadata key."""
        return self._values.get('value')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeProjectMetadataItemTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeProjectMetadataItemConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeProjectMetadataItemTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeProjectMetadataItemTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeProjectMetadataItemTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeProjectMetadataTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeProjectMetadataTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeProjectMetadataTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRegionAutoscaler(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRegionAutoscaler"):
    def __init__(self, scope: constructs.Construct, id: str, *, autoscaling_policy: typing.List["ComputeRegionAutoscalerAutoscalingPolicy"], name: str, target: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRegionAutoscalerTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param autoscaling_policy: autoscaling_policy block.
        :param name: Name of the resource. The name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param target: URL of the managed instance group that this autoscaler will scale.
        :param description: An optional description of this resource.
        :param project: 
        :param region: URL of the region where the instance group resides.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRegionAutoscalerConfig(autoscaling_policy=autoscaling_policy, name=name, target=target, description=description, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRegionAutoscaler, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="autoscalingPolicy")
    def autoscaling_policy(self) -> typing.List["ComputeRegionAutoscalerAutoscalingPolicy"]:
        return jsii.get(self, "autoscalingPolicy")

    @autoscaling_policy.setter
    def autoscaling_policy(self, value: typing.List["ComputeRegionAutoscalerAutoscalingPolicy"]) -> None:
        jsii.set(self, "autoscalingPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="target")
    def target(self) -> str:
        return jsii.get(self, "target")

    @target.setter
    def target(self, value: str) -> None:
        jsii.set(self, "target", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRegionAutoscalerTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRegionAutoscalerTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionAutoscalerAutoscalingPolicy", jsii_struct_bases=[], name_mapping={'max_replicas': 'maxReplicas', 'min_replicas': 'minReplicas', 'cooldown_period': 'cooldownPeriod', 'cpu_utilization': 'cpuUtilization', 'load_balancing_utilization': 'loadBalancingUtilization', 'metric': 'metric', 'mode': 'mode'})
class ComputeRegionAutoscalerAutoscalingPolicy():
    def __init__(self, *, max_replicas: jsii.Number, min_replicas: jsii.Number, cooldown_period: typing.Optional[jsii.Number]=None, cpu_utilization: typing.Optional[typing.List["ComputeRegionAutoscalerAutoscalingPolicyCpuUtilization"]]=None, load_balancing_utilization: typing.Optional[typing.List["ComputeRegionAutoscalerAutoscalingPolicyLoadBalancingUtilization"]]=None, metric: typing.Optional[typing.List["ComputeRegionAutoscalerAutoscalingPolicyMetric"]]=None, mode: typing.Optional[str]=None) -> None:
        """
        :param max_replicas: The maximum number of instances that the autoscaler can scale up to. This is required when creating or updating an autoscaler. The maximum number of replicas should not be lower than minimal number of replicas.
        :param min_replicas: The minimum number of replicas that the autoscaler can scale down to. This cannot be less than 0. If not provided, autoscaler will choose a default value depending on maximum number of instances allowed.
        :param cooldown_period: The number of seconds that the autoscaler should wait before it starts collecting information from a new instance. This prevents the autoscaler from collecting information when the instance is initializing, during which the collected usage would not be reliable. The default time autoscaler waits is 60 seconds. Virtual machine initialization times might vary because of numerous factors. We recommend that you test how long an instance may take to initialize. To do this, create an instance and time the startup process.
        :param cpu_utilization: cpu_utilization block.
        :param load_balancing_utilization: load_balancing_utilization block.
        :param metric: metric block.
        :param mode: Defines operating mode for this policy. Default value: "ON" Possible values: ["OFF", "ONLY_UP", "ON"]
        """
        self._values = {
            'max_replicas': max_replicas,
            'min_replicas': min_replicas,
        }
        if cooldown_period is not None: self._values["cooldown_period"] = cooldown_period
        if cpu_utilization is not None: self._values["cpu_utilization"] = cpu_utilization
        if load_balancing_utilization is not None: self._values["load_balancing_utilization"] = load_balancing_utilization
        if metric is not None: self._values["metric"] = metric
        if mode is not None: self._values["mode"] = mode

    @builtins.property
    def max_replicas(self) -> jsii.Number:
        """The maximum number of instances that the autoscaler can scale up to.

        This is required when creating or updating an autoscaler. The
        maximum number of replicas should not be lower than minimal number
        of replicas.
        """
        return self._values.get('max_replicas')

    @builtins.property
    def min_replicas(self) -> jsii.Number:
        """The minimum number of replicas that the autoscaler can scale down to.

        This cannot be less than 0. If not provided, autoscaler will
        choose a default value depending on maximum number of instances
        allowed.
        """
        return self._values.get('min_replicas')

    @builtins.property
    def cooldown_period(self) -> typing.Optional[jsii.Number]:
        """The number of seconds that the autoscaler should wait before it starts collecting information from a new instance.

        This prevents
        the autoscaler from collecting information when the instance is
        initializing, during which the collected usage would not be
        reliable. The default time autoscaler waits is 60 seconds.

        Virtual machine initialization times might vary because of
        numerous factors. We recommend that you test how long an
        instance may take to initialize. To do this, create an instance
        and time the startup process.
        """
        return self._values.get('cooldown_period')

    @builtins.property
    def cpu_utilization(self) -> typing.Optional[typing.List["ComputeRegionAutoscalerAutoscalingPolicyCpuUtilization"]]:
        """cpu_utilization block."""
        return self._values.get('cpu_utilization')

    @builtins.property
    def load_balancing_utilization(self) -> typing.Optional[typing.List["ComputeRegionAutoscalerAutoscalingPolicyLoadBalancingUtilization"]]:
        """load_balancing_utilization block."""
        return self._values.get('load_balancing_utilization')

    @builtins.property
    def metric(self) -> typing.Optional[typing.List["ComputeRegionAutoscalerAutoscalingPolicyMetric"]]:
        """metric block."""
        return self._values.get('metric')

    @builtins.property
    def mode(self) -> typing.Optional[str]:
        """Defines operating mode for this policy.

        Default value: "ON" Possible values: ["OFF", "ONLY_UP", "ON"]
        """
        return self._values.get('mode')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionAutoscalerAutoscalingPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionAutoscalerAutoscalingPolicyCpuUtilization", jsii_struct_bases=[], name_mapping={'target': 'target'})
class ComputeRegionAutoscalerAutoscalingPolicyCpuUtilization():
    def __init__(self, *, target: jsii.Number) -> None:
        """
        :param target: The target CPU utilization that the autoscaler should maintain. Must be a float value in the range (0, 1]. If not specified, the default is 0.6. If the CPU level is below the target utilization, the autoscaler scales down the number of instances until it reaches the minimum number of instances you specified or until the average CPU of your instances reaches the target utilization. If the average CPU is above the target utilization, the autoscaler scales up until it reaches the maximum number of instances you specified or until the average utilization reaches the target utilization.
        """
        self._values = {
            'target': target,
        }

    @builtins.property
    def target(self) -> jsii.Number:
        """The target CPU utilization that the autoscaler should maintain.

        Must be a float value in the range (0, 1]. If not specified, the
        default is 0.6.

        If the CPU level is below the target utilization, the autoscaler
        scales down the number of instances until it reaches the minimum
        number of instances you specified or until the average CPU of
        your instances reaches the target utilization.

        If the average CPU is above the target utilization, the autoscaler
        scales up until it reaches the maximum number of instances you
        specified or until the average utilization reaches the target
        utilization.
        """
        return self._values.get('target')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionAutoscalerAutoscalingPolicyCpuUtilization(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionAutoscalerAutoscalingPolicyLoadBalancingUtilization", jsii_struct_bases=[], name_mapping={'target': 'target'})
class ComputeRegionAutoscalerAutoscalingPolicyLoadBalancingUtilization():
    def __init__(self, *, target: jsii.Number) -> None:
        """
        :param target: Fraction of backend capacity utilization (set in HTTP(s) load balancing configuration) that autoscaler should maintain. Must be a positive float value. If not defined, the default is 0.8.
        """
        self._values = {
            'target': target,
        }

    @builtins.property
    def target(self) -> jsii.Number:
        """Fraction of backend capacity utilization (set in HTTP(s) load balancing configuration) that autoscaler should maintain.

        Must
        be a positive float value. If not defined, the default is 0.8.
        """
        return self._values.get('target')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionAutoscalerAutoscalingPolicyLoadBalancingUtilization(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionAutoscalerAutoscalingPolicyMetric", jsii_struct_bases=[], name_mapping={'name': 'name', 'target': 'target', 'type': 'type'})
class ComputeRegionAutoscalerAutoscalingPolicyMetric():
    def __init__(self, *, name: str, target: typing.Optional[jsii.Number]=None, type: typing.Optional[str]=None) -> None:
        """
        :param name: The identifier (type) of the Stackdriver Monitoring metric. The metric cannot have negative values. The metric must have a value type of INT64 or DOUBLE.
        :param target: The target value of the metric that autoscaler should maintain. This must be a positive value. A utilization metric scales number of virtual machines handling requests to increase or decrease proportionally to the metric. For example, a good metric to use as a utilizationTarget is www.googleapis.com/compute/instance/network/received_bytes_count. The autoscaler will work to keep this value constant for each of the instances.
        :param type: Defines how target utilization value is expressed for a Stackdriver Monitoring metric. Possible values: ["GAUGE", "DELTA_PER_SECOND", "DELTA_PER_MINUTE"]
        """
        self._values = {
            'name': name,
        }
        if target is not None: self._values["target"] = target
        if type is not None: self._values["type"] = type

    @builtins.property
    def name(self) -> str:
        """The identifier (type) of the Stackdriver Monitoring metric. The metric cannot have negative values.

        The metric must have a value type of INT64 or DOUBLE.
        """
        return self._values.get('name')

    @builtins.property
    def target(self) -> typing.Optional[jsii.Number]:
        """The target value of the metric that autoscaler should maintain.

        This must be a positive value. A utilization
        metric scales number of virtual machines handling requests
        to increase or decrease proportionally to the metric.

        For example, a good metric to use as a utilizationTarget is
        www.googleapis.com/compute/instance/network/received_bytes_count.
        The autoscaler will work to keep this value constant for each
        of the instances.
        """
        return self._values.get('target')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        """Defines how target utilization value is expressed for a Stackdriver Monitoring metric.

        Possible values: ["GAUGE", "DELTA_PER_SECOND", "DELTA_PER_MINUTE"]
        """
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionAutoscalerAutoscalingPolicyMetric(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionAutoscalerConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'autoscaling_policy': 'autoscalingPolicy', 'name': 'name', 'target': 'target', 'description': 'description', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class ComputeRegionAutoscalerConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, autoscaling_policy: typing.List["ComputeRegionAutoscalerAutoscalingPolicy"], name: str, target: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRegionAutoscalerTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param autoscaling_policy: autoscaling_policy block.
        :param name: Name of the resource. The name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param target: URL of the managed instance group that this autoscaler will scale.
        :param description: An optional description of this resource.
        :param project: 
        :param region: URL of the region where the instance group resides.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRegionAutoscalerTimeouts(**timeouts)
        self._values = {
            'autoscaling_policy': autoscaling_policy,
            'name': name,
            'target': target,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def autoscaling_policy(self) -> typing.List["ComputeRegionAutoscalerAutoscalingPolicy"]:
        """autoscaling_policy block."""
        return self._values.get('autoscaling_policy')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        The name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def target(self) -> str:
        """URL of the managed instance group that this autoscaler will scale."""
        return self._values.get('target')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """URL of the region where the instance group resides."""
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRegionAutoscalerTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionAutoscalerConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionAutoscalerTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeRegionAutoscalerTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionAutoscalerTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRegionBackendService(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRegionBackendService"):
    def __init__(self, scope: constructs.Construct, id: str, *, health_checks: typing.List[str], name: str, affinity_cookie_ttl_sec: typing.Optional[jsii.Number]=None, backend: typing.Optional[typing.List["ComputeRegionBackendServiceBackend"]]=None, circuit_breakers: typing.Optional[typing.List["ComputeRegionBackendServiceCircuitBreakers"]]=None, connection_draining_timeout_sec: typing.Optional[jsii.Number]=None, consistent_hash: typing.Optional[typing.List["ComputeRegionBackendServiceConsistentHash"]]=None, description: typing.Optional[str]=None, failover_policy: typing.Optional[typing.List["ComputeRegionBackendServiceFailoverPolicy"]]=None, load_balancing_scheme: typing.Optional[str]=None, locality_lb_policy: typing.Optional[str]=None, log_config: typing.Optional[typing.List["ComputeRegionBackendServiceLogConfig"]]=None, network: typing.Optional[str]=None, outlier_detection: typing.Optional[typing.List["ComputeRegionBackendServiceOutlierDetection"]]=None, port_name: typing.Optional[str]=None, project: typing.Optional[str]=None, protocol: typing.Optional[str]=None, region: typing.Optional[str]=None, session_affinity: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRegionBackendServiceTimeouts"]=None, timeout_sec: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param health_checks: The set of URLs to HealthCheck resources for health checking this RegionBackendService. Currently at most one health check can be specified, and a health check is required.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param affinity_cookie_ttl_sec: Lifetime of cookies in seconds if session_affinity is GENERATED_COOKIE. If set to 0, the cookie is non-persistent and lasts only until the end of the browser session (or equivalent). The maximum allowed value for TTL is one day. When the load balancing scheme is INTERNAL, this field is not used.
        :param backend: backend block.
        :param circuit_breakers: circuit_breakers block.
        :param connection_draining_timeout_sec: Time for which instance will be drained (not accept new connections, but still work to finish started).
        :param consistent_hash: consistent_hash block.
        :param description: An optional description of this resource.
        :param failover_policy: failover_policy block.
        :param load_balancing_scheme: Indicates what kind of load balancing this regional backend service will be used for. A backend service created for one type of load balancing cannot be used with the other(s). Default value: "INTERNAL" Possible values: ["INTERNAL", "INTERNAL_MANAGED"]
        :param locality_lb_policy: The load balancing algorithm used within the scope of the locality. The possible values are -. ROUND_ROBIN - This is a simple policy in which each healthy backend is selected in round robin order. LEAST_REQUEST - An O(1) algorithm which selects two random healthy hosts and picks the host which has fewer active requests. RING_HASH - The ring/modulo hash load balancer implements consistent hashing to backends. The algorithm has the property that the addition/removal of a host from a set of N hosts only affects 1/N of the requests. RANDOM - The load balancer selects a random healthy host. ORIGINAL_DESTINATION - Backend host is selected based on the client connection metadata, i.e., connections are opened to the same address as the destination address of the incoming connection before the connection was redirected to the load balancer. MAGLEV - used as a drop in replacement for the ring hash load balancer. Maglev is not as stable as ring hash but has faster table lookup build times and host selection times. For more information about Maglev, refer to https://ai.google/research/pubs/pub44824 This field is applicable only when the 'load_balancing_scheme' is set to INTERNAL_MANAGED and the 'protocol' is set to HTTP, HTTPS, or HTTP2. Possible values: ["ROUND_ROBIN", "LEAST_REQUEST", "RING_HASH", "RANDOM", "ORIGINAL_DESTINATION", "MAGLEV"]
        :param log_config: log_config block.
        :param network: The URL of the network to which this backend service belongs. This field can only be specified when the load balancing scheme is set to INTERNAL.
        :param outlier_detection: outlier_detection block.
        :param port_name: A named port on a backend instance group representing the port for communication to the backend VMs in that group. Required when the loadBalancingScheme is EXTERNAL, INTERNAL_MANAGED, or INTERNAL_SELF_MANAGED and the backends are instance groups. The named port must be defined on each backend instance group. This parameter has no meaning if the backends are NEGs. API sets a default of "http" if not given. Must be omitted when the loadBalancingScheme is INTERNAL (Internal TCP/UDP Load Balancing).
        :param project: 
        :param protocol: The protocol this RegionBackendService uses to communicate with backends. The default is HTTP. **NOTE**: HTTP2 is only valid for beta HTTP/2 load balancer types and may result in errors if used with the GA API. Possible values: ["HTTP", "HTTPS", "HTTP2", "SSL", "TCP", "UDP"]
        :param region: The Region in which the created backend service should reside. If it is not provided, the provider region is used.
        :param session_affinity: Type of session affinity to use. The default is NONE. Session affinity is not applicable if the protocol is UDP. Possible values: ["NONE", "CLIENT_IP", "CLIENT_IP_PORT_PROTO", "CLIENT_IP_PROTO", "GENERATED_COOKIE", "HEADER_FIELD", "HTTP_COOKIE"]
        :param timeouts: timeouts block.
        :param timeout_sec: How many seconds to wait for the backend before considering it a failed request. Default is 30 seconds. Valid range is [1, 86400].
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRegionBackendServiceConfig(health_checks=health_checks, name=name, affinity_cookie_ttl_sec=affinity_cookie_ttl_sec, backend=backend, circuit_breakers=circuit_breakers, connection_draining_timeout_sec=connection_draining_timeout_sec, consistent_hash=consistent_hash, description=description, failover_policy=failover_policy, load_balancing_scheme=load_balancing_scheme, locality_lb_policy=locality_lb_policy, log_config=log_config, network=network, outlier_detection=outlier_detection, port_name=port_name, project=project, protocol=protocol, region=region, session_affinity=session_affinity, timeouts=timeouts, timeout_sec=timeout_sec, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRegionBackendService, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="fingerprint")
    def fingerprint(self) -> str:
        return jsii.get(self, "fingerprint")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="healthChecks")
    def health_checks(self) -> typing.List[str]:
        return jsii.get(self, "healthChecks")

    @health_checks.setter
    def health_checks(self, value: typing.List[str]) -> None:
        jsii.set(self, "healthChecks", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="affinityCookieTtlSec")
    def affinity_cookie_ttl_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "affinityCookieTtlSec")

    @affinity_cookie_ttl_sec.setter
    def affinity_cookie_ttl_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "affinityCookieTtlSec", value)

    @builtins.property
    @jsii.member(jsii_name="backend")
    def backend(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceBackend"]]:
        return jsii.get(self, "backend")

    @backend.setter
    def backend(self, value: typing.Optional[typing.List["ComputeRegionBackendServiceBackend"]]) -> None:
        jsii.set(self, "backend", value)

    @builtins.property
    @jsii.member(jsii_name="circuitBreakers")
    def circuit_breakers(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceCircuitBreakers"]]:
        return jsii.get(self, "circuitBreakers")

    @circuit_breakers.setter
    def circuit_breakers(self, value: typing.Optional[typing.List["ComputeRegionBackendServiceCircuitBreakers"]]) -> None:
        jsii.set(self, "circuitBreakers", value)

    @builtins.property
    @jsii.member(jsii_name="connectionDrainingTimeoutSec")
    def connection_draining_timeout_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "connectionDrainingTimeoutSec")

    @connection_draining_timeout_sec.setter
    def connection_draining_timeout_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "connectionDrainingTimeoutSec", value)

    @builtins.property
    @jsii.member(jsii_name="consistentHash")
    def consistent_hash(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceConsistentHash"]]:
        return jsii.get(self, "consistentHash")

    @consistent_hash.setter
    def consistent_hash(self, value: typing.Optional[typing.List["ComputeRegionBackendServiceConsistentHash"]]) -> None:
        jsii.set(self, "consistentHash", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="failoverPolicy")
    def failover_policy(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceFailoverPolicy"]]:
        return jsii.get(self, "failoverPolicy")

    @failover_policy.setter
    def failover_policy(self, value: typing.Optional[typing.List["ComputeRegionBackendServiceFailoverPolicy"]]) -> None:
        jsii.set(self, "failoverPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="loadBalancingScheme")
    def load_balancing_scheme(self) -> typing.Optional[str]:
        return jsii.get(self, "loadBalancingScheme")

    @load_balancing_scheme.setter
    def load_balancing_scheme(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "loadBalancingScheme", value)

    @builtins.property
    @jsii.member(jsii_name="localityLbPolicy")
    def locality_lb_policy(self) -> typing.Optional[str]:
        return jsii.get(self, "localityLbPolicy")

    @locality_lb_policy.setter
    def locality_lb_policy(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "localityLbPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="logConfig")
    def log_config(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceLogConfig"]]:
        return jsii.get(self, "logConfig")

    @log_config.setter
    def log_config(self, value: typing.Optional[typing.List["ComputeRegionBackendServiceLogConfig"]]) -> None:
        jsii.set(self, "logConfig", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> typing.Optional[str]:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="outlierDetection")
    def outlier_detection(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceOutlierDetection"]]:
        return jsii.get(self, "outlierDetection")

    @outlier_detection.setter
    def outlier_detection(self, value: typing.Optional[typing.List["ComputeRegionBackendServiceOutlierDetection"]]) -> None:
        jsii.set(self, "outlierDetection", value)

    @builtins.property
    @jsii.member(jsii_name="portName")
    def port_name(self) -> typing.Optional[str]:
        return jsii.get(self, "portName")

    @port_name.setter
    def port_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "portName", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> typing.Optional[str]:
        return jsii.get(self, "protocol")

    @protocol.setter
    def protocol(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "protocol", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="sessionAffinity")
    def session_affinity(self) -> typing.Optional[str]:
        return jsii.get(self, "sessionAffinity")

    @session_affinity.setter
    def session_affinity(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sessionAffinity", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRegionBackendServiceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRegionBackendServiceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="timeoutSec")
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "timeoutSec")

    @timeout_sec.setter
    def timeout_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "timeoutSec", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionBackendServiceBackend", jsii_struct_bases=[], name_mapping={'group': 'group', 'balancing_mode': 'balancingMode', 'capacity_scaler': 'capacityScaler', 'description': 'description', 'failover': 'failover', 'max_connections': 'maxConnections', 'max_connections_per_endpoint': 'maxConnectionsPerEndpoint', 'max_connections_per_instance': 'maxConnectionsPerInstance', 'max_rate': 'maxRate', 'max_rate_per_endpoint': 'maxRatePerEndpoint', 'max_rate_per_instance': 'maxRatePerInstance', 'max_utilization': 'maxUtilization'})
class ComputeRegionBackendServiceBackend():
    def __init__(self, *, group: str, balancing_mode: typing.Optional[str]=None, capacity_scaler: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, failover: typing.Optional[bool]=None, max_connections: typing.Optional[jsii.Number]=None, max_connections_per_endpoint: typing.Optional[jsii.Number]=None, max_connections_per_instance: typing.Optional[jsii.Number]=None, max_rate: typing.Optional[jsii.Number]=None, max_rate_per_endpoint: typing.Optional[jsii.Number]=None, max_rate_per_instance: typing.Optional[jsii.Number]=None, max_utilization: typing.Optional[jsii.Number]=None) -> None:
        """
        :param group: The fully-qualified URL of an Instance Group or Network Endpoint Group resource. In case of instance group this defines the list of instances that serve traffic. Member virtual machine instances from each instance group must live in the same zone as the instance group itself. No two backends in a backend service are allowed to use same Instance Group resource. For Network Endpoint Groups this defines list of endpoints. All endpoints of Network Endpoint Group must be hosted on instances located in the same zone as the Network Endpoint Group. Backend services cannot mix Instance Group and Network Endpoint Group backends. When the 'load_balancing_scheme' is INTERNAL, only instance groups are supported. Note that you must specify an Instance Group or Network Endpoint Group resource using the fully-qualified URL, rather than a partial URL.
        :param balancing_mode: Specifies the balancing mode for this backend. Default value: "CONNECTION" Possible values: ["UTILIZATION", "RATE", "CONNECTION"]
        :param capacity_scaler: A multiplier applied to the group's maximum servicing capacity (based on UTILIZATION, RATE or CONNECTION). ~>**NOTE**: This field cannot be set for INTERNAL region backend services (default loadBalancingScheme), but is required for non-INTERNAL backend service. The total capacity_scaler for all backends must be non-zero. A setting of 0 means the group is completely drained, offering 0% of its available Capacity. Valid range is [0.0,1.0].
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param failover: This field designates whether this is a failover backend. More than one failover backend can be configured for a given RegionBackendService.
        :param max_connections: The max number of simultaneous connections for the group. Can be used with either CONNECTION or UTILIZATION balancing modes. Cannot be set for INTERNAL backend services. For CONNECTION mode, either maxConnections or one of maxConnectionsPerInstance or maxConnectionsPerEndpoint, as appropriate for group type, must be set.
        :param max_connections_per_endpoint: The max number of simultaneous connections that a single backend network endpoint can handle. Cannot be set for INTERNAL backend services. This is used to calculate the capacity of the group. Can be used in either CONNECTION or UTILIZATION balancing modes. For CONNECTION mode, either maxConnections or maxConnectionsPerEndpoint must be set.
        :param max_connections_per_instance: The max number of simultaneous connections that a single backend instance can handle. Cannot be set for INTERNAL backend services. This is used to calculate the capacity of the group. Can be used in either CONNECTION or UTILIZATION balancing modes. For CONNECTION mode, either maxConnections or maxConnectionsPerInstance must be set.
        :param max_rate: The max requests per second (RPS) of the group. Cannot be set for INTERNAL backend services. Can be used with either RATE or UTILIZATION balancing modes, but required if RATE mode. Either maxRate or one of maxRatePerInstance or maxRatePerEndpoint, as appropriate for group type, must be set.
        :param max_rate_per_endpoint: The max requests per second (RPS) that a single backend network endpoint can handle. This is used to calculate the capacity of the group. Can be used in either balancing mode. For RATE mode, either maxRate or maxRatePerEndpoint must be set. Cannot be set for INTERNAL backend services.
        :param max_rate_per_instance: The max requests per second (RPS) that a single backend instance can handle. This is used to calculate the capacity of the group. Can be used in either balancing mode. For RATE mode, either maxRate or maxRatePerInstance must be set. Cannot be set for INTERNAL backend services.
        :param max_utilization: Used when balancingMode is UTILIZATION. This ratio defines the CPU utilization target for the group. Valid range is [0.0, 1.0]. Cannot be set for INTERNAL backend services.
        """
        self._values = {
            'group': group,
        }
        if balancing_mode is not None: self._values["balancing_mode"] = balancing_mode
        if capacity_scaler is not None: self._values["capacity_scaler"] = capacity_scaler
        if description is not None: self._values["description"] = description
        if failover is not None: self._values["failover"] = failover
        if max_connections is not None: self._values["max_connections"] = max_connections
        if max_connections_per_endpoint is not None: self._values["max_connections_per_endpoint"] = max_connections_per_endpoint
        if max_connections_per_instance is not None: self._values["max_connections_per_instance"] = max_connections_per_instance
        if max_rate is not None: self._values["max_rate"] = max_rate
        if max_rate_per_endpoint is not None: self._values["max_rate_per_endpoint"] = max_rate_per_endpoint
        if max_rate_per_instance is not None: self._values["max_rate_per_instance"] = max_rate_per_instance
        if max_utilization is not None: self._values["max_utilization"] = max_utilization

    @builtins.property
    def group(self) -> str:
        """The fully-qualified URL of an Instance Group or Network Endpoint Group resource.

        In case of instance group this defines the list
        of instances that serve traffic. Member virtual machine
        instances from each instance group must live in the same zone as
        the instance group itself. No two backends in a backend service
        are allowed to use same Instance Group resource.

        For Network Endpoint Groups this defines list of endpoints. All
        endpoints of Network Endpoint Group must be hosted on instances
        located in the same zone as the Network Endpoint Group.

        Backend services cannot mix Instance Group and
        Network Endpoint Group backends.

        When the 'load_balancing_scheme' is INTERNAL, only instance groups
        are supported.

        Note that you must specify an Instance Group or Network Endpoint
        Group resource using the fully-qualified URL, rather than a
        partial URL.
        """
        return self._values.get('group')

    @builtins.property
    def balancing_mode(self) -> typing.Optional[str]:
        """Specifies the balancing mode for this backend.

        Default value: "CONNECTION" Possible values: ["UTILIZATION", "RATE", "CONNECTION"]
        """
        return self._values.get('balancing_mode')

    @builtins.property
    def capacity_scaler(self) -> typing.Optional[jsii.Number]:
        """A multiplier applied to the group's maximum servicing capacity (based on UTILIZATION, RATE or CONNECTION).

        ~>**NOTE**: This field cannot be set for
        INTERNAL region backend services (default loadBalancingScheme),
        but is required for non-INTERNAL backend service. The total
        capacity_scaler for all backends must be non-zero.

        A setting of 0 means the group is completely drained, offering
        0% of its available Capacity. Valid range is [0.0,1.0].
        """
        return self._values.get('capacity_scaler')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def failover(self) -> typing.Optional[bool]:
        """This field designates whether this is a failover backend.

        More
        than one failover backend can be configured for a given RegionBackendService.
        """
        return self._values.get('failover')

    @builtins.property
    def max_connections(self) -> typing.Optional[jsii.Number]:
        """The max number of simultaneous connections for the group.

        Can
        be used with either CONNECTION or UTILIZATION balancing modes.
        Cannot be set for INTERNAL backend services.

        For CONNECTION mode, either maxConnections or one
        of maxConnectionsPerInstance or maxConnectionsPerEndpoint,
        as appropriate for group type, must be set.
        """
        return self._values.get('max_connections')

    @builtins.property
    def max_connections_per_endpoint(self) -> typing.Optional[jsii.Number]:
        """The max number of simultaneous connections that a single backend network endpoint can handle. Cannot be set for INTERNAL backend services.

        This is used to calculate the capacity of the group. Can be
        used in either CONNECTION or UTILIZATION balancing modes. For
        CONNECTION mode, either maxConnections or
        maxConnectionsPerEndpoint must be set.
        """
        return self._values.get('max_connections_per_endpoint')

    @builtins.property
    def max_connections_per_instance(self) -> typing.Optional[jsii.Number]:
        """The max number of simultaneous connections that a single backend instance can handle. Cannot be set for INTERNAL backend services.

        This is used to calculate the capacity of the group.
        Can be used in either CONNECTION or UTILIZATION balancing modes.
        For CONNECTION mode, either maxConnections or
        maxConnectionsPerInstance must be set.
        """
        return self._values.get('max_connections_per_instance')

    @builtins.property
    def max_rate(self) -> typing.Optional[jsii.Number]:
        """The max requests per second (RPS) of the group. Cannot be set for INTERNAL backend services.

        Can be used with either RATE or UTILIZATION balancing modes,
        but required if RATE mode. Either maxRate or one
        of maxRatePerInstance or maxRatePerEndpoint, as appropriate for
        group type, must be set.
        """
        return self._values.get('max_rate')

    @builtins.property
    def max_rate_per_endpoint(self) -> typing.Optional[jsii.Number]:
        """The max requests per second (RPS) that a single backend network endpoint can handle.

        This is used to calculate the capacity of
        the group. Can be used in either balancing mode. For RATE mode,
        either maxRate or maxRatePerEndpoint must be set. Cannot be set
        for INTERNAL backend services.
        """
        return self._values.get('max_rate_per_endpoint')

    @builtins.property
    def max_rate_per_instance(self) -> typing.Optional[jsii.Number]:
        """The max requests per second (RPS) that a single backend instance can handle.

        This is used to calculate the capacity of
        the group. Can be used in either balancing mode. For RATE mode,
        either maxRate or maxRatePerInstance must be set. Cannot be set
        for INTERNAL backend services.
        """
        return self._values.get('max_rate_per_instance')

    @builtins.property
    def max_utilization(self) -> typing.Optional[jsii.Number]:
        """Used when balancingMode is UTILIZATION.

        This ratio defines the
        CPU utilization target for the group. Valid range is [0.0, 1.0].
        Cannot be set for INTERNAL backend services.
        """
        return self._values.get('max_utilization')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionBackendServiceBackend(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionBackendServiceCircuitBreakers", jsii_struct_bases=[], name_mapping={'max_connections': 'maxConnections', 'max_pending_requests': 'maxPendingRequests', 'max_requests': 'maxRequests', 'max_requests_per_connection': 'maxRequestsPerConnection', 'max_retries': 'maxRetries'})
class ComputeRegionBackendServiceCircuitBreakers():
    def __init__(self, *, max_connections: typing.Optional[jsii.Number]=None, max_pending_requests: typing.Optional[jsii.Number]=None, max_requests: typing.Optional[jsii.Number]=None, max_requests_per_connection: typing.Optional[jsii.Number]=None, max_retries: typing.Optional[jsii.Number]=None) -> None:
        """
        :param max_connections: The maximum number of connections to the backend cluster. Defaults to 1024.
        :param max_pending_requests: The maximum number of pending requests to the backend cluster. Defaults to 1024.
        :param max_requests: The maximum number of parallel requests to the backend cluster. Defaults to 1024.
        :param max_requests_per_connection: Maximum requests for a single backend connection. This parameter is respected by both the HTTP/1.1 and HTTP/2 implementations. If not specified, there is no limit. Setting this parameter to 1 will effectively disable keep alive.
        :param max_retries: The maximum number of parallel retries to the backend cluster. Defaults to 3.
        """
        self._values = {
        }
        if max_connections is not None: self._values["max_connections"] = max_connections
        if max_pending_requests is not None: self._values["max_pending_requests"] = max_pending_requests
        if max_requests is not None: self._values["max_requests"] = max_requests
        if max_requests_per_connection is not None: self._values["max_requests_per_connection"] = max_requests_per_connection
        if max_retries is not None: self._values["max_retries"] = max_retries

    @builtins.property
    def max_connections(self) -> typing.Optional[jsii.Number]:
        """The maximum number of connections to the backend cluster.

        Defaults to 1024.
        """
        return self._values.get('max_connections')

    @builtins.property
    def max_pending_requests(self) -> typing.Optional[jsii.Number]:
        """The maximum number of pending requests to the backend cluster.

        Defaults to 1024.
        """
        return self._values.get('max_pending_requests')

    @builtins.property
    def max_requests(self) -> typing.Optional[jsii.Number]:
        """The maximum number of parallel requests to the backend cluster.

        Defaults to 1024.
        """
        return self._values.get('max_requests')

    @builtins.property
    def max_requests_per_connection(self) -> typing.Optional[jsii.Number]:
        """Maximum requests for a single backend connection.

        This parameter
        is respected by both the HTTP/1.1 and HTTP/2 implementations. If
        not specified, there is no limit. Setting this parameter to 1
        will effectively disable keep alive.
        """
        return self._values.get('max_requests_per_connection')

    @builtins.property
    def max_retries(self) -> typing.Optional[jsii.Number]:
        """The maximum number of parallel retries to the backend cluster.

        Defaults to 3.
        """
        return self._values.get('max_retries')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionBackendServiceCircuitBreakers(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionBackendServiceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'health_checks': 'healthChecks', 'name': 'name', 'affinity_cookie_ttl_sec': 'affinityCookieTtlSec', 'backend': 'backend', 'circuit_breakers': 'circuitBreakers', 'connection_draining_timeout_sec': 'connectionDrainingTimeoutSec', 'consistent_hash': 'consistentHash', 'description': 'description', 'failover_policy': 'failoverPolicy', 'load_balancing_scheme': 'loadBalancingScheme', 'locality_lb_policy': 'localityLbPolicy', 'log_config': 'logConfig', 'network': 'network', 'outlier_detection': 'outlierDetection', 'port_name': 'portName', 'project': 'project', 'protocol': 'protocol', 'region': 'region', 'session_affinity': 'sessionAffinity', 'timeouts': 'timeouts', 'timeout_sec': 'timeoutSec'})
class ComputeRegionBackendServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, health_checks: typing.List[str], name: str, affinity_cookie_ttl_sec: typing.Optional[jsii.Number]=None, backend: typing.Optional[typing.List["ComputeRegionBackendServiceBackend"]]=None, circuit_breakers: typing.Optional[typing.List["ComputeRegionBackendServiceCircuitBreakers"]]=None, connection_draining_timeout_sec: typing.Optional[jsii.Number]=None, consistent_hash: typing.Optional[typing.List["ComputeRegionBackendServiceConsistentHash"]]=None, description: typing.Optional[str]=None, failover_policy: typing.Optional[typing.List["ComputeRegionBackendServiceFailoverPolicy"]]=None, load_balancing_scheme: typing.Optional[str]=None, locality_lb_policy: typing.Optional[str]=None, log_config: typing.Optional[typing.List["ComputeRegionBackendServiceLogConfig"]]=None, network: typing.Optional[str]=None, outlier_detection: typing.Optional[typing.List["ComputeRegionBackendServiceOutlierDetection"]]=None, port_name: typing.Optional[str]=None, project: typing.Optional[str]=None, protocol: typing.Optional[str]=None, region: typing.Optional[str]=None, session_affinity: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRegionBackendServiceTimeouts"]=None, timeout_sec: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param health_checks: The set of URLs to HealthCheck resources for health checking this RegionBackendService. Currently at most one health check can be specified, and a health check is required.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param affinity_cookie_ttl_sec: Lifetime of cookies in seconds if session_affinity is GENERATED_COOKIE. If set to 0, the cookie is non-persistent and lasts only until the end of the browser session (or equivalent). The maximum allowed value for TTL is one day. When the load balancing scheme is INTERNAL, this field is not used.
        :param backend: backend block.
        :param circuit_breakers: circuit_breakers block.
        :param connection_draining_timeout_sec: Time for which instance will be drained (not accept new connections, but still work to finish started).
        :param consistent_hash: consistent_hash block.
        :param description: An optional description of this resource.
        :param failover_policy: failover_policy block.
        :param load_balancing_scheme: Indicates what kind of load balancing this regional backend service will be used for. A backend service created for one type of load balancing cannot be used with the other(s). Default value: "INTERNAL" Possible values: ["INTERNAL", "INTERNAL_MANAGED"]
        :param locality_lb_policy: The load balancing algorithm used within the scope of the locality. The possible values are -. ROUND_ROBIN - This is a simple policy in which each healthy backend is selected in round robin order. LEAST_REQUEST - An O(1) algorithm which selects two random healthy hosts and picks the host which has fewer active requests. RING_HASH - The ring/modulo hash load balancer implements consistent hashing to backends. The algorithm has the property that the addition/removal of a host from a set of N hosts only affects 1/N of the requests. RANDOM - The load balancer selects a random healthy host. ORIGINAL_DESTINATION - Backend host is selected based on the client connection metadata, i.e., connections are opened to the same address as the destination address of the incoming connection before the connection was redirected to the load balancer. MAGLEV - used as a drop in replacement for the ring hash load balancer. Maglev is not as stable as ring hash but has faster table lookup build times and host selection times. For more information about Maglev, refer to https://ai.google/research/pubs/pub44824 This field is applicable only when the 'load_balancing_scheme' is set to INTERNAL_MANAGED and the 'protocol' is set to HTTP, HTTPS, or HTTP2. Possible values: ["ROUND_ROBIN", "LEAST_REQUEST", "RING_HASH", "RANDOM", "ORIGINAL_DESTINATION", "MAGLEV"]
        :param log_config: log_config block.
        :param network: The URL of the network to which this backend service belongs. This field can only be specified when the load balancing scheme is set to INTERNAL.
        :param outlier_detection: outlier_detection block.
        :param port_name: A named port on a backend instance group representing the port for communication to the backend VMs in that group. Required when the loadBalancingScheme is EXTERNAL, INTERNAL_MANAGED, or INTERNAL_SELF_MANAGED and the backends are instance groups. The named port must be defined on each backend instance group. This parameter has no meaning if the backends are NEGs. API sets a default of "http" if not given. Must be omitted when the loadBalancingScheme is INTERNAL (Internal TCP/UDP Load Balancing).
        :param project: 
        :param protocol: The protocol this RegionBackendService uses to communicate with backends. The default is HTTP. **NOTE**: HTTP2 is only valid for beta HTTP/2 load balancer types and may result in errors if used with the GA API. Possible values: ["HTTP", "HTTPS", "HTTP2", "SSL", "TCP", "UDP"]
        :param region: The Region in which the created backend service should reside. If it is not provided, the provider region is used.
        :param session_affinity: Type of session affinity to use. The default is NONE. Session affinity is not applicable if the protocol is UDP. Possible values: ["NONE", "CLIENT_IP", "CLIENT_IP_PORT_PROTO", "CLIENT_IP_PROTO", "GENERATED_COOKIE", "HEADER_FIELD", "HTTP_COOKIE"]
        :param timeouts: timeouts block.
        :param timeout_sec: How many seconds to wait for the backend before considering it a failed request. Default is 30 seconds. Valid range is [1, 86400].
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRegionBackendServiceTimeouts(**timeouts)
        self._values = {
            'health_checks': health_checks,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if affinity_cookie_ttl_sec is not None: self._values["affinity_cookie_ttl_sec"] = affinity_cookie_ttl_sec
        if backend is not None: self._values["backend"] = backend
        if circuit_breakers is not None: self._values["circuit_breakers"] = circuit_breakers
        if connection_draining_timeout_sec is not None: self._values["connection_draining_timeout_sec"] = connection_draining_timeout_sec
        if consistent_hash is not None: self._values["consistent_hash"] = consistent_hash
        if description is not None: self._values["description"] = description
        if failover_policy is not None: self._values["failover_policy"] = failover_policy
        if load_balancing_scheme is not None: self._values["load_balancing_scheme"] = load_balancing_scheme
        if locality_lb_policy is not None: self._values["locality_lb_policy"] = locality_lb_policy
        if log_config is not None: self._values["log_config"] = log_config
        if network is not None: self._values["network"] = network
        if outlier_detection is not None: self._values["outlier_detection"] = outlier_detection
        if port_name is not None: self._values["port_name"] = port_name
        if project is not None: self._values["project"] = project
        if protocol is not None: self._values["protocol"] = protocol
        if region is not None: self._values["region"] = region
        if session_affinity is not None: self._values["session_affinity"] = session_affinity
        if timeouts is not None: self._values["timeouts"] = timeouts
        if timeout_sec is not None: self._values["timeout_sec"] = timeout_sec

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def health_checks(self) -> typing.List[str]:
        """The set of URLs to HealthCheck resources for health checking this RegionBackendService.

        Currently at most one health
        check can be specified, and a health check is required.
        """
        return self._values.get('health_checks')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def affinity_cookie_ttl_sec(self) -> typing.Optional[jsii.Number]:
        """Lifetime of cookies in seconds if session_affinity is GENERATED_COOKIE.

        If set to 0, the cookie is non-persistent and lasts
        only until the end of the browser session (or equivalent). The
        maximum allowed value for TTL is one day.

        When the load balancing scheme is INTERNAL, this field is not used.
        """
        return self._values.get('affinity_cookie_ttl_sec')

    @builtins.property
    def backend(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceBackend"]]:
        """backend block."""
        return self._values.get('backend')

    @builtins.property
    def circuit_breakers(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceCircuitBreakers"]]:
        """circuit_breakers block."""
        return self._values.get('circuit_breakers')

    @builtins.property
    def connection_draining_timeout_sec(self) -> typing.Optional[jsii.Number]:
        """Time for which instance will be drained (not accept new connections, but still work to finish started)."""
        return self._values.get('connection_draining_timeout_sec')

    @builtins.property
    def consistent_hash(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceConsistentHash"]]:
        """consistent_hash block."""
        return self._values.get('consistent_hash')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def failover_policy(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceFailoverPolicy"]]:
        """failover_policy block."""
        return self._values.get('failover_policy')

    @builtins.property
    def load_balancing_scheme(self) -> typing.Optional[str]:
        """Indicates what kind of load balancing this regional backend service will be used for.

        A backend service created for one type of load
        balancing cannot be used with the other(s). Default value: "INTERNAL" Possible values: ["INTERNAL", "INTERNAL_MANAGED"]
        """
        return self._values.get('load_balancing_scheme')

    @builtins.property
    def locality_lb_policy(self) -> typing.Optional[str]:
        """The load balancing algorithm used within the scope of the locality. The possible values are -.

        ROUND_ROBIN - This is a simple policy in which each healthy backend
        is selected in round robin order.

        LEAST_REQUEST - An O(1) algorithm which selects two random healthy
        hosts and picks the host which has fewer active requests.

        RING_HASH - The ring/modulo hash load balancer implements consistent
        hashing to backends. The algorithm has the property that the
        addition/removal of a host from a set of N hosts only affects
        1/N of the requests.

        RANDOM - The load balancer selects a random healthy host.

        ORIGINAL_DESTINATION - Backend host is selected based on the client
        connection metadata, i.e., connections are opened
        to the same address as the destination address of
        the incoming connection before the connection
        was redirected to the load balancer.

        MAGLEV - used as a drop in replacement for the ring hash load balancer.
        Maglev is not as stable as ring hash but has faster table lookup
        build times and host selection times. For more information about
        Maglev, refer to https://ai.google/research/pubs/pub44824

        This field is applicable only when the 'load_balancing_scheme' is set to
        INTERNAL_MANAGED and the 'protocol' is set to HTTP, HTTPS, or HTTP2. Possible values: ["ROUND_ROBIN", "LEAST_REQUEST", "RING_HASH", "RANDOM", "ORIGINAL_DESTINATION", "MAGLEV"]
        """
        return self._values.get('locality_lb_policy')

    @builtins.property
    def log_config(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceLogConfig"]]:
        """log_config block."""
        return self._values.get('log_config')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """The URL of the network to which this backend service belongs.

        This field can only be specified when the load balancing scheme is set to INTERNAL.
        """
        return self._values.get('network')

    @builtins.property
    def outlier_detection(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceOutlierDetection"]]:
        """outlier_detection block."""
        return self._values.get('outlier_detection')

    @builtins.property
    def port_name(self) -> typing.Optional[str]:
        """A named port on a backend instance group representing the port for communication to the backend VMs in that group.

        Required when the
        loadBalancingScheme is EXTERNAL, INTERNAL_MANAGED, or INTERNAL_SELF_MANAGED
        and the backends are instance groups. The named port must be defined on each
        backend instance group. This parameter has no meaning if the backends are NEGs. API sets a
        default of "http" if not given.
        Must be omitted when the loadBalancingScheme is INTERNAL (Internal TCP/UDP Load Balancing).
        """
        return self._values.get('port_name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def protocol(self) -> typing.Optional[str]:
        """The protocol this RegionBackendService uses to communicate with backends.

        The default is HTTP. **NOTE**: HTTP2 is only valid for beta HTTP/2 load balancer
        types and may result in errors if used with the GA API. Possible values: ["HTTP", "HTTPS", "HTTP2", "SSL", "TCP", "UDP"]
        """
        return self._values.get('protocol')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The Region in which the created backend service should reside.

        If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    @builtins.property
    def session_affinity(self) -> typing.Optional[str]:
        """Type of session affinity to use.

        The default is NONE. Session affinity is
        not applicable if the protocol is UDP. Possible values: ["NONE", "CLIENT_IP", "CLIENT_IP_PORT_PROTO", "CLIENT_IP_PROTO", "GENERATED_COOKIE", "HEADER_FIELD", "HTTP_COOKIE"]
        """
        return self._values.get('session_affinity')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRegionBackendServiceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        """How many seconds to wait for the backend before considering it a failed request.

        Default is 30 seconds. Valid range is [1, 86400].
        """
        return self._values.get('timeout_sec')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionBackendServiceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionBackendServiceConsistentHash", jsii_struct_bases=[], name_mapping={'http_cookie': 'httpCookie', 'http_header_name': 'httpHeaderName', 'minimum_ring_size': 'minimumRingSize'})
class ComputeRegionBackendServiceConsistentHash():
    def __init__(self, *, http_cookie: typing.Optional[typing.List["ComputeRegionBackendServiceConsistentHashHttpCookie"]]=None, http_header_name: typing.Optional[str]=None, minimum_ring_size: typing.Optional[jsii.Number]=None) -> None:
        """
        :param http_cookie: http_cookie block.
        :param http_header_name: The hash based on the value of the specified header field. This field is applicable if the sessionAffinity is set to HEADER_FIELD.
        :param minimum_ring_size: The minimum number of virtual nodes to use for the hash ring. Larger ring sizes result in more granular load distributions. If the number of hosts in the load balancing pool is larger than the ring size, each host will be assigned a single virtual node. Defaults to 1024.
        """
        self._values = {
        }
        if http_cookie is not None: self._values["http_cookie"] = http_cookie
        if http_header_name is not None: self._values["http_header_name"] = http_header_name
        if minimum_ring_size is not None: self._values["minimum_ring_size"] = minimum_ring_size

    @builtins.property
    def http_cookie(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceConsistentHashHttpCookie"]]:
        """http_cookie block."""
        return self._values.get('http_cookie')

    @builtins.property
    def http_header_name(self) -> typing.Optional[str]:
        """The hash based on the value of the specified header field.

        This field is applicable if the sessionAffinity is set to HEADER_FIELD.
        """
        return self._values.get('http_header_name')

    @builtins.property
    def minimum_ring_size(self) -> typing.Optional[jsii.Number]:
        """The minimum number of virtual nodes to use for the hash ring.

        Larger ring sizes result in more granular load
        distributions. If the number of hosts in the load balancing pool
        is larger than the ring size, each host will be assigned a single
        virtual node.
        Defaults to 1024.
        """
        return self._values.get('minimum_ring_size')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionBackendServiceConsistentHash(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionBackendServiceConsistentHashHttpCookie", jsii_struct_bases=[], name_mapping={'name': 'name', 'path': 'path', 'ttl': 'ttl'})
class ComputeRegionBackendServiceConsistentHashHttpCookie():
    def __init__(self, *, name: typing.Optional[str]=None, path: typing.Optional[str]=None, ttl: typing.Optional[typing.List["ComputeRegionBackendServiceConsistentHashHttpCookieTtl"]]=None) -> None:
        """
        :param name: Name of the cookie.
        :param path: Path to set for the cookie.
        :param ttl: ttl block.
        """
        self._values = {
        }
        if name is not None: self._values["name"] = name
        if path is not None: self._values["path"] = path
        if ttl is not None: self._values["ttl"] = ttl

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Name of the cookie."""
        return self._values.get('name')

    @builtins.property
    def path(self) -> typing.Optional[str]:
        """Path to set for the cookie."""
        return self._values.get('path')

    @builtins.property
    def ttl(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceConsistentHashHttpCookieTtl"]]:
        """ttl block."""
        return self._values.get('ttl')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionBackendServiceConsistentHashHttpCookie(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionBackendServiceConsistentHashHttpCookieTtl", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeRegionBackendServiceConsistentHashHttpCookieTtl():
    def __init__(self, *, seconds: jsii.Number, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> jsii.Number:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000 inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations less than one second are represented
        with a 0 seconds field and a positive nanos field. Must
        be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionBackendServiceConsistentHashHttpCookieTtl(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionBackendServiceFailoverPolicy", jsii_struct_bases=[], name_mapping={'disable_connection_drain_on_failover': 'disableConnectionDrainOnFailover', 'drop_traffic_if_unhealthy': 'dropTrafficIfUnhealthy', 'failover_ratio': 'failoverRatio'})
class ComputeRegionBackendServiceFailoverPolicy():
    def __init__(self, *, disable_connection_drain_on_failover: typing.Optional[bool]=None, drop_traffic_if_unhealthy: typing.Optional[bool]=None, failover_ratio: typing.Optional[jsii.Number]=None) -> None:
        """
        :param disable_connection_drain_on_failover: On failover or failback, this field indicates whether connection drain will be honored. Setting this to true has the following effect: connections to the old active pool are not drained. Connections to the new active pool use the timeout of 10 min (currently fixed). Setting to false has the following effect: both old and new connections will have a drain timeout of 10 min. This can be set to true only if the protocol is TCP. The default is false.
        :param drop_traffic_if_unhealthy: This option is used only when no healthy VMs are detected in the primary and backup instance groups. When set to true, traffic is dropped. When set to false, new connections are sent across all VMs in the primary group. The default is false.
        :param failover_ratio: The value of the field must be in [0, 1]. If the ratio of the healthy VMs in the primary backend is at or below this number, traffic arriving at the load-balanced IP will be directed to the failover backend. In case where 'failoverRatio' is not set or all the VMs in the backup backend are unhealthy, the traffic will be directed back to the primary backend in the "force" mode, where traffic will be spread to the healthy VMs with the best effort, or to all VMs when no VM is healthy. This field is only used with l4 load balancing.
        """
        self._values = {
        }
        if disable_connection_drain_on_failover is not None: self._values["disable_connection_drain_on_failover"] = disable_connection_drain_on_failover
        if drop_traffic_if_unhealthy is not None: self._values["drop_traffic_if_unhealthy"] = drop_traffic_if_unhealthy
        if failover_ratio is not None: self._values["failover_ratio"] = failover_ratio

    @builtins.property
    def disable_connection_drain_on_failover(self) -> typing.Optional[bool]:
        """On failover or failback, this field indicates whether connection drain will be honored.

        Setting this to true has the following effect: connections
        to the old active pool are not drained. Connections to the new active pool
        use the timeout of 10 min (currently fixed). Setting to false has the
        following effect: both old and new connections will have a drain timeout
        of 10 min.
        This can be set to true only if the protocol is TCP.
        The default is false.
        """
        return self._values.get('disable_connection_drain_on_failover')

    @builtins.property
    def drop_traffic_if_unhealthy(self) -> typing.Optional[bool]:
        """This option is used only when no healthy VMs are detected in the primary and backup instance groups.

        When set to true, traffic is dropped. When
        set to false, new connections are sent across all VMs in the primary group.
        The default is false.
        """
        return self._values.get('drop_traffic_if_unhealthy')

    @builtins.property
    def failover_ratio(self) -> typing.Optional[jsii.Number]:
        """The value of the field must be in [0, 1].

        If the ratio of the healthy
        VMs in the primary backend is at or below this number, traffic arriving
        at the load-balanced IP will be directed to the failover backend.
        In case where 'failoverRatio' is not set or all the VMs in the backup
        backend are unhealthy, the traffic will be directed back to the primary
        backend in the "force" mode, where traffic will be spread to the healthy
        VMs with the best effort, or to all VMs when no VM is healthy.
        This field is only used with l4 load balancing.
        """
        return self._values.get('failover_ratio')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionBackendServiceFailoverPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionBackendServiceLogConfig", jsii_struct_bases=[], name_mapping={'enable': 'enable', 'sample_rate': 'sampleRate'})
class ComputeRegionBackendServiceLogConfig():
    def __init__(self, *, enable: typing.Optional[bool]=None, sample_rate: typing.Optional[jsii.Number]=None) -> None:
        """
        :param enable: Whether to enable logging for the load balancer traffic served by this backend service.
        :param sample_rate: This field can only be specified if logging is enabled for this backend service. The value of the field must be in [0, 1]. This configures the sampling rate of requests to the load balancer where 1.0 means all logged requests are reported and 0.0 means no logged requests are reported. The default value is 1.0.
        """
        self._values = {
        }
        if enable is not None: self._values["enable"] = enable
        if sample_rate is not None: self._values["sample_rate"] = sample_rate

    @builtins.property
    def enable(self) -> typing.Optional[bool]:
        """Whether to enable logging for the load balancer traffic served by this backend service."""
        return self._values.get('enable')

    @builtins.property
    def sample_rate(self) -> typing.Optional[jsii.Number]:
        """This field can only be specified if logging is enabled for this backend service.

        The value of
        the field must be in [0, 1]. This configures the sampling rate of requests to the load balancer
        where 1.0 means all logged requests are reported and 0.0 means no logged requests are reported.
        The default value is 1.0.
        """
        return self._values.get('sample_rate')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionBackendServiceLogConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionBackendServiceOutlierDetection", jsii_struct_bases=[], name_mapping={'base_ejection_time': 'baseEjectionTime', 'consecutive_errors': 'consecutiveErrors', 'consecutive_gateway_failure': 'consecutiveGatewayFailure', 'enforcing_consecutive_errors': 'enforcingConsecutiveErrors', 'enforcing_consecutive_gateway_failure': 'enforcingConsecutiveGatewayFailure', 'enforcing_success_rate': 'enforcingSuccessRate', 'interval': 'interval', 'max_ejection_percent': 'maxEjectionPercent', 'success_rate_minimum_hosts': 'successRateMinimumHosts', 'success_rate_request_volume': 'successRateRequestVolume', 'success_rate_stdev_factor': 'successRateStdevFactor'})
class ComputeRegionBackendServiceOutlierDetection():
    def __init__(self, *, base_ejection_time: typing.Optional[typing.List["ComputeRegionBackendServiceOutlierDetectionBaseEjectionTime"]]=None, consecutive_errors: typing.Optional[jsii.Number]=None, consecutive_gateway_failure: typing.Optional[jsii.Number]=None, enforcing_consecutive_errors: typing.Optional[jsii.Number]=None, enforcing_consecutive_gateway_failure: typing.Optional[jsii.Number]=None, enforcing_success_rate: typing.Optional[jsii.Number]=None, interval: typing.Optional[typing.List["ComputeRegionBackendServiceOutlierDetectionInterval"]]=None, max_ejection_percent: typing.Optional[jsii.Number]=None, success_rate_minimum_hosts: typing.Optional[jsii.Number]=None, success_rate_request_volume: typing.Optional[jsii.Number]=None, success_rate_stdev_factor: typing.Optional[jsii.Number]=None) -> None:
        """
        :param base_ejection_time: base_ejection_time block.
        :param consecutive_errors: Number of errors before a host is ejected from the connection pool. When the backend host is accessed over HTTP, a 5xx return code qualifies as an error. Defaults to 5.
        :param consecutive_gateway_failure: The number of consecutive gateway failures (502, 503, 504 status or connection errors that are mapped to one of those status codes) before a consecutive gateway failure ejection occurs. Defaults to 5.
        :param enforcing_consecutive_errors: The percentage chance that a host will be actually ejected when an outlier status is detected through consecutive 5xx. This setting can be used to disable ejection or to ramp it up slowly. Defaults to 100.
        :param enforcing_consecutive_gateway_failure: The percentage chance that a host will be actually ejected when an outlier status is detected through consecutive gateway failures. This setting can be used to disable ejection or to ramp it up slowly. Defaults to 0.
        :param enforcing_success_rate: The percentage chance that a host will be actually ejected when an outlier status is detected through success rate statistics. This setting can be used to disable ejection or to ramp it up slowly. Defaults to 100.
        :param interval: interval block.
        :param max_ejection_percent: Maximum percentage of hosts in the load balancing pool for the backend service that can be ejected. Defaults to 10%.
        :param success_rate_minimum_hosts: The number of hosts in a cluster that must have enough request volume to detect success rate outliers. If the number of hosts is less than this setting, outlier detection via success rate statistics is not performed for any host in the cluster. Defaults to 5.
        :param success_rate_request_volume: The minimum number of total requests that must be collected in one interval (as defined by the interval duration above) to include this host in success rate based outlier detection. If the volume is lower than this setting, outlier detection via success rate statistics is not performed for that host. Defaults to 100.
        :param success_rate_stdev_factor: This factor is used to determine the ejection threshold for success rate outlier ejection. The ejection threshold is the difference between the mean success rate, and the product of this factor and the standard deviation of the mean success rate: mean - (stdev * success_rate_stdev_factor). This factor is divided by a thousand to get a double. That is, if the desired factor is 1.9, the runtime value should be 1900. Defaults to 1900.
        """
        self._values = {
        }
        if base_ejection_time is not None: self._values["base_ejection_time"] = base_ejection_time
        if consecutive_errors is not None: self._values["consecutive_errors"] = consecutive_errors
        if consecutive_gateway_failure is not None: self._values["consecutive_gateway_failure"] = consecutive_gateway_failure
        if enforcing_consecutive_errors is not None: self._values["enforcing_consecutive_errors"] = enforcing_consecutive_errors
        if enforcing_consecutive_gateway_failure is not None: self._values["enforcing_consecutive_gateway_failure"] = enforcing_consecutive_gateway_failure
        if enforcing_success_rate is not None: self._values["enforcing_success_rate"] = enforcing_success_rate
        if interval is not None: self._values["interval"] = interval
        if max_ejection_percent is not None: self._values["max_ejection_percent"] = max_ejection_percent
        if success_rate_minimum_hosts is not None: self._values["success_rate_minimum_hosts"] = success_rate_minimum_hosts
        if success_rate_request_volume is not None: self._values["success_rate_request_volume"] = success_rate_request_volume
        if success_rate_stdev_factor is not None: self._values["success_rate_stdev_factor"] = success_rate_stdev_factor

    @builtins.property
    def base_ejection_time(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceOutlierDetectionBaseEjectionTime"]]:
        """base_ejection_time block."""
        return self._values.get('base_ejection_time')

    @builtins.property
    def consecutive_errors(self) -> typing.Optional[jsii.Number]:
        """Number of errors before a host is ejected from the connection pool.

        When the
        backend host is accessed over HTTP, a 5xx return code qualifies as an error.
        Defaults to 5.
        """
        return self._values.get('consecutive_errors')

    @builtins.property
    def consecutive_gateway_failure(self) -> typing.Optional[jsii.Number]:
        """The number of consecutive gateway failures (502, 503, 504 status or connection errors that are mapped to one of those status codes) before a consecutive gateway failure ejection occurs.

        Defaults to 5.
        """
        return self._values.get('consecutive_gateway_failure')

    @builtins.property
    def enforcing_consecutive_errors(self) -> typing.Optional[jsii.Number]:
        """The percentage chance that a host will be actually ejected when an outlier status is detected through consecutive 5xx.

        This setting can be used to disable
        ejection or to ramp it up slowly. Defaults to 100.
        """
        return self._values.get('enforcing_consecutive_errors')

    @builtins.property
    def enforcing_consecutive_gateway_failure(self) -> typing.Optional[jsii.Number]:
        """The percentage chance that a host will be actually ejected when an outlier status is detected through consecutive gateway failures.

        This setting can be
        used to disable ejection or to ramp it up slowly. Defaults to 0.
        """
        return self._values.get('enforcing_consecutive_gateway_failure')

    @builtins.property
    def enforcing_success_rate(self) -> typing.Optional[jsii.Number]:
        """The percentage chance that a host will be actually ejected when an outlier status is detected through success rate statistics.

        This setting can be used to
        disable ejection or to ramp it up slowly. Defaults to 100.
        """
        return self._values.get('enforcing_success_rate')

    @builtins.property
    def interval(self) -> typing.Optional[typing.List["ComputeRegionBackendServiceOutlierDetectionInterval"]]:
        """interval block."""
        return self._values.get('interval')

    @builtins.property
    def max_ejection_percent(self) -> typing.Optional[jsii.Number]:
        """Maximum percentage of hosts in the load balancing pool for the backend service that can be ejected.

        Defaults to 10%.
        """
        return self._values.get('max_ejection_percent')

    @builtins.property
    def success_rate_minimum_hosts(self) -> typing.Optional[jsii.Number]:
        """The number of hosts in a cluster that must have enough request volume to detect success rate outliers.

        If the number of hosts is less than this setting, outlier
        detection via success rate statistics is not performed for any host in the
        cluster. Defaults to 5.
        """
        return self._values.get('success_rate_minimum_hosts')

    @builtins.property
    def success_rate_request_volume(self) -> typing.Optional[jsii.Number]:
        """The minimum number of total requests that must be collected in one interval (as defined by the interval duration above) to include this host in success rate based outlier detection.

        If the volume is lower than this setting, outlier
        detection via success rate statistics is not performed for that host. Defaults
        to 100.
        """
        return self._values.get('success_rate_request_volume')

    @builtins.property
    def success_rate_stdev_factor(self) -> typing.Optional[jsii.Number]:
        """This factor is used to determine the ejection threshold for success rate outlier ejection.

        The ejection threshold is the difference between the mean success
        rate, and the product of this factor and the standard deviation of the mean
        success rate: mean - (stdev * success_rate_stdev_factor). This factor is divided
        by a thousand to get a double. That is, if the desired factor is 1.9, the
        runtime value should be 1900. Defaults to 1900.
        """
        return self._values.get('success_rate_stdev_factor')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionBackendServiceOutlierDetection(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionBackendServiceOutlierDetectionBaseEjectionTime", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeRegionBackendServiceOutlierDetectionBaseEjectionTime():
    def __init__(self, *, seconds: jsii.Number, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> jsii.Number:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionBackendServiceOutlierDetectionBaseEjectionTime(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionBackendServiceOutlierDetectionInterval", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeRegionBackendServiceOutlierDetectionInterval():
    def __init__(self, *, seconds: jsii.Number, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> jsii.Number:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionBackendServiceOutlierDetectionInterval(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionBackendServiceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeRegionBackendServiceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionBackendServiceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRegionDisk(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRegionDisk"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, replica_zones: typing.List[str], description: typing.Optional[str]=None, disk_encryption_key: typing.Optional[typing.List["ComputeRegionDiskDiskEncryptionKey"]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, physical_block_size_bytes: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, size: typing.Optional[jsii.Number]=None, snapshot: typing.Optional[str]=None, source_snapshot_encryption_key: typing.Optional[typing.List["ComputeRegionDiskSourceSnapshotEncryptionKey"]]=None, timeouts: typing.Optional["ComputeRegionDiskTimeouts"]=None, type: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param replica_zones: URLs of the zones where the disk should be replicated to.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param disk_encryption_key: disk_encryption_key block.
        :param labels: Labels to apply to this disk. A list of key->value pairs.
        :param physical_block_size_bytes: Physical block size of the persistent disk, in bytes. If not present in a request, a default value is used. Currently supported sizes are 4096 and 16384, other sizes may be added in the future. If an unsupported value is requested, the error message will list the supported values for the caller's project.
        :param project: 
        :param region: A reference to the region where the disk resides.
        :param size: Size of the persistent disk, specified in GB. You can specify this field when creating a persistent disk using the sourceImage or sourceSnapshot parameter, or specify it alone to create an empty persistent disk. If you specify this field along with sourceImage or sourceSnapshot, the value of sizeGb must not be less than the size of the sourceImage or the size of the snapshot.
        :param snapshot: The source snapshot used to create this disk. You can provide this as a partial or full URL to the resource. For example, the following are valid values: 'https://www.googleapis.com/compute/v1/projects/project/global/snapshots/snapshot' 'projects/project/global/snapshots/snapshot' 'global/snapshots/snapshot' 'snapshot'
        :param source_snapshot_encryption_key: source_snapshot_encryption_key block.
        :param timeouts: timeouts block.
        :param type: URL of the disk type resource describing which disk type to use to create the disk. Provide this when creating the disk.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRegionDiskConfig(name=name, replica_zones=replica_zones, description=description, disk_encryption_key=disk_encryption_key, labels=labels, physical_block_size_bytes=physical_block_size_bytes, project=project, region=region, size=size, snapshot=snapshot, source_snapshot_encryption_key=source_snapshot_encryption_key, timeouts=timeouts, type=type, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRegionDisk, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="labelFingerprint")
    def label_fingerprint(self) -> str:
        return jsii.get(self, "labelFingerprint")

    @builtins.property
    @jsii.member(jsii_name="lastAttachTimestamp")
    def last_attach_timestamp(self) -> str:
        return jsii.get(self, "lastAttachTimestamp")

    @builtins.property
    @jsii.member(jsii_name="lastDetachTimestamp")
    def last_detach_timestamp(self) -> str:
        return jsii.get(self, "lastDetachTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="sourceSnapshotId")
    def source_snapshot_id(self) -> str:
        return jsii.get(self, "sourceSnapshotId")

    @builtins.property
    @jsii.member(jsii_name="users")
    def users(self) -> typing.List[str]:
        return jsii.get(self, "users")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="replicaZones")
    def replica_zones(self) -> typing.List[str]:
        return jsii.get(self, "replicaZones")

    @replica_zones.setter
    def replica_zones(self, value: typing.List[str]) -> None:
        jsii.set(self, "replicaZones", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="diskEncryptionKey")
    def disk_encryption_key(self) -> typing.Optional[typing.List["ComputeRegionDiskDiskEncryptionKey"]]:
        return jsii.get(self, "diskEncryptionKey")

    @disk_encryption_key.setter
    def disk_encryption_key(self, value: typing.Optional[typing.List["ComputeRegionDiskDiskEncryptionKey"]]) -> None:
        jsii.set(self, "diskEncryptionKey", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="physicalBlockSizeBytes")
    def physical_block_size_bytes(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "physicalBlockSizeBytes")

    @physical_block_size_bytes.setter
    def physical_block_size_bytes(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "physicalBlockSizeBytes", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="size")
    def size(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "size")

    @size.setter
    def size(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "size", value)

    @builtins.property
    @jsii.member(jsii_name="snapshot")
    def snapshot(self) -> typing.Optional[str]:
        return jsii.get(self, "snapshot")

    @snapshot.setter
    def snapshot(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "snapshot", value)

    @builtins.property
    @jsii.member(jsii_name="sourceSnapshotEncryptionKey")
    def source_snapshot_encryption_key(self) -> typing.Optional[typing.List["ComputeRegionDiskSourceSnapshotEncryptionKey"]]:
        return jsii.get(self, "sourceSnapshotEncryptionKey")

    @source_snapshot_encryption_key.setter
    def source_snapshot_encryption_key(self, value: typing.Optional[typing.List["ComputeRegionDiskSourceSnapshotEncryptionKey"]]) -> None:
        jsii.set(self, "sourceSnapshotEncryptionKey", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRegionDiskTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRegionDiskTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> typing.Optional[str]:
        return jsii.get(self, "type")

    @type.setter
    def type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "type", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionDiskConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'replica_zones': 'replicaZones', 'description': 'description', 'disk_encryption_key': 'diskEncryptionKey', 'labels': 'labels', 'physical_block_size_bytes': 'physicalBlockSizeBytes', 'project': 'project', 'region': 'region', 'size': 'size', 'snapshot': 'snapshot', 'source_snapshot_encryption_key': 'sourceSnapshotEncryptionKey', 'timeouts': 'timeouts', 'type': 'type'})
class ComputeRegionDiskConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, replica_zones: typing.List[str], description: typing.Optional[str]=None, disk_encryption_key: typing.Optional[typing.List["ComputeRegionDiskDiskEncryptionKey"]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, physical_block_size_bytes: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, size: typing.Optional[jsii.Number]=None, snapshot: typing.Optional[str]=None, source_snapshot_encryption_key: typing.Optional[typing.List["ComputeRegionDiskSourceSnapshotEncryptionKey"]]=None, timeouts: typing.Optional["ComputeRegionDiskTimeouts"]=None, type: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param replica_zones: URLs of the zones where the disk should be replicated to.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param disk_encryption_key: disk_encryption_key block.
        :param labels: Labels to apply to this disk. A list of key->value pairs.
        :param physical_block_size_bytes: Physical block size of the persistent disk, in bytes. If not present in a request, a default value is used. Currently supported sizes are 4096 and 16384, other sizes may be added in the future. If an unsupported value is requested, the error message will list the supported values for the caller's project.
        :param project: 
        :param region: A reference to the region where the disk resides.
        :param size: Size of the persistent disk, specified in GB. You can specify this field when creating a persistent disk using the sourceImage or sourceSnapshot parameter, or specify it alone to create an empty persistent disk. If you specify this field along with sourceImage or sourceSnapshot, the value of sizeGb must not be less than the size of the sourceImage or the size of the snapshot.
        :param snapshot: The source snapshot used to create this disk. You can provide this as a partial or full URL to the resource. For example, the following are valid values: 'https://www.googleapis.com/compute/v1/projects/project/global/snapshots/snapshot' 'projects/project/global/snapshots/snapshot' 'global/snapshots/snapshot' 'snapshot'
        :param source_snapshot_encryption_key: source_snapshot_encryption_key block.
        :param timeouts: timeouts block.
        :param type: URL of the disk type resource describing which disk type to use to create the disk. Provide this when creating the disk.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRegionDiskTimeouts(**timeouts)
        self._values = {
            'name': name,
            'replica_zones': replica_zones,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if disk_encryption_key is not None: self._values["disk_encryption_key"] = disk_encryption_key
        if labels is not None: self._values["labels"] = labels
        if physical_block_size_bytes is not None: self._values["physical_block_size_bytes"] = physical_block_size_bytes
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if size is not None: self._values["size"] = size
        if snapshot is not None: self._values["snapshot"] = snapshot
        if source_snapshot_encryption_key is not None: self._values["source_snapshot_encryption_key"] = source_snapshot_encryption_key
        if timeouts is not None: self._values["timeouts"] = timeouts
        if type is not None: self._values["type"] = type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def replica_zones(self) -> typing.List[str]:
        """URLs of the zones where the disk should be replicated to."""
        return self._values.get('replica_zones')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def disk_encryption_key(self) -> typing.Optional[typing.List["ComputeRegionDiskDiskEncryptionKey"]]:
        """disk_encryption_key block."""
        return self._values.get('disk_encryption_key')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Labels to apply to this disk.

        A list of key->value pairs.
        """
        return self._values.get('labels')

    @builtins.property
    def physical_block_size_bytes(self) -> typing.Optional[jsii.Number]:
        """Physical block size of the persistent disk, in bytes.

        If not present
        in a request, a default value is used. Currently supported sizes
        are 4096 and 16384, other sizes may be added in the future.
        If an unsupported value is requested, the error message will list
        the supported values for the caller's project.
        """
        return self._values.get('physical_block_size_bytes')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """A reference to the region where the disk resides."""
        return self._values.get('region')

    @builtins.property
    def size(self) -> typing.Optional[jsii.Number]:
        """Size of the persistent disk, specified in GB.

        You can specify this
        field when creating a persistent disk using the sourceImage or
        sourceSnapshot parameter, or specify it alone to create an empty
        persistent disk.

        If you specify this field along with sourceImage or sourceSnapshot,
        the value of sizeGb must not be less than the size of the sourceImage
        or the size of the snapshot.
        """
        return self._values.get('size')

    @builtins.property
    def snapshot(self) -> typing.Optional[str]:
        """The source snapshot used to create this disk.

        You can provide this as
        a partial or full URL to the resource. For example, the following are
        valid values:

        'https://www.googleapis.com/compute/v1/projects/project/global/snapshots/snapshot'
        'projects/project/global/snapshots/snapshot'
        'global/snapshots/snapshot'
        'snapshot'
        """
        return self._values.get('snapshot')

    @builtins.property
    def source_snapshot_encryption_key(self) -> typing.Optional[typing.List["ComputeRegionDiskSourceSnapshotEncryptionKey"]]:
        """source_snapshot_encryption_key block."""
        return self._values.get('source_snapshot_encryption_key')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRegionDiskTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        """URL of the disk type resource describing which disk type to use to create the disk.

        Provide this when creating the disk.
        """
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionDiskConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionDiskDiskEncryptionKey", jsii_struct_bases=[], name_mapping={'raw_key': 'rawKey'})
class ComputeRegionDiskDiskEncryptionKey():
    def __init__(self, *, raw_key: typing.Optional[str]=None) -> None:
        """
        :param raw_key: Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource.
        """
        self._values = {
        }
        if raw_key is not None: self._values["raw_key"] = raw_key

    @builtins.property
    def raw_key(self) -> typing.Optional[str]:
        """Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource."""
        return self._values.get('raw_key')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionDiskDiskEncryptionKey(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRegionDiskResourcePolicyAttachment(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRegionDiskResourcePolicyAttachment"):
    def __init__(self, scope: constructs.Construct, id: str, *, disk: str, name: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRegionDiskResourcePolicyAttachmentTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param disk: The name of the regional disk in which the resource policies are attached to.
        :param name: The resource policy to be attached to the disk for scheduling snapshot creation. Do not specify the self link.
        :param project: 
        :param region: A reference to the region where the disk resides.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRegionDiskResourcePolicyAttachmentConfig(disk=disk, name=name, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRegionDiskResourcePolicyAttachment, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="disk")
    def disk(self) -> str:
        return jsii.get(self, "disk")

    @disk.setter
    def disk(self, value: str) -> None:
        jsii.set(self, "disk", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRegionDiskResourcePolicyAttachmentTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRegionDiskResourcePolicyAttachmentTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionDiskResourcePolicyAttachmentConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'disk': 'disk', 'name': 'name', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class ComputeRegionDiskResourcePolicyAttachmentConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, disk: str, name: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRegionDiskResourcePolicyAttachmentTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param disk: The name of the regional disk in which the resource policies are attached to.
        :param name: The resource policy to be attached to the disk for scheduling snapshot creation. Do not specify the self link.
        :param project: 
        :param region: A reference to the region where the disk resides.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRegionDiskResourcePolicyAttachmentTimeouts(**timeouts)
        self._values = {
            'disk': disk,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def disk(self) -> str:
        """The name of the regional disk in which the resource policies are attached to."""
        return self._values.get('disk')

    @builtins.property
    def name(self) -> str:
        """The resource policy to be attached to the disk for scheduling snapshot creation.

        Do not specify the self link.
        """
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """A reference to the region where the disk resides."""
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRegionDiskResourcePolicyAttachmentTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionDiskResourcePolicyAttachmentConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionDiskResourcePolicyAttachmentTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeRegionDiskResourcePolicyAttachmentTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionDiskResourcePolicyAttachmentTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionDiskSourceSnapshotEncryptionKey", jsii_struct_bases=[], name_mapping={'raw_key': 'rawKey'})
class ComputeRegionDiskSourceSnapshotEncryptionKey():
    def __init__(self, *, raw_key: typing.Optional[str]=None) -> None:
        """
        :param raw_key: Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource.
        """
        self._values = {
        }
        if raw_key is not None: self._values["raw_key"] = raw_key

    @builtins.property
    def raw_key(self) -> typing.Optional[str]:
        """Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource."""
        return self._values.get('raw_key')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionDiskSourceSnapshotEncryptionKey(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionDiskTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeRegionDiskTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionDiskTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRegionHealthCheck(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRegionHealthCheck"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, check_interval_sec: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, healthy_threshold: typing.Optional[jsii.Number]=None, http2_health_check: typing.Optional[typing.List["ComputeRegionHealthCheckHttp2HealthCheck"]]=None, http_health_check: typing.Optional[typing.List["ComputeRegionHealthCheckHttpHealthCheck"]]=None, https_health_check: typing.Optional[typing.List["ComputeRegionHealthCheckHttpsHealthCheck"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, ssl_health_check: typing.Optional[typing.List["ComputeRegionHealthCheckSslHealthCheck"]]=None, tcp_health_check: typing.Optional[typing.List["ComputeRegionHealthCheckTcpHealthCheck"]]=None, timeouts: typing.Optional["ComputeRegionHealthCheckTimeouts"]=None, timeout_sec: typing.Optional[jsii.Number]=None, unhealthy_threshold: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param check_interval_sec: How often (in seconds) to send a health check. The default value is 5 seconds.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param healthy_threshold: A so-far unhealthy instance will be marked healthy after this many consecutive successes. The default value is 2.
        :param http2_health_check: http2_health_check block.
        :param http_health_check: http_health_check block.
        :param https_health_check: https_health_check block.
        :param project: 
        :param region: The Region in which the created health check should reside. If it is not provided, the provider region is used.
        :param ssl_health_check: ssl_health_check block.
        :param tcp_health_check: tcp_health_check block.
        :param timeouts: timeouts block.
        :param timeout_sec: How long (in seconds) to wait before claiming failure. The default value is 5 seconds. It is invalid for timeoutSec to have greater value than checkIntervalSec.
        :param unhealthy_threshold: A so-far healthy instance will be marked unhealthy after this many consecutive failures. The default value is 2.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRegionHealthCheckConfig(name=name, check_interval_sec=check_interval_sec, description=description, healthy_threshold=healthy_threshold, http2_health_check=http2_health_check, http_health_check=http_health_check, https_health_check=https_health_check, project=project, region=region, ssl_health_check=ssl_health_check, tcp_health_check=tcp_health_check, timeouts=timeouts, timeout_sec=timeout_sec, unhealthy_threshold=unhealthy_threshold, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRegionHealthCheck, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="checkIntervalSec")
    def check_interval_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "checkIntervalSec")

    @check_interval_sec.setter
    def check_interval_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "checkIntervalSec", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="healthyThreshold")
    def healthy_threshold(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "healthyThreshold")

    @healthy_threshold.setter
    def healthy_threshold(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "healthyThreshold", value)

    @builtins.property
    @jsii.member(jsii_name="http2HealthCheck")
    def http2_health_check(self) -> typing.Optional[typing.List["ComputeRegionHealthCheckHttp2HealthCheck"]]:
        return jsii.get(self, "http2HealthCheck")

    @http2_health_check.setter
    def http2_health_check(self, value: typing.Optional[typing.List["ComputeRegionHealthCheckHttp2HealthCheck"]]) -> None:
        jsii.set(self, "http2HealthCheck", value)

    @builtins.property
    @jsii.member(jsii_name="httpHealthCheck")
    def http_health_check(self) -> typing.Optional[typing.List["ComputeRegionHealthCheckHttpHealthCheck"]]:
        return jsii.get(self, "httpHealthCheck")

    @http_health_check.setter
    def http_health_check(self, value: typing.Optional[typing.List["ComputeRegionHealthCheckHttpHealthCheck"]]) -> None:
        jsii.set(self, "httpHealthCheck", value)

    @builtins.property
    @jsii.member(jsii_name="httpsHealthCheck")
    def https_health_check(self) -> typing.Optional[typing.List["ComputeRegionHealthCheckHttpsHealthCheck"]]:
        return jsii.get(self, "httpsHealthCheck")

    @https_health_check.setter
    def https_health_check(self, value: typing.Optional[typing.List["ComputeRegionHealthCheckHttpsHealthCheck"]]) -> None:
        jsii.set(self, "httpsHealthCheck", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="sslHealthCheck")
    def ssl_health_check(self) -> typing.Optional[typing.List["ComputeRegionHealthCheckSslHealthCheck"]]:
        return jsii.get(self, "sslHealthCheck")

    @ssl_health_check.setter
    def ssl_health_check(self, value: typing.Optional[typing.List["ComputeRegionHealthCheckSslHealthCheck"]]) -> None:
        jsii.set(self, "sslHealthCheck", value)

    @builtins.property
    @jsii.member(jsii_name="tcpHealthCheck")
    def tcp_health_check(self) -> typing.Optional[typing.List["ComputeRegionHealthCheckTcpHealthCheck"]]:
        return jsii.get(self, "tcpHealthCheck")

    @tcp_health_check.setter
    def tcp_health_check(self, value: typing.Optional[typing.List["ComputeRegionHealthCheckTcpHealthCheck"]]) -> None:
        jsii.set(self, "tcpHealthCheck", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRegionHealthCheckTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRegionHealthCheckTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="timeoutSec")
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "timeoutSec")

    @timeout_sec.setter
    def timeout_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "timeoutSec", value)

    @builtins.property
    @jsii.member(jsii_name="unhealthyThreshold")
    def unhealthy_threshold(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "unhealthyThreshold")

    @unhealthy_threshold.setter
    def unhealthy_threshold(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "unhealthyThreshold", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionHealthCheckConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'check_interval_sec': 'checkIntervalSec', 'description': 'description', 'healthy_threshold': 'healthyThreshold', 'http2_health_check': 'http2HealthCheck', 'http_health_check': 'httpHealthCheck', 'https_health_check': 'httpsHealthCheck', 'project': 'project', 'region': 'region', 'ssl_health_check': 'sslHealthCheck', 'tcp_health_check': 'tcpHealthCheck', 'timeouts': 'timeouts', 'timeout_sec': 'timeoutSec', 'unhealthy_threshold': 'unhealthyThreshold'})
class ComputeRegionHealthCheckConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, check_interval_sec: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, healthy_threshold: typing.Optional[jsii.Number]=None, http2_health_check: typing.Optional[typing.List["ComputeRegionHealthCheckHttp2HealthCheck"]]=None, http_health_check: typing.Optional[typing.List["ComputeRegionHealthCheckHttpHealthCheck"]]=None, https_health_check: typing.Optional[typing.List["ComputeRegionHealthCheckHttpsHealthCheck"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, ssl_health_check: typing.Optional[typing.List["ComputeRegionHealthCheckSslHealthCheck"]]=None, tcp_health_check: typing.Optional[typing.List["ComputeRegionHealthCheckTcpHealthCheck"]]=None, timeouts: typing.Optional["ComputeRegionHealthCheckTimeouts"]=None, timeout_sec: typing.Optional[jsii.Number]=None, unhealthy_threshold: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param check_interval_sec: How often (in seconds) to send a health check. The default value is 5 seconds.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param healthy_threshold: A so-far unhealthy instance will be marked healthy after this many consecutive successes. The default value is 2.
        :param http2_health_check: http2_health_check block.
        :param http_health_check: http_health_check block.
        :param https_health_check: https_health_check block.
        :param project: 
        :param region: The Region in which the created health check should reside. If it is not provided, the provider region is used.
        :param ssl_health_check: ssl_health_check block.
        :param tcp_health_check: tcp_health_check block.
        :param timeouts: timeouts block.
        :param timeout_sec: How long (in seconds) to wait before claiming failure. The default value is 5 seconds. It is invalid for timeoutSec to have greater value than checkIntervalSec.
        :param unhealthy_threshold: A so-far healthy instance will be marked unhealthy after this many consecutive failures. The default value is 2.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRegionHealthCheckTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if check_interval_sec is not None: self._values["check_interval_sec"] = check_interval_sec
        if description is not None: self._values["description"] = description
        if healthy_threshold is not None: self._values["healthy_threshold"] = healthy_threshold
        if http2_health_check is not None: self._values["http2_health_check"] = http2_health_check
        if http_health_check is not None: self._values["http_health_check"] = http_health_check
        if https_health_check is not None: self._values["https_health_check"] = https_health_check
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if ssl_health_check is not None: self._values["ssl_health_check"] = ssl_health_check
        if tcp_health_check is not None: self._values["tcp_health_check"] = tcp_health_check
        if timeouts is not None: self._values["timeouts"] = timeouts
        if timeout_sec is not None: self._values["timeout_sec"] = timeout_sec
        if unhealthy_threshold is not None: self._values["unhealthy_threshold"] = unhealthy_threshold

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035.  Specifically, the name must be 1-63 characters long and
        match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means
        the first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the
        last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def check_interval_sec(self) -> typing.Optional[jsii.Number]:
        """How often (in seconds) to send a health check.

        The default value is 5
        seconds.
        """
        return self._values.get('check_interval_sec')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def healthy_threshold(self) -> typing.Optional[jsii.Number]:
        """A so-far unhealthy instance will be marked healthy after this many consecutive successes.

        The default value is 2.
        """
        return self._values.get('healthy_threshold')

    @builtins.property
    def http2_health_check(self) -> typing.Optional[typing.List["ComputeRegionHealthCheckHttp2HealthCheck"]]:
        """http2_health_check block."""
        return self._values.get('http2_health_check')

    @builtins.property
    def http_health_check(self) -> typing.Optional[typing.List["ComputeRegionHealthCheckHttpHealthCheck"]]:
        """http_health_check block."""
        return self._values.get('http_health_check')

    @builtins.property
    def https_health_check(self) -> typing.Optional[typing.List["ComputeRegionHealthCheckHttpsHealthCheck"]]:
        """https_health_check block."""
        return self._values.get('https_health_check')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The Region in which the created health check should reside.

        If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    @builtins.property
    def ssl_health_check(self) -> typing.Optional[typing.List["ComputeRegionHealthCheckSslHealthCheck"]]:
        """ssl_health_check block."""
        return self._values.get('ssl_health_check')

    @builtins.property
    def tcp_health_check(self) -> typing.Optional[typing.List["ComputeRegionHealthCheckTcpHealthCheck"]]:
        """tcp_health_check block."""
        return self._values.get('tcp_health_check')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRegionHealthCheckTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        """How long (in seconds) to wait before claiming failure.

        The default value is 5 seconds.  It is invalid for timeoutSec to have
        greater value than checkIntervalSec.
        """
        return self._values.get('timeout_sec')

    @builtins.property
    def unhealthy_threshold(self) -> typing.Optional[jsii.Number]:
        """A so-far healthy instance will be marked unhealthy after this many consecutive failures.

        The default value is 2.
        """
        return self._values.get('unhealthy_threshold')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionHealthCheckConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionHealthCheckHttp2HealthCheck", jsii_struct_bases=[], name_mapping={'host': 'host', 'port': 'port', 'port_name': 'portName', 'port_specification': 'portSpecification', 'proxy_header': 'proxyHeader', 'request_path': 'requestPath', 'response': 'response'})
class ComputeRegionHealthCheckHttp2HealthCheck():
    def __init__(self, *, host: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, port_name: typing.Optional[str]=None, port_specification: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, request_path: typing.Optional[str]=None, response: typing.Optional[str]=None) -> None:
        """
        :param host: The value of the host header in the HTTP2 health check request. If left empty (default value), the public IP on behalf of which this health check is performed will be used.
        :param port: The TCP port number for the HTTP2 health check request. The default value is 443.
        :param port_name: Port name as defined in InstanceGroup#NamedPort#name. If both port and port_name are defined, port takes precedence.
        :param port_specification: Specifies how port is selected for health checking, can be one of the following values:. 'USE_FIXED_PORT': The port number in 'port' is used for health checking. 'USE_NAMED_PORT': The 'portName' is used for health checking. 'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each network endpoint is used for health checking. For other backends, the port or named port specified in the Backend Service is used for health checking. If not specified, HTTP2 health check follows behavior specified in 'port' and 'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param request_path: The request path of the HTTP2 health check request. The default value is /.
        :param response: The bytes to match against the beginning of the response data. If left empty (the default value), any response will indicate health. The response data can only be ASCII.
        """
        self._values = {
        }
        if host is not None: self._values["host"] = host
        if port is not None: self._values["port"] = port
        if port_name is not None: self._values["port_name"] = port_name
        if port_specification is not None: self._values["port_specification"] = port_specification
        if proxy_header is not None: self._values["proxy_header"] = proxy_header
        if request_path is not None: self._values["request_path"] = request_path
        if response is not None: self._values["response"] = response

    @builtins.property
    def host(self) -> typing.Optional[str]:
        """The value of the host header in the HTTP2 health check request.

        If left empty (default value), the public IP on behalf of which this health
        check is performed will be used.
        """
        return self._values.get('host')

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The TCP port number for the HTTP2 health check request.

        The default value is 443.
        """
        return self._values.get('port')

    @builtins.property
    def port_name(self) -> typing.Optional[str]:
        """Port name as defined in InstanceGroup#NamedPort#name.

        If both port and
        port_name are defined, port takes precedence.
        """
        return self._values.get('port_name')

    @builtins.property
    def port_specification(self) -> typing.Optional[str]:
        """Specifies how port is selected for health checking, can be one of the following values:.

        'USE_FIXED_PORT': The port number in 'port' is used for health checking.

        'USE_NAMED_PORT': The 'portName' is used for health checking.

        'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each
        network endpoint is used for health checking. For other backends, the
        port or named port specified in the Backend Service is used for health
        checking.

        If not specified, HTTP2 health check follows behavior specified in 'port' and
        'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        """
        return self._values.get('port_specification')

    @builtins.property
    def proxy_header(self) -> typing.Optional[str]:
        """Specifies the type of proxy header to append before sending data to the backend.

        Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        """
        return self._values.get('proxy_header')

    @builtins.property
    def request_path(self) -> typing.Optional[str]:
        """The request path of the HTTP2 health check request.

        The default value is /.
        """
        return self._values.get('request_path')

    @builtins.property
    def response(self) -> typing.Optional[str]:
        """The bytes to match against the beginning of the response data.

        If left empty
        (the default value), any response will indicate health. The response data
        can only be ASCII.
        """
        return self._values.get('response')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionHealthCheckHttp2HealthCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionHealthCheckHttpHealthCheck", jsii_struct_bases=[], name_mapping={'host': 'host', 'port': 'port', 'port_name': 'portName', 'port_specification': 'portSpecification', 'proxy_header': 'proxyHeader', 'request_path': 'requestPath', 'response': 'response'})
class ComputeRegionHealthCheckHttpHealthCheck():
    def __init__(self, *, host: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, port_name: typing.Optional[str]=None, port_specification: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, request_path: typing.Optional[str]=None, response: typing.Optional[str]=None) -> None:
        """
        :param host: The value of the host header in the HTTP health check request. If left empty (default value), the public IP on behalf of which this health check is performed will be used.
        :param port: The TCP port number for the HTTP health check request. The default value is 80.
        :param port_name: Port name as defined in InstanceGroup#NamedPort#name. If both port and port_name are defined, port takes precedence.
        :param port_specification: Specifies how port is selected for health checking, can be one of the following values:. 'USE_FIXED_PORT': The port number in 'port' is used for health checking. 'USE_NAMED_PORT': The 'portName' is used for health checking. 'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each network endpoint is used for health checking. For other backends, the port or named port specified in the Backend Service is used for health checking. If not specified, HTTP health check follows behavior specified in 'port' and 'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param request_path: The request path of the HTTP health check request. The default value is /.
        :param response: The bytes to match against the beginning of the response data. If left empty (the default value), any response will indicate health. The response data can only be ASCII.
        """
        self._values = {
        }
        if host is not None: self._values["host"] = host
        if port is not None: self._values["port"] = port
        if port_name is not None: self._values["port_name"] = port_name
        if port_specification is not None: self._values["port_specification"] = port_specification
        if proxy_header is not None: self._values["proxy_header"] = proxy_header
        if request_path is not None: self._values["request_path"] = request_path
        if response is not None: self._values["response"] = response

    @builtins.property
    def host(self) -> typing.Optional[str]:
        """The value of the host header in the HTTP health check request.

        If left empty (default value), the public IP on behalf of which this health
        check is performed will be used.
        """
        return self._values.get('host')

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The TCP port number for the HTTP health check request.

        The default value is 80.
        """
        return self._values.get('port')

    @builtins.property
    def port_name(self) -> typing.Optional[str]:
        """Port name as defined in InstanceGroup#NamedPort#name.

        If both port and
        port_name are defined, port takes precedence.
        """
        return self._values.get('port_name')

    @builtins.property
    def port_specification(self) -> typing.Optional[str]:
        """Specifies how port is selected for health checking, can be one of the following values:.

        'USE_FIXED_PORT': The port number in 'port' is used for health checking.

        'USE_NAMED_PORT': The 'portName' is used for health checking.

        'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each
        network endpoint is used for health checking. For other backends, the
        port or named port specified in the Backend Service is used for health
        checking.

        If not specified, HTTP health check follows behavior specified in 'port' and
        'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        """
        return self._values.get('port_specification')

    @builtins.property
    def proxy_header(self) -> typing.Optional[str]:
        """Specifies the type of proxy header to append before sending data to the backend.

        Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        """
        return self._values.get('proxy_header')

    @builtins.property
    def request_path(self) -> typing.Optional[str]:
        """The request path of the HTTP health check request.

        The default value is /.
        """
        return self._values.get('request_path')

    @builtins.property
    def response(self) -> typing.Optional[str]:
        """The bytes to match against the beginning of the response data.

        If left empty
        (the default value), any response will indicate health. The response data
        can only be ASCII.
        """
        return self._values.get('response')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionHealthCheckHttpHealthCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionHealthCheckHttpsHealthCheck", jsii_struct_bases=[], name_mapping={'host': 'host', 'port': 'port', 'port_name': 'portName', 'port_specification': 'portSpecification', 'proxy_header': 'proxyHeader', 'request_path': 'requestPath', 'response': 'response'})
class ComputeRegionHealthCheckHttpsHealthCheck():
    def __init__(self, *, host: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, port_name: typing.Optional[str]=None, port_specification: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, request_path: typing.Optional[str]=None, response: typing.Optional[str]=None) -> None:
        """
        :param host: The value of the host header in the HTTPS health check request. If left empty (default value), the public IP on behalf of which this health check is performed will be used.
        :param port: The TCP port number for the HTTPS health check request. The default value is 443.
        :param port_name: Port name as defined in InstanceGroup#NamedPort#name. If both port and port_name are defined, port takes precedence.
        :param port_specification: Specifies how port is selected for health checking, can be one of the following values:. 'USE_FIXED_PORT': The port number in 'port' is used for health checking. 'USE_NAMED_PORT': The 'portName' is used for health checking. 'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each network endpoint is used for health checking. For other backends, the port or named port specified in the Backend Service is used for health checking. If not specified, HTTPS health check follows behavior specified in 'port' and 'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param request_path: The request path of the HTTPS health check request. The default value is /.
        :param response: The bytes to match against the beginning of the response data. If left empty (the default value), any response will indicate health. The response data can only be ASCII.
        """
        self._values = {
        }
        if host is not None: self._values["host"] = host
        if port is not None: self._values["port"] = port
        if port_name is not None: self._values["port_name"] = port_name
        if port_specification is not None: self._values["port_specification"] = port_specification
        if proxy_header is not None: self._values["proxy_header"] = proxy_header
        if request_path is not None: self._values["request_path"] = request_path
        if response is not None: self._values["response"] = response

    @builtins.property
    def host(self) -> typing.Optional[str]:
        """The value of the host header in the HTTPS health check request.

        If left empty (default value), the public IP on behalf of which this health
        check is performed will be used.
        """
        return self._values.get('host')

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The TCP port number for the HTTPS health check request.

        The default value is 443.
        """
        return self._values.get('port')

    @builtins.property
    def port_name(self) -> typing.Optional[str]:
        """Port name as defined in InstanceGroup#NamedPort#name.

        If both port and
        port_name are defined, port takes precedence.
        """
        return self._values.get('port_name')

    @builtins.property
    def port_specification(self) -> typing.Optional[str]:
        """Specifies how port is selected for health checking, can be one of the following values:.

        'USE_FIXED_PORT': The port number in 'port' is used for health checking.

        'USE_NAMED_PORT': The 'portName' is used for health checking.

        'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each
        network endpoint is used for health checking. For other backends, the
        port or named port specified in the Backend Service is used for health
        checking.

        If not specified, HTTPS health check follows behavior specified in 'port' and
        'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        """
        return self._values.get('port_specification')

    @builtins.property
    def proxy_header(self) -> typing.Optional[str]:
        """Specifies the type of proxy header to append before sending data to the backend.

        Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        """
        return self._values.get('proxy_header')

    @builtins.property
    def request_path(self) -> typing.Optional[str]:
        """The request path of the HTTPS health check request.

        The default value is /.
        """
        return self._values.get('request_path')

    @builtins.property
    def response(self) -> typing.Optional[str]:
        """The bytes to match against the beginning of the response data.

        If left empty
        (the default value), any response will indicate health. The response data
        can only be ASCII.
        """
        return self._values.get('response')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionHealthCheckHttpsHealthCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionHealthCheckSslHealthCheck", jsii_struct_bases=[], name_mapping={'port': 'port', 'port_name': 'portName', 'port_specification': 'portSpecification', 'proxy_header': 'proxyHeader', 'request': 'request', 'response': 'response'})
class ComputeRegionHealthCheckSslHealthCheck():
    def __init__(self, *, port: typing.Optional[jsii.Number]=None, port_name: typing.Optional[str]=None, port_specification: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, request: typing.Optional[str]=None, response: typing.Optional[str]=None) -> None:
        """
        :param port: The TCP port number for the SSL health check request. The default value is 443.
        :param port_name: Port name as defined in InstanceGroup#NamedPort#name. If both port and port_name are defined, port takes precedence.
        :param port_specification: Specifies how port is selected for health checking, can be one of the following values:. 'USE_FIXED_PORT': The port number in 'port' is used for health checking. 'USE_NAMED_PORT': The 'portName' is used for health checking. 'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each network endpoint is used for health checking. For other backends, the port or named port specified in the Backend Service is used for health checking. If not specified, SSL health check follows behavior specified in 'port' and 'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param request: The application data to send once the SSL connection has been established (default value is empty). If both request and response are empty, the connection establishment alone will indicate health. The request data can only be ASCII.
        :param response: The bytes to match against the beginning of the response data. If left empty (the default value), any response will indicate health. The response data can only be ASCII.
        """
        self._values = {
        }
        if port is not None: self._values["port"] = port
        if port_name is not None: self._values["port_name"] = port_name
        if port_specification is not None: self._values["port_specification"] = port_specification
        if proxy_header is not None: self._values["proxy_header"] = proxy_header
        if request is not None: self._values["request"] = request
        if response is not None: self._values["response"] = response

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The TCP port number for the SSL health check request.

        The default value is 443.
        """
        return self._values.get('port')

    @builtins.property
    def port_name(self) -> typing.Optional[str]:
        """Port name as defined in InstanceGroup#NamedPort#name.

        If both port and
        port_name are defined, port takes precedence.
        """
        return self._values.get('port_name')

    @builtins.property
    def port_specification(self) -> typing.Optional[str]:
        """Specifies how port is selected for health checking, can be one of the following values:.

        'USE_FIXED_PORT': The port number in 'port' is used for health checking.

        'USE_NAMED_PORT': The 'portName' is used for health checking.

        'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each
        network endpoint is used for health checking. For other backends, the
        port or named port specified in the Backend Service is used for health
        checking.

        If not specified, SSL health check follows behavior specified in 'port' and
        'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        """
        return self._values.get('port_specification')

    @builtins.property
    def proxy_header(self) -> typing.Optional[str]:
        """Specifies the type of proxy header to append before sending data to the backend.

        Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        """
        return self._values.get('proxy_header')

    @builtins.property
    def request(self) -> typing.Optional[str]:
        """The application data to send once the SSL connection has been established (default value is empty).

        If both request and response are
        empty, the connection establishment alone will indicate health. The request
        data can only be ASCII.
        """
        return self._values.get('request')

    @builtins.property
    def response(self) -> typing.Optional[str]:
        """The bytes to match against the beginning of the response data.

        If left empty
        (the default value), any response will indicate health. The response data
        can only be ASCII.
        """
        return self._values.get('response')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionHealthCheckSslHealthCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionHealthCheckTcpHealthCheck", jsii_struct_bases=[], name_mapping={'port': 'port', 'port_name': 'portName', 'port_specification': 'portSpecification', 'proxy_header': 'proxyHeader', 'request': 'request', 'response': 'response'})
class ComputeRegionHealthCheckTcpHealthCheck():
    def __init__(self, *, port: typing.Optional[jsii.Number]=None, port_name: typing.Optional[str]=None, port_specification: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, request: typing.Optional[str]=None, response: typing.Optional[str]=None) -> None:
        """
        :param port: The TCP port number for the TCP health check request. The default value is 80.
        :param port_name: Port name as defined in InstanceGroup#NamedPort#name. If both port and port_name are defined, port takes precedence.
        :param port_specification: Specifies how port is selected for health checking, can be one of the following values:. 'USE_FIXED_PORT': The port number in 'port' is used for health checking. 'USE_NAMED_PORT': The 'portName' is used for health checking. 'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each network endpoint is used for health checking. For other backends, the port or named port specified in the Backend Service is used for health checking. If not specified, TCP health check follows behavior specified in 'port' and 'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param request: The application data to send once the TCP connection has been established (default value is empty). If both request and response are empty, the connection establishment alone will indicate health. The request data can only be ASCII.
        :param response: The bytes to match against the beginning of the response data. If left empty (the default value), any response will indicate health. The response data can only be ASCII.
        """
        self._values = {
        }
        if port is not None: self._values["port"] = port
        if port_name is not None: self._values["port_name"] = port_name
        if port_specification is not None: self._values["port_specification"] = port_specification
        if proxy_header is not None: self._values["proxy_header"] = proxy_header
        if request is not None: self._values["request"] = request
        if response is not None: self._values["response"] = response

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The TCP port number for the TCP health check request.

        The default value is 80.
        """
        return self._values.get('port')

    @builtins.property
    def port_name(self) -> typing.Optional[str]:
        """Port name as defined in InstanceGroup#NamedPort#name.

        If both port and
        port_name are defined, port takes precedence.
        """
        return self._values.get('port_name')

    @builtins.property
    def port_specification(self) -> typing.Optional[str]:
        """Specifies how port is selected for health checking, can be one of the following values:.

        'USE_FIXED_PORT': The port number in 'port' is used for health checking.

        'USE_NAMED_PORT': The 'portName' is used for health checking.

        'USE_SERVING_PORT': For NetworkEndpointGroup, the port specified for each
        network endpoint is used for health checking. For other backends, the
        port or named port specified in the Backend Service is used for health
        checking.

        If not specified, TCP health check follows behavior specified in 'port' and
        'portName' fields. Possible values: ["USE_FIXED_PORT", "USE_NAMED_PORT", "USE_SERVING_PORT"]
        """
        return self._values.get('port_specification')

    @builtins.property
    def proxy_header(self) -> typing.Optional[str]:
        """Specifies the type of proxy header to append before sending data to the backend.

        Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        """
        return self._values.get('proxy_header')

    @builtins.property
    def request(self) -> typing.Optional[str]:
        """The application data to send once the TCP connection has been established (default value is empty).

        If both request and response are
        empty, the connection establishment alone will indicate health. The request
        data can only be ASCII.
        """
        return self._values.get('request')

    @builtins.property
    def response(self) -> typing.Optional[str]:
        """The bytes to match against the beginning of the response data.

        If left empty
        (the default value), any response will indicate health. The response data
        can only be ASCII.
        """
        return self._values.get('response')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionHealthCheckTcpHealthCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionHealthCheckTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeRegionHealthCheckTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionHealthCheckTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRegionInstanceGroupManager(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRegionInstanceGroupManager"):
    def __init__(self, scope: constructs.Construct, id: str, *, base_instance_name: str, name: str, region: str, version: typing.List["ComputeRegionInstanceGroupManagerVersion"], auto_healing_policies: typing.Optional[typing.List["ComputeRegionInstanceGroupManagerAutoHealingPolicies"]]=None, description: typing.Optional[str]=None, distribution_policy_zones: typing.Optional[typing.List[str]]=None, named_port: typing.Optional[typing.List["ComputeRegionInstanceGroupManagerNamedPort"]]=None, project: typing.Optional[str]=None, target_pools: typing.Optional[typing.List[str]]=None, target_size: typing.Optional[jsii.Number]=None, timeouts: typing.Optional["ComputeRegionInstanceGroupManagerTimeouts"]=None, update_policy: typing.Optional[typing.List["ComputeRegionInstanceGroupManagerUpdatePolicy"]]=None, update_strategy: typing.Optional[str]=None, wait_for_instances: typing.Optional[bool]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param base_instance_name: The base instance name to use for instances in this group. The value must be a valid RFC1035 name. Supported characters are lowercase letters, numbers, and hyphens (-). Instances are named by appending a hyphen and a random four-character string to the base instance name.
        :param name: The name of the instance group manager. Must be 1-63 characters long and comply with RFC1035. Supported characters include lowercase letters, numbers, and hyphens.
        :param region: The region where the managed instance group resides.
        :param version: version block.
        :param auto_healing_policies: auto_healing_policies block.
        :param description: An optional textual description of the instance group manager.
        :param distribution_policy_zones: The distribution policy for this managed instance group. You can specify one or more values.
        :param named_port: named_port block.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param target_pools: The full URL of all target pools to which new instances in the group are added. Updating the target pools attribute does not affect existing instances.
        :param target_size: The target number of running instances for this managed instance group. This value should always be explicitly set unless this resource is attached to an autoscaler, in which case it should never be set. Defaults to 0.
        :param timeouts: timeouts block.
        :param update_policy: update_policy block.
        :param update_strategy: 
        :param wait_for_instances: Whether to wait for all instances to be created/updated before returning. Note that if this is set to true and the operation does not succeed, Terraform will continue trying until it times out.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRegionInstanceGroupManagerConfig(base_instance_name=base_instance_name, name=name, region=region, version=version, auto_healing_policies=auto_healing_policies, description=description, distribution_policy_zones=distribution_policy_zones, named_port=named_port, project=project, target_pools=target_pools, target_size=target_size, timeouts=timeouts, update_policy=update_policy, update_strategy=update_strategy, wait_for_instances=wait_for_instances, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRegionInstanceGroupManager, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="fingerprint")
    def fingerprint(self) -> str:
        return jsii.get(self, "fingerprint")

    @builtins.property
    @jsii.member(jsii_name="instanceGroup")
    def instance_group(self) -> str:
        return jsii.get(self, "instanceGroup")

    @builtins.property
    @jsii.member(jsii_name="instanceTemplate")
    def instance_template(self) -> str:
        return jsii.get(self, "instanceTemplate")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="baseInstanceName")
    def base_instance_name(self) -> str:
        return jsii.get(self, "baseInstanceName")

    @base_instance_name.setter
    def base_instance_name(self, value: str) -> None:
        jsii.set(self, "baseInstanceName", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> str:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: str) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> typing.List["ComputeRegionInstanceGroupManagerVersion"]:
        return jsii.get(self, "version")

    @version.setter
    def version(self, value: typing.List["ComputeRegionInstanceGroupManagerVersion"]) -> None:
        jsii.set(self, "version", value)

    @builtins.property
    @jsii.member(jsii_name="autoHealingPolicies")
    def auto_healing_policies(self) -> typing.Optional[typing.List["ComputeRegionInstanceGroupManagerAutoHealingPolicies"]]:
        return jsii.get(self, "autoHealingPolicies")

    @auto_healing_policies.setter
    def auto_healing_policies(self, value: typing.Optional[typing.List["ComputeRegionInstanceGroupManagerAutoHealingPolicies"]]) -> None:
        jsii.set(self, "autoHealingPolicies", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="distributionPolicyZones")
    def distribution_policy_zones(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "distributionPolicyZones")

    @distribution_policy_zones.setter
    def distribution_policy_zones(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "distributionPolicyZones", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="namedPort")
    def named_port(self) -> typing.Optional[typing.List["ComputeRegionInstanceGroupManagerNamedPort"]]:
        return jsii.get(self, "namedPort")

    @named_port.setter
    def named_port(self, value: typing.Optional[typing.List["ComputeRegionInstanceGroupManagerNamedPort"]]) -> None:
        jsii.set(self, "namedPort", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="targetPools")
    def target_pools(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "targetPools")

    @target_pools.setter
    def target_pools(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "targetPools", value)

    @builtins.property
    @jsii.member(jsii_name="targetSize")
    def target_size(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "targetSize")

    @target_size.setter
    def target_size(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "targetSize", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRegionInstanceGroupManagerTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRegionInstanceGroupManagerTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="updatePolicy")
    def update_policy(self) -> typing.Optional[typing.List["ComputeRegionInstanceGroupManagerUpdatePolicy"]]:
        return jsii.get(self, "updatePolicy")

    @update_policy.setter
    def update_policy(self, value: typing.Optional[typing.List["ComputeRegionInstanceGroupManagerUpdatePolicy"]]) -> None:
        jsii.set(self, "updatePolicy", value)

    @builtins.property
    @jsii.member(jsii_name="updateStrategy")
    def update_strategy(self) -> typing.Optional[str]:
        return jsii.get(self, "updateStrategy")

    @update_strategy.setter
    def update_strategy(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "updateStrategy", value)

    @builtins.property
    @jsii.member(jsii_name="waitForInstances")
    def wait_for_instances(self) -> typing.Optional[bool]:
        return jsii.get(self, "waitForInstances")

    @wait_for_instances.setter
    def wait_for_instances(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "waitForInstances", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionInstanceGroupManagerAutoHealingPolicies", jsii_struct_bases=[], name_mapping={'health_check': 'healthCheck', 'initial_delay_sec': 'initialDelaySec'})
class ComputeRegionInstanceGroupManagerAutoHealingPolicies():
    def __init__(self, *, health_check: str, initial_delay_sec: jsii.Number) -> None:
        """
        :param health_check: The health check resource that signals autohealing.
        :param initial_delay_sec: The number of seconds that the managed instance group waits before it applies autohealing policies to new instances or recently recreated instances. Between 0 and 3600.
        """
        self._values = {
            'health_check': health_check,
            'initial_delay_sec': initial_delay_sec,
        }

    @builtins.property
    def health_check(self) -> str:
        """The health check resource that signals autohealing."""
        return self._values.get('health_check')

    @builtins.property
    def initial_delay_sec(self) -> jsii.Number:
        """The number of seconds that the managed instance group waits before it applies autohealing policies to new instances or recently recreated instances.

        Between 0 and 3600.
        """
        return self._values.get('initial_delay_sec')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionInstanceGroupManagerAutoHealingPolicies(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionInstanceGroupManagerConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'base_instance_name': 'baseInstanceName', 'name': 'name', 'region': 'region', 'version': 'version', 'auto_healing_policies': 'autoHealingPolicies', 'description': 'description', 'distribution_policy_zones': 'distributionPolicyZones', 'named_port': 'namedPort', 'project': 'project', 'target_pools': 'targetPools', 'target_size': 'targetSize', 'timeouts': 'timeouts', 'update_policy': 'updatePolicy', 'update_strategy': 'updateStrategy', 'wait_for_instances': 'waitForInstances'})
class ComputeRegionInstanceGroupManagerConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, base_instance_name: str, name: str, region: str, version: typing.List["ComputeRegionInstanceGroupManagerVersion"], auto_healing_policies: typing.Optional[typing.List["ComputeRegionInstanceGroupManagerAutoHealingPolicies"]]=None, description: typing.Optional[str]=None, distribution_policy_zones: typing.Optional[typing.List[str]]=None, named_port: typing.Optional[typing.List["ComputeRegionInstanceGroupManagerNamedPort"]]=None, project: typing.Optional[str]=None, target_pools: typing.Optional[typing.List[str]]=None, target_size: typing.Optional[jsii.Number]=None, timeouts: typing.Optional["ComputeRegionInstanceGroupManagerTimeouts"]=None, update_policy: typing.Optional[typing.List["ComputeRegionInstanceGroupManagerUpdatePolicy"]]=None, update_strategy: typing.Optional[str]=None, wait_for_instances: typing.Optional[bool]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param base_instance_name: The base instance name to use for instances in this group. The value must be a valid RFC1035 name. Supported characters are lowercase letters, numbers, and hyphens (-). Instances are named by appending a hyphen and a random four-character string to the base instance name.
        :param name: The name of the instance group manager. Must be 1-63 characters long and comply with RFC1035. Supported characters include lowercase letters, numbers, and hyphens.
        :param region: The region where the managed instance group resides.
        :param version: version block.
        :param auto_healing_policies: auto_healing_policies block.
        :param description: An optional textual description of the instance group manager.
        :param distribution_policy_zones: The distribution policy for this managed instance group. You can specify one or more values.
        :param named_port: named_port block.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param target_pools: The full URL of all target pools to which new instances in the group are added. Updating the target pools attribute does not affect existing instances.
        :param target_size: The target number of running instances for this managed instance group. This value should always be explicitly set unless this resource is attached to an autoscaler, in which case it should never be set. Defaults to 0.
        :param timeouts: timeouts block.
        :param update_policy: update_policy block.
        :param update_strategy: 
        :param wait_for_instances: Whether to wait for all instances to be created/updated before returning. Note that if this is set to true and the operation does not succeed, Terraform will continue trying until it times out.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRegionInstanceGroupManagerTimeouts(**timeouts)
        self._values = {
            'base_instance_name': base_instance_name,
            'name': name,
            'region': region,
            'version': version,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if auto_healing_policies is not None: self._values["auto_healing_policies"] = auto_healing_policies
        if description is not None: self._values["description"] = description
        if distribution_policy_zones is not None: self._values["distribution_policy_zones"] = distribution_policy_zones
        if named_port is not None: self._values["named_port"] = named_port
        if project is not None: self._values["project"] = project
        if target_pools is not None: self._values["target_pools"] = target_pools
        if target_size is not None: self._values["target_size"] = target_size
        if timeouts is not None: self._values["timeouts"] = timeouts
        if update_policy is not None: self._values["update_policy"] = update_policy
        if update_strategy is not None: self._values["update_strategy"] = update_strategy
        if wait_for_instances is not None: self._values["wait_for_instances"] = wait_for_instances

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def base_instance_name(self) -> str:
        """The base instance name to use for instances in this group.

        The value must be a valid RFC1035 name. Supported characters are lowercase letters, numbers, and hyphens (-). Instances are named by appending a hyphen and a random four-character string to the base instance name.
        """
        return self._values.get('base_instance_name')

    @builtins.property
    def name(self) -> str:
        """The name of the instance group manager.

        Must be 1-63 characters long and comply with RFC1035. Supported characters include lowercase letters, numbers, and hyphens.
        """
        return self._values.get('name')

    @builtins.property
    def region(self) -> str:
        """The region where the managed instance group resides."""
        return self._values.get('region')

    @builtins.property
    def version(self) -> typing.List["ComputeRegionInstanceGroupManagerVersion"]:
        """version block."""
        return self._values.get('version')

    @builtins.property
    def auto_healing_policies(self) -> typing.Optional[typing.List["ComputeRegionInstanceGroupManagerAutoHealingPolicies"]]:
        """auto_healing_policies block."""
        return self._values.get('auto_healing_policies')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional textual description of the instance group manager."""
        return self._values.get('description')

    @builtins.property
    def distribution_policy_zones(self) -> typing.Optional[typing.List[str]]:
        """The distribution policy for this managed instance group.

        You can specify one or more values.
        """
        return self._values.get('distribution_policy_zones')

    @builtins.property
    def named_port(self) -> typing.Optional[typing.List["ComputeRegionInstanceGroupManagerNamedPort"]]:
        """named_port block."""
        return self._values.get('named_port')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def target_pools(self) -> typing.Optional[typing.List[str]]:
        """The full URL of all target pools to which new instances in the group are added.

        Updating the target pools attribute does not affect existing instances.
        """
        return self._values.get('target_pools')

    @builtins.property
    def target_size(self) -> typing.Optional[jsii.Number]:
        """The target number of running instances for this managed instance group.

        This value should always be explicitly set unless this resource is attached to an autoscaler, in which case it should never be set. Defaults to 0.
        """
        return self._values.get('target_size')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRegionInstanceGroupManagerTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def update_policy(self) -> typing.Optional[typing.List["ComputeRegionInstanceGroupManagerUpdatePolicy"]]:
        """update_policy block."""
        return self._values.get('update_policy')

    @builtins.property
    def update_strategy(self) -> typing.Optional[str]:
        return self._values.get('update_strategy')

    @builtins.property
    def wait_for_instances(self) -> typing.Optional[bool]:
        """Whether to wait for all instances to be created/updated before returning.

        Note that if this is set to true and the operation does not succeed, Terraform will continue trying until it times out.
        """
        return self._values.get('wait_for_instances')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionInstanceGroupManagerConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionInstanceGroupManagerNamedPort", jsii_struct_bases=[], name_mapping={'name': 'name', 'port': 'port'})
class ComputeRegionInstanceGroupManagerNamedPort():
    def __init__(self, *, name: str, port: jsii.Number) -> None:
        """
        :param name: The name of the port.
        :param port: The port number.
        """
        self._values = {
            'name': name,
            'port': port,
        }

    @builtins.property
    def name(self) -> str:
        """The name of the port."""
        return self._values.get('name')

    @builtins.property
    def port(self) -> jsii.Number:
        """The port number."""
        return self._values.get('port')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionInstanceGroupManagerNamedPort(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionInstanceGroupManagerTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeRegionInstanceGroupManagerTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionInstanceGroupManagerTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionInstanceGroupManagerUpdatePolicy", jsii_struct_bases=[], name_mapping={'minimal_action': 'minimalAction', 'type': 'type', 'instance_redistribution_type': 'instanceRedistributionType', 'max_surge_fixed': 'maxSurgeFixed', 'max_surge_percent': 'maxSurgePercent', 'max_unavailable_fixed': 'maxUnavailableFixed', 'max_unavailable_percent': 'maxUnavailablePercent', 'min_ready_sec': 'minReadySec'})
class ComputeRegionInstanceGroupManagerUpdatePolicy():
    def __init__(self, *, minimal_action: str, type: str, instance_redistribution_type: typing.Optional[str]=None, max_surge_fixed: typing.Optional[jsii.Number]=None, max_surge_percent: typing.Optional[jsii.Number]=None, max_unavailable_fixed: typing.Optional[jsii.Number]=None, max_unavailable_percent: typing.Optional[jsii.Number]=None, min_ready_sec: typing.Optional[jsii.Number]=None) -> None:
        """
        :param minimal_action: Minimal action to be taken on an instance. You can specify either RESTART to restart existing instances or REPLACE to delete and create new instances from the target template. If you specify a RESTART, the Updater will attempt to perform that action only. However, if the Updater determines that the minimal action you specify is not enough to perform the update, it might perform a more disruptive action.
        :param type: The type of update process. You can specify either PROACTIVE so that the instance group manager proactively executes actions in order to bring instances to their target versions or OPPORTUNISTIC so that no action is proactively executed but the update will be performed as part of other actions (for example, resizes or recreateInstances calls).
        :param instance_redistribution_type: The instance redistribution policy for regional managed instance groups. Valid values are: "PROACTIVE", "NONE". If PROACTIVE (default), the group attempts to maintain an even distribution of VM instances across zones in the region. If NONE, proactive redistribution is disabled.
        :param max_surge_fixed: The maximum number of instances that can be created above the specified targetSize during the update process. Conflicts with max_surge_percent. It has to be either 0 or at least equal to the number of zones. If fixed values are used, at least one of max_unavailable_fixed or max_surge_fixed must be greater than 0.
        :param max_surge_percent: The maximum number of instances(calculated as percentage) that can be created above the specified targetSize during the update process. Conflicts with max_surge_fixed. Percent value is only allowed for regional managed instance groups with size at least 10.
        :param max_unavailable_fixed: The maximum number of instances that can be unavailable during the update process. Conflicts with max_unavailable_percent. It has to be either 0 or at least equal to the number of zones. If fixed values are used, at least one of max_unavailable_fixed or max_surge_fixed must be greater than 0.
        :param max_unavailable_percent: The maximum number of instances(calculated as percentage) that can be unavailable during the update process. Conflicts with max_unavailable_fixed. Percent value is only allowed for regional managed instance groups with size at least 10.
        :param min_ready_sec: Minimum number of seconds to wait for after a newly created instance becomes available. This value must be from range [0, 3600].
        """
        self._values = {
            'minimal_action': minimal_action,
            'type': type,
        }
        if instance_redistribution_type is not None: self._values["instance_redistribution_type"] = instance_redistribution_type
        if max_surge_fixed is not None: self._values["max_surge_fixed"] = max_surge_fixed
        if max_surge_percent is not None: self._values["max_surge_percent"] = max_surge_percent
        if max_unavailable_fixed is not None: self._values["max_unavailable_fixed"] = max_unavailable_fixed
        if max_unavailable_percent is not None: self._values["max_unavailable_percent"] = max_unavailable_percent
        if min_ready_sec is not None: self._values["min_ready_sec"] = min_ready_sec

    @builtins.property
    def minimal_action(self) -> str:
        """Minimal action to be taken on an instance.

        You can specify either RESTART to restart existing instances or REPLACE to delete and create new instances from the target template. If you specify a RESTART, the Updater will attempt to perform that action only. However, if the Updater determines that the minimal action you specify is not enough to perform the update, it might perform a more disruptive action.
        """
        return self._values.get('minimal_action')

    @builtins.property
    def type(self) -> str:
        """The type of update process.

        You can specify either PROACTIVE so that the instance group manager proactively executes actions in order to bring instances to their target versions or OPPORTUNISTIC so that no action is proactively executed but the update will be performed as part of other actions (for example, resizes or recreateInstances calls).
        """
        return self._values.get('type')

    @builtins.property
    def instance_redistribution_type(self) -> typing.Optional[str]:
        """The instance redistribution policy for regional managed instance groups.

        Valid values are: "PROACTIVE", "NONE". If PROACTIVE (default), the group attempts to maintain an even distribution of VM instances across zones in the region. If NONE, proactive redistribution is disabled.
        """
        return self._values.get('instance_redistribution_type')

    @builtins.property
    def max_surge_fixed(self) -> typing.Optional[jsii.Number]:
        """The maximum number of instances that can be created above the specified targetSize during the update process.

        Conflicts with max_surge_percent. It has to be either 0 or at least equal to the number of zones. If fixed values are used, at least one of max_unavailable_fixed or max_surge_fixed must be greater than 0.
        """
        return self._values.get('max_surge_fixed')

    @builtins.property
    def max_surge_percent(self) -> typing.Optional[jsii.Number]:
        """The maximum number of instances(calculated as percentage) that can be created above the specified targetSize during the update process.

        Conflicts with max_surge_fixed. Percent value is only allowed for regional managed instance groups with size at least 10.
        """
        return self._values.get('max_surge_percent')

    @builtins.property
    def max_unavailable_fixed(self) -> typing.Optional[jsii.Number]:
        """The maximum number of instances that can be unavailable during the update process.

        Conflicts with max_unavailable_percent. It has to be either 0 or at least equal to the number of zones. If fixed values are used, at least one of max_unavailable_fixed or max_surge_fixed must be greater than 0.
        """
        return self._values.get('max_unavailable_fixed')

    @builtins.property
    def max_unavailable_percent(self) -> typing.Optional[jsii.Number]:
        """The maximum number of instances(calculated as percentage) that can be unavailable during the update process.

        Conflicts with max_unavailable_fixed. Percent value is only allowed for regional managed instance groups with size at least 10.
        """
        return self._values.get('max_unavailable_percent')

    @builtins.property
    def min_ready_sec(self) -> typing.Optional[jsii.Number]:
        """Minimum number of seconds to wait for after a newly created instance becomes available.

        This value must be from range [0, 3600].
        """
        return self._values.get('min_ready_sec')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionInstanceGroupManagerUpdatePolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionInstanceGroupManagerVersion", jsii_struct_bases=[], name_mapping={'instance_template': 'instanceTemplate', 'name': 'name', 'target_size': 'targetSize'})
class ComputeRegionInstanceGroupManagerVersion():
    def __init__(self, *, instance_template: str, name: typing.Optional[str]=None, target_size: typing.Optional[typing.List["ComputeRegionInstanceGroupManagerVersionTargetSize"]]=None) -> None:
        """
        :param instance_template: The full URL to an instance template from which all new instances of this version will be created.
        :param name: Version name.
        :param target_size: target_size block.
        """
        self._values = {
            'instance_template': instance_template,
        }
        if name is not None: self._values["name"] = name
        if target_size is not None: self._values["target_size"] = target_size

    @builtins.property
    def instance_template(self) -> str:
        """The full URL to an instance template from which all new instances of this version will be created."""
        return self._values.get('instance_template')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Version name."""
        return self._values.get('name')

    @builtins.property
    def target_size(self) -> typing.Optional[typing.List["ComputeRegionInstanceGroupManagerVersionTargetSize"]]:
        """target_size block."""
        return self._values.get('target_size')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionInstanceGroupManagerVersion(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionInstanceGroupManagerVersionTargetSize", jsii_struct_bases=[], name_mapping={'fixed': 'fixed', 'percent': 'percent'})
class ComputeRegionInstanceGroupManagerVersionTargetSize():
    def __init__(self, *, fixed: typing.Optional[jsii.Number]=None, percent: typing.Optional[jsii.Number]=None) -> None:
        """
        :param fixed: The number of instances which are managed for this version. Conflicts with percent.
        :param percent: The number of instances (calculated as percentage) which are managed for this version. Conflicts with fixed. Note that when using percent, rounding will be in favor of explicitly set target_size values; a managed instance group with 2 instances and 2 versions, one of which has a target_size.percent of 60 will create 2 instances of that version.
        """
        self._values = {
        }
        if fixed is not None: self._values["fixed"] = fixed
        if percent is not None: self._values["percent"] = percent

    @builtins.property
    def fixed(self) -> typing.Optional[jsii.Number]:
        """The number of instances which are managed for this version.

        Conflicts with percent.
        """
        return self._values.get('fixed')

    @builtins.property
    def percent(self) -> typing.Optional[jsii.Number]:
        """The number of instances (calculated as percentage) which are managed for this version.

        Conflicts with fixed. Note that when using percent, rounding will be in favor of explicitly set target_size values; a managed instance group with 2 instances and 2 versions, one of which has a target_size.percent of 60 will create 2 instances of that version.
        """
        return self._values.get('percent')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionInstanceGroupManagerVersionTargetSize(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRegionSslCertificate(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRegionSslCertificate"):
    def __init__(self, scope: constructs.Construct, id: str, *, certificate: str, private_key: str, description: typing.Optional[str]=None, name: typing.Optional[str]=None, name_prefix: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRegionSslCertificateTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param certificate: The certificate in PEM format. The certificate chain must be no greater than 5 certs long. The chain must include at least one intermediate cert.
        :param private_key: The write-only private key in PEM format.
        :param description: An optional description of this resource.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash. These are in the same namespace as the managed SSL certificates.
        :param name_prefix: 
        :param project: 
        :param region: The Region in which the created regional ssl certificate should reside. If it is not provided, the provider region is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRegionSslCertificateConfig(certificate=certificate, private_key=private_key, description=description, name=name, name_prefix=name_prefix, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRegionSslCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="certificateId")
    def certificate_id(self) -> jsii.Number:
        return jsii.get(self, "certificateId")

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="certificate")
    def certificate(self) -> str:
        return jsii.get(self, "certificate")

    @certificate.setter
    def certificate(self, value: str) -> None:
        jsii.set(self, "certificate", value)

    @builtins.property
    @jsii.member(jsii_name="privateKey")
    def private_key(self) -> str:
        return jsii.get(self, "privateKey")

    @private_key.setter
    def private_key(self, value: str) -> None:
        jsii.set(self, "privateKey", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="namePrefix")
    def name_prefix(self) -> typing.Optional[str]:
        return jsii.get(self, "namePrefix")

    @name_prefix.setter
    def name_prefix(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "namePrefix", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRegionSslCertificateTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRegionSslCertificateTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionSslCertificateConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'certificate': 'certificate', 'private_key': 'privateKey', 'description': 'description', 'name': 'name', 'name_prefix': 'namePrefix', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class ComputeRegionSslCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, certificate: str, private_key: str, description: typing.Optional[str]=None, name: typing.Optional[str]=None, name_prefix: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRegionSslCertificateTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param certificate: The certificate in PEM format. The certificate chain must be no greater than 5 certs long. The chain must include at least one intermediate cert.
        :param private_key: The write-only private key in PEM format.
        :param description: An optional description of this resource.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash. These are in the same namespace as the managed SSL certificates.
        :param name_prefix: 
        :param project: 
        :param region: The Region in which the created regional ssl certificate should reside. If it is not provided, the provider region is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRegionSslCertificateTimeouts(**timeouts)
        self._values = {
            'certificate': certificate,
            'private_key': private_key,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if name is not None: self._values["name"] = name
        if name_prefix is not None: self._values["name_prefix"] = name_prefix
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def certificate(self) -> str:
        """The certificate in PEM format.

        The certificate chain must be no greater than 5 certs long.
        The chain must include at least one intermediate cert.
        """
        return self._values.get('certificate')

    @builtins.property
    def private_key(self) -> str:
        """The write-only private key in PEM format."""
        return self._values.get('private_key')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.

        These are in the same namespace as the managed SSL certificates.
        """
        return self._values.get('name')

    @builtins.property
    def name_prefix(self) -> typing.Optional[str]:
        return self._values.get('name_prefix')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The Region in which the created regional ssl certificate should reside.

        If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRegionSslCertificateTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionSslCertificateConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionSslCertificateTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeRegionSslCertificateTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionSslCertificateTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRegionTargetHttpProxy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRegionTargetHttpProxy"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, url_map: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRegionTargetHttpProxyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param url_map: A reference to the RegionUrlMap resource that defines the mapping from URL to the BackendService.
        :param description: An optional description of this resource.
        :param project: 
        :param region: The Region in which the created target https proxy should reside. If it is not provided, the provider region is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRegionTargetHttpProxyConfig(name=name, url_map=url_map, description=description, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRegionTargetHttpProxy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="proxyId")
    def proxy_id(self) -> jsii.Number:
        return jsii.get(self, "proxyId")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="urlMap")
    def url_map(self) -> str:
        return jsii.get(self, "urlMap")

    @url_map.setter
    def url_map(self, value: str) -> None:
        jsii.set(self, "urlMap", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRegionTargetHttpProxyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRegionTargetHttpProxyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionTargetHttpProxyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'url_map': 'urlMap', 'description': 'description', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class ComputeRegionTargetHttpProxyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, url_map: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRegionTargetHttpProxyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param url_map: A reference to the RegionUrlMap resource that defines the mapping from URL to the BackendService.
        :param description: An optional description of this resource.
        :param project: 
        :param region: The Region in which the created target https proxy should reside. If it is not provided, the provider region is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRegionTargetHttpProxyTimeouts(**timeouts)
        self._values = {
            'name': name,
            'url_map': url_map,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def url_map(self) -> str:
        """A reference to the RegionUrlMap resource that defines the mapping from URL to the BackendService."""
        return self._values.get('url_map')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The Region in which the created target https proxy should reside.

        If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRegionTargetHttpProxyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionTargetHttpProxyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionTargetHttpProxyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeRegionTargetHttpProxyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionTargetHttpProxyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRegionTargetHttpsProxy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRegionTargetHttpsProxy"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, ssl_certificates: typing.List[str], url_map: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRegionTargetHttpsProxyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param ssl_certificates: A list of RegionSslCertificate resources that are used to authenticate connections between users and the load balancer. Currently, exactly one SSL certificate must be specified.
        :param url_map: A reference to the RegionUrlMap resource that defines the mapping from URL to the RegionBackendService.
        :param description: An optional description of this resource.
        :param project: 
        :param region: The Region in which the created target https proxy should reside. If it is not provided, the provider region is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRegionTargetHttpsProxyConfig(name=name, ssl_certificates=ssl_certificates, url_map=url_map, description=description, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRegionTargetHttpsProxy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="proxyId")
    def proxy_id(self) -> jsii.Number:
        return jsii.get(self, "proxyId")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="sslCertificates")
    def ssl_certificates(self) -> typing.List[str]:
        return jsii.get(self, "sslCertificates")

    @ssl_certificates.setter
    def ssl_certificates(self, value: typing.List[str]) -> None:
        jsii.set(self, "sslCertificates", value)

    @builtins.property
    @jsii.member(jsii_name="urlMap")
    def url_map(self) -> str:
        return jsii.get(self, "urlMap")

    @url_map.setter
    def url_map(self, value: str) -> None:
        jsii.set(self, "urlMap", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRegionTargetHttpsProxyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRegionTargetHttpsProxyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionTargetHttpsProxyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'ssl_certificates': 'sslCertificates', 'url_map': 'urlMap', 'description': 'description', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class ComputeRegionTargetHttpsProxyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, ssl_certificates: typing.List[str], url_map: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRegionTargetHttpsProxyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param ssl_certificates: A list of RegionSslCertificate resources that are used to authenticate connections between users and the load balancer. Currently, exactly one SSL certificate must be specified.
        :param url_map: A reference to the RegionUrlMap resource that defines the mapping from URL to the RegionBackendService.
        :param description: An optional description of this resource.
        :param project: 
        :param region: The Region in which the created target https proxy should reside. If it is not provided, the provider region is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRegionTargetHttpsProxyTimeouts(**timeouts)
        self._values = {
            'name': name,
            'ssl_certificates': ssl_certificates,
            'url_map': url_map,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def ssl_certificates(self) -> typing.List[str]:
        """A list of RegionSslCertificate resources that are used to authenticate connections between users and the load balancer.

        Currently, exactly
        one SSL certificate must be specified.
        """
        return self._values.get('ssl_certificates')

    @builtins.property
    def url_map(self) -> str:
        """A reference to the RegionUrlMap resource that defines the mapping from URL to the RegionBackendService."""
        return self._values.get('url_map')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The Region in which the created target https proxy should reside.

        If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRegionTargetHttpsProxyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionTargetHttpsProxyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionTargetHttpsProxyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeRegionTargetHttpsProxyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionTargetHttpsProxyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRegionUrlMap(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRegionUrlMap"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, default_service: typing.Optional[str]=None, default_url_redirect: typing.Optional[typing.List["ComputeRegionUrlMapDefaultUrlRedirect"]]=None, description: typing.Optional[str]=None, host_rule: typing.Optional[typing.List["ComputeRegionUrlMapHostRule"]]=None, path_matcher: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcher"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, test: typing.Optional[typing.List["ComputeRegionUrlMapTest"]]=None, timeouts: typing.Optional["ComputeRegionUrlMapTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param default_service: The full or partial URL of the defaultService resource to which traffic is directed if none of the hostRules match. If defaultRouteAction is additionally specified, advanced routing actions like URL Rewrites, etc. take effect prior to sending the request to the backend. However, if defaultService is specified, defaultRouteAction cannot contain any weightedBackendServices. Conversely, if routeAction specifies any weightedBackendServices, service must not be specified. Only one of defaultService, defaultUrlRedirect or defaultRouteAction.weightedBackendService must be set.
        :param default_url_redirect: default_url_redirect block.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param host_rule: host_rule block.
        :param path_matcher: path_matcher block.
        :param project: 
        :param region: The Region in which the url map should reside. If it is not provided, the provider region is used.
        :param test: test block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRegionUrlMapConfig(name=name, default_service=default_service, default_url_redirect=default_url_redirect, description=description, host_rule=host_rule, path_matcher=path_matcher, project=project, region=region, test=test, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRegionUrlMap, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="fingerprint")
    def fingerprint(self) -> str:
        return jsii.get(self, "fingerprint")

    @builtins.property
    @jsii.member(jsii_name="mapId")
    def map_id(self) -> jsii.Number:
        return jsii.get(self, "mapId")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="defaultService")
    def default_service(self) -> typing.Optional[str]:
        return jsii.get(self, "defaultService")

    @default_service.setter
    def default_service(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "defaultService", value)

    @builtins.property
    @jsii.member(jsii_name="defaultUrlRedirect")
    def default_url_redirect(self) -> typing.Optional[typing.List["ComputeRegionUrlMapDefaultUrlRedirect"]]:
        return jsii.get(self, "defaultUrlRedirect")

    @default_url_redirect.setter
    def default_url_redirect(self, value: typing.Optional[typing.List["ComputeRegionUrlMapDefaultUrlRedirect"]]) -> None:
        jsii.set(self, "defaultUrlRedirect", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="hostRule")
    def host_rule(self) -> typing.Optional[typing.List["ComputeRegionUrlMapHostRule"]]:
        return jsii.get(self, "hostRule")

    @host_rule.setter
    def host_rule(self, value: typing.Optional[typing.List["ComputeRegionUrlMapHostRule"]]) -> None:
        jsii.set(self, "hostRule", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="pathMatcher")
    def path_matcher(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcher"]]:
        return jsii.get(self, "pathMatcher")

    @path_matcher.setter
    def path_matcher(self, value: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcher"]]) -> None:
        jsii.set(self, "pathMatcher", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="test")
    def test(self) -> typing.Optional[typing.List["ComputeRegionUrlMapTest"]]:
        return jsii.get(self, "test")

    @test.setter
    def test(self, value: typing.Optional[typing.List["ComputeRegionUrlMapTest"]]) -> None:
        jsii.set(self, "test", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRegionUrlMapTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRegionUrlMapTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'default_service': 'defaultService', 'default_url_redirect': 'defaultUrlRedirect', 'description': 'description', 'host_rule': 'hostRule', 'path_matcher': 'pathMatcher', 'project': 'project', 'region': 'region', 'test': 'test', 'timeouts': 'timeouts'})
class ComputeRegionUrlMapConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, default_service: typing.Optional[str]=None, default_url_redirect: typing.Optional[typing.List["ComputeRegionUrlMapDefaultUrlRedirect"]]=None, description: typing.Optional[str]=None, host_rule: typing.Optional[typing.List["ComputeRegionUrlMapHostRule"]]=None, path_matcher: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcher"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, test: typing.Optional[typing.List["ComputeRegionUrlMapTest"]]=None, timeouts: typing.Optional["ComputeRegionUrlMapTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param default_service: The full or partial URL of the defaultService resource to which traffic is directed if none of the hostRules match. If defaultRouteAction is additionally specified, advanced routing actions like URL Rewrites, etc. take effect prior to sending the request to the backend. However, if defaultService is specified, defaultRouteAction cannot contain any weightedBackendServices. Conversely, if routeAction specifies any weightedBackendServices, service must not be specified. Only one of defaultService, defaultUrlRedirect or defaultRouteAction.weightedBackendService must be set.
        :param default_url_redirect: default_url_redirect block.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param host_rule: host_rule block.
        :param path_matcher: path_matcher block.
        :param project: 
        :param region: The Region in which the url map should reside. If it is not provided, the provider region is used.
        :param test: test block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRegionUrlMapTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if default_service is not None: self._values["default_service"] = default_service
        if default_url_redirect is not None: self._values["default_url_redirect"] = default_url_redirect
        if description is not None: self._values["description"] = description
        if host_rule is not None: self._values["host_rule"] = host_rule
        if path_matcher is not None: self._values["path_matcher"] = path_matcher
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if test is not None: self._values["test"] = test
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def default_service(self) -> typing.Optional[str]:
        """The full or partial URL of the defaultService resource to which traffic is directed if none of the hostRules match.

        If defaultRouteAction is additionally specified, advanced
        routing actions like URL Rewrites, etc. take effect prior to sending the request to the
        backend. However, if defaultService is specified, defaultRouteAction cannot contain any
        weightedBackendServices. Conversely, if routeAction specifies any
        weightedBackendServices, service must not be specified.  Only one of defaultService,
        defaultUrlRedirect or defaultRouteAction.weightedBackendService must be set.
        """
        return self._values.get('default_service')

    @builtins.property
    def default_url_redirect(self) -> typing.Optional[typing.List["ComputeRegionUrlMapDefaultUrlRedirect"]]:
        """default_url_redirect block."""
        return self._values.get('default_url_redirect')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def host_rule(self) -> typing.Optional[typing.List["ComputeRegionUrlMapHostRule"]]:
        """host_rule block."""
        return self._values.get('host_rule')

    @builtins.property
    def path_matcher(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcher"]]:
        """path_matcher block."""
        return self._values.get('path_matcher')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The Region in which the url map should reside.

        If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    @builtins.property
    def test(self) -> typing.Optional[typing.List["ComputeRegionUrlMapTest"]]:
        """test block."""
        return self._values.get('test')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRegionUrlMapTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapDefaultUrlRedirect", jsii_struct_bases=[], name_mapping={'strip_query': 'stripQuery', 'host_redirect': 'hostRedirect', 'https_redirect': 'httpsRedirect', 'path_redirect': 'pathRedirect', 'prefix_redirect': 'prefixRedirect', 'redirect_response_code': 'redirectResponseCode'})
class ComputeRegionUrlMapDefaultUrlRedirect():
    def __init__(self, *, strip_query: bool, host_redirect: typing.Optional[str]=None, https_redirect: typing.Optional[bool]=None, path_redirect: typing.Optional[str]=None, prefix_redirect: typing.Optional[str]=None, redirect_response_code: typing.Optional[str]=None) -> None:
        """
        :param strip_query: If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request. If set to false, the query portion of the original URL is retained. This field is required to ensure an empty block is not set. The normal default value is false.
        :param host_redirect: The host that will be used in the redirect response instead of the one that was supplied in the request. The value must be between 1 and 255 characters.
        :param https_redirect: If set to true, the URL scheme in the redirected request is set to https. If set to false, the URL scheme of the redirected request will remain the same as that of the request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this true for TargetHttpsProxy is not permitted. The default is set to false.
        :param path_redirect: The path that will be used in the redirect response instead of the one that was supplied in the request. pathRedirect cannot be supplied together with prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param prefix_redirect: The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request. prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param redirect_response_code: The HTTP Status code to use for this RedirectAction. Supported values are:. MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301. FOUND, which corresponds to 302. SEE_OTHER which corresponds to 303. TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method will be retained. PERMANENT_REDIRECT, which corresponds to 308. In this case, the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        self._values = {
            'strip_query': strip_query,
        }
        if host_redirect is not None: self._values["host_redirect"] = host_redirect
        if https_redirect is not None: self._values["https_redirect"] = https_redirect
        if path_redirect is not None: self._values["path_redirect"] = path_redirect
        if prefix_redirect is not None: self._values["prefix_redirect"] = prefix_redirect
        if redirect_response_code is not None: self._values["redirect_response_code"] = redirect_response_code

    @builtins.property
    def strip_query(self) -> bool:
        """If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request.

        If set to false, the query portion of the original URL is
        retained.
        This field is required to ensure an empty block is not set. The normal default value is false.
        """
        return self._values.get('strip_query')

    @builtins.property
    def host_redirect(self) -> typing.Optional[str]:
        """The host that will be used in the redirect response instead of the one that was supplied in the request.

        The value must be between 1 and 255 characters.
        """
        return self._values.get('host_redirect')

    @builtins.property
    def https_redirect(self) -> typing.Optional[bool]:
        """If set to true, the URL scheme in the redirected request is set to https.

        If set to
        false, the URL scheme of the redirected request will remain the same as that of the
        request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this
        true for TargetHttpsProxy is not permitted. The default is set to false.
        """
        return self._values.get('https_redirect')

    @builtins.property
    def path_redirect(self) -> typing.Optional[str]:
        """The path that will be used in the redirect response instead of the one that was supplied in the request.

        pathRedirect cannot be supplied together with
        prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the
        original request will be used for the redirect. The value must be between 1 and 1024
        characters.
        """
        return self._values.get('path_redirect')

    @builtins.property
    def prefix_redirect(self) -> typing.Optional[str]:
        """The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request.

        prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or
        neither. If neither is supplied, the path of the original request will be used for
        the redirect. The value must be between 1 and 1024 characters.
        """
        return self._values.get('prefix_redirect')

    @builtins.property
    def redirect_response_code(self) -> typing.Optional[str]:
        """The HTTP Status code to use for this RedirectAction. Supported values are:.

        MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301.

        FOUND, which corresponds to 302.

        SEE_OTHER which corresponds to 303.

        TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method
        will be retained.

        PERMANENT_REDIRECT, which corresponds to 308. In this case,
        the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        return self._values.get('redirect_response_code')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapDefaultUrlRedirect(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapHostRule", jsii_struct_bases=[], name_mapping={'hosts': 'hosts', 'path_matcher': 'pathMatcher', 'description': 'description'})
class ComputeRegionUrlMapHostRule():
    def __init__(self, *, hosts: typing.List[str], path_matcher: str, description: typing.Optional[str]=None) -> None:
        """
        :param hosts: The list of host patterns to match. They must be valid hostnames, except * will match any string of ([a-z0-9-.]*). In that case, * must be the first character and must be followed in the pattern by either - or ..
        :param path_matcher: The name of the PathMatcher to use to match the path portion of the URL if the hostRule matches the URL's host portion.
        :param description: An optional description of this HostRule. Provide this property when you create the resource.
        """
        self._values = {
            'hosts': hosts,
            'path_matcher': path_matcher,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def hosts(self) -> typing.List[str]:
        """The list of host patterns to match.

        They must be valid
        hostnames, except * will match any string of ([a-z0-9-.]*). In
        that case, * must be the first character and must be followed in
        the pattern by either - or ..
        """
        return self._values.get('hosts')

    @builtins.property
    def path_matcher(self) -> str:
        """The name of the PathMatcher to use to match the path portion of the URL if the hostRule matches the URL's host portion."""
        return self._values.get('path_matcher')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this HostRule.

        Provide this property
        when you create the resource.
        """
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapHostRule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcher", jsii_struct_bases=[], name_mapping={'default_service': 'defaultService', 'name': 'name', 'default_url_redirect': 'defaultUrlRedirect', 'description': 'description', 'path_rule': 'pathRule', 'route_rules': 'routeRules'})
class ComputeRegionUrlMapPathMatcher():
    def __init__(self, *, default_service: str, name: str, default_url_redirect: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherDefaultUrlRedirect"]]=None, description: typing.Optional[str]=None, path_rule: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRule"]]=None, route_rules: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRules"]]=None) -> None:
        """
        :param default_service: A reference to a RegionBackendService resource. This will be used if none of the pathRules defined by this PathMatcher is matched by the URL's path portion.
        :param name: The name to which this PathMatcher is referred by the HostRule.
        :param default_url_redirect: default_url_redirect block.
        :param description: An optional description of this resource.
        :param path_rule: path_rule block.
        :param route_rules: route_rules block.
        """
        self._values = {
            'default_service': default_service,
            'name': name,
        }
        if default_url_redirect is not None: self._values["default_url_redirect"] = default_url_redirect
        if description is not None: self._values["description"] = description
        if path_rule is not None: self._values["path_rule"] = path_rule
        if route_rules is not None: self._values["route_rules"] = route_rules

    @builtins.property
    def default_service(self) -> str:
        """A reference to a RegionBackendService resource.

        This will be used if
        none of the pathRules defined by this PathMatcher is matched by
        the URL's path portion.
        """
        return self._values.get('default_service')

    @builtins.property
    def name(self) -> str:
        """The name to which this PathMatcher is referred by the HostRule."""
        return self._values.get('name')

    @builtins.property
    def default_url_redirect(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherDefaultUrlRedirect"]]:
        """default_url_redirect block."""
        return self._values.get('default_url_redirect')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def path_rule(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRule"]]:
        """path_rule block."""
        return self._values.get('path_rule')

    @builtins.property
    def route_rules(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRules"]]:
        """route_rules block."""
        return self._values.get('route_rules')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcher(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherDefaultUrlRedirect", jsii_struct_bases=[], name_mapping={'strip_query': 'stripQuery', 'host_redirect': 'hostRedirect', 'https_redirect': 'httpsRedirect', 'path_redirect': 'pathRedirect', 'prefix_redirect': 'prefixRedirect', 'redirect_response_code': 'redirectResponseCode'})
class ComputeRegionUrlMapPathMatcherDefaultUrlRedirect():
    def __init__(self, *, strip_query: bool, host_redirect: typing.Optional[str]=None, https_redirect: typing.Optional[bool]=None, path_redirect: typing.Optional[str]=None, prefix_redirect: typing.Optional[str]=None, redirect_response_code: typing.Optional[str]=None) -> None:
        """
        :param strip_query: If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request. If set to false, the query portion of the original URL is retained. This field is required to ensure an empty block is not set. The normal default value is false.
        :param host_redirect: The host that will be used in the redirect response instead of the one that was supplied in the request. The value must be between 1 and 255 characters.
        :param https_redirect: If set to true, the URL scheme in the redirected request is set to https. If set to false, the URL scheme of the redirected request will remain the same as that of the request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this true for TargetHttpsProxy is not permitted. The default is set to false.
        :param path_redirect: The path that will be used in the redirect response instead of the one that was supplied in the request. pathRedirect cannot be supplied together with prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param prefix_redirect: The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request. prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param redirect_response_code: The HTTP Status code to use for this RedirectAction. Supported values are:. MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301. FOUND, which corresponds to 302. SEE_OTHER which corresponds to 303. TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method will be retained. PERMANENT_REDIRECT, which corresponds to 308. In this case, the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        self._values = {
            'strip_query': strip_query,
        }
        if host_redirect is not None: self._values["host_redirect"] = host_redirect
        if https_redirect is not None: self._values["https_redirect"] = https_redirect
        if path_redirect is not None: self._values["path_redirect"] = path_redirect
        if prefix_redirect is not None: self._values["prefix_redirect"] = prefix_redirect
        if redirect_response_code is not None: self._values["redirect_response_code"] = redirect_response_code

    @builtins.property
    def strip_query(self) -> bool:
        """If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request.

        If set to false, the query portion of the original URL is
        retained.
        This field is required to ensure an empty block is not set. The normal default value is false.
        """
        return self._values.get('strip_query')

    @builtins.property
    def host_redirect(self) -> typing.Optional[str]:
        """The host that will be used in the redirect response instead of the one that was supplied in the request.

        The value must be between 1 and 255 characters.
        """
        return self._values.get('host_redirect')

    @builtins.property
    def https_redirect(self) -> typing.Optional[bool]:
        """If set to true, the URL scheme in the redirected request is set to https.

        If set to
        false, the URL scheme of the redirected request will remain the same as that of the
        request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this
        true for TargetHttpsProxy is not permitted. The default is set to false.
        """
        return self._values.get('https_redirect')

    @builtins.property
    def path_redirect(self) -> typing.Optional[str]:
        """The path that will be used in the redirect response instead of the one that was supplied in the request.

        pathRedirect cannot be supplied together with
        prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the
        original request will be used for the redirect. The value must be between 1 and 1024
        characters.
        """
        return self._values.get('path_redirect')

    @builtins.property
    def prefix_redirect(self) -> typing.Optional[str]:
        """The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request.

        prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or
        neither. If neither is supplied, the path of the original request will be used for
        the redirect. The value must be between 1 and 1024 characters.
        """
        return self._values.get('prefix_redirect')

    @builtins.property
    def redirect_response_code(self) -> typing.Optional[str]:
        """The HTTP Status code to use for this RedirectAction. Supported values are:.

        MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301.

        FOUND, which corresponds to 302.

        SEE_OTHER which corresponds to 303.

        TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method
        will be retained.

        PERMANENT_REDIRECT, which corresponds to 308. In this case,
        the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        return self._values.get('redirect_response_code')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherDefaultUrlRedirect(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRule", jsii_struct_bases=[], name_mapping={'paths': 'paths', 'route_action': 'routeAction', 'service': 'service', 'url_redirect': 'urlRedirect'})
class ComputeRegionUrlMapPathMatcherPathRule():
    def __init__(self, *, paths: typing.List[str], route_action: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteAction"]]=None, service: typing.Optional[str]=None, url_redirect: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleUrlRedirect"]]=None) -> None:
        """
        :param paths: The list of path patterns to match. Each must start with / and the only place a is allowed is at the end following a /. The string fed to the path matcher does not include any text after the first ? or #, and those chars are not allowed here.
        :param route_action: route_action block.
        :param service: The region backend service resource to which traffic is directed if this rule is matched. If routeAction is additionally specified, advanced routing actions like URL Rewrites, etc. take effect prior to sending the request to the backend. However, if service is specified, routeAction cannot contain any weightedBackendService s. Conversely, if routeAction specifies any weightedBackendServices, service must not be specified. Only one of urlRedirect, service or routeAction.weightedBackendService must be set.
        :param url_redirect: url_redirect block.
        """
        self._values = {
            'paths': paths,
        }
        if route_action is not None: self._values["route_action"] = route_action
        if service is not None: self._values["service"] = service
        if url_redirect is not None: self._values["url_redirect"] = url_redirect

    @builtins.property
    def paths(self) -> typing.List[str]:
        """The list of path patterns to match.

        Each must start with / and the only place a
        is allowed is at the end following a /. The string fed to the path matcher
        does not include any text after the first ? or #, and those chars are not
        allowed here.
        """
        return self._values.get('paths')

    @builtins.property
    def route_action(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteAction"]]:
        """route_action block."""
        return self._values.get('route_action')

    @builtins.property
    def service(self) -> typing.Optional[str]:
        """The region backend service resource to which traffic is directed if this rule is matched.

        If routeAction is additionally specified,
        advanced routing actions like URL Rewrites, etc. take effect prior to sending
        the request to the backend. However, if service is specified, routeAction cannot
        contain any weightedBackendService s. Conversely, if routeAction specifies any
        weightedBackendServices, service must not be specified. Only one of urlRedirect,
        service or routeAction.weightedBackendService must be set.
        """
        return self._values.get('service')

    @builtins.property
    def url_redirect(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleUrlRedirect"]]:
        """url_redirect block."""
        return self._values.get('url_redirect')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteAction", jsii_struct_bases=[], name_mapping={'cors_policy': 'corsPolicy', 'fault_injection_policy': 'faultInjectionPolicy', 'request_mirror_policy': 'requestMirrorPolicy', 'retry_policy': 'retryPolicy', 'timeout': 'timeout', 'url_rewrite': 'urlRewrite', 'weighted_backend_services': 'weightedBackendServices'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteAction():
    def __init__(self, *, cors_policy: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionCorsPolicy"]]=None, fault_injection_policy: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicy"]]=None, request_mirror_policy: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicy"]]=None, retry_policy: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionRetryPolicy"]]=None, timeout: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionTimeout"]]=None, url_rewrite: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionUrlRewrite"]]=None, weighted_backend_services: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServices"]]=None) -> None:
        """
        :param cors_policy: cors_policy block.
        :param fault_injection_policy: fault_injection_policy block.
        :param request_mirror_policy: request_mirror_policy block.
        :param retry_policy: retry_policy block.
        :param timeout: timeout block.
        :param url_rewrite: url_rewrite block.
        :param weighted_backend_services: weighted_backend_services block.
        """
        self._values = {
        }
        if cors_policy is not None: self._values["cors_policy"] = cors_policy
        if fault_injection_policy is not None: self._values["fault_injection_policy"] = fault_injection_policy
        if request_mirror_policy is not None: self._values["request_mirror_policy"] = request_mirror_policy
        if retry_policy is not None: self._values["retry_policy"] = retry_policy
        if timeout is not None: self._values["timeout"] = timeout
        if url_rewrite is not None: self._values["url_rewrite"] = url_rewrite
        if weighted_backend_services is not None: self._values["weighted_backend_services"] = weighted_backend_services

    @builtins.property
    def cors_policy(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionCorsPolicy"]]:
        """cors_policy block."""
        return self._values.get('cors_policy')

    @builtins.property
    def fault_injection_policy(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicy"]]:
        """fault_injection_policy block."""
        return self._values.get('fault_injection_policy')

    @builtins.property
    def request_mirror_policy(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicy"]]:
        """request_mirror_policy block."""
        return self._values.get('request_mirror_policy')

    @builtins.property
    def retry_policy(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionRetryPolicy"]]:
        """retry_policy block."""
        return self._values.get('retry_policy')

    @builtins.property
    def timeout(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionTimeout"]]:
        """timeout block."""
        return self._values.get('timeout')

    @builtins.property
    def url_rewrite(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionUrlRewrite"]]:
        """url_rewrite block."""
        return self._values.get('url_rewrite')

    @builtins.property
    def weighted_backend_services(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServices"]]:
        """weighted_backend_services block."""
        return self._values.get('weighted_backend_services')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionCorsPolicy", jsii_struct_bases=[], name_mapping={'disabled': 'disabled', 'allow_credentials': 'allowCredentials', 'allow_headers': 'allowHeaders', 'allow_methods': 'allowMethods', 'allow_origin_regexes': 'allowOriginRegexes', 'allow_origins': 'allowOrigins', 'expose_headers': 'exposeHeaders', 'max_age': 'maxAge'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionCorsPolicy():
    def __init__(self, *, disabled: bool, allow_credentials: typing.Optional[bool]=None, allow_headers: typing.Optional[typing.List[str]]=None, allow_methods: typing.Optional[typing.List[str]]=None, allow_origin_regexes: typing.Optional[typing.List[str]]=None, allow_origins: typing.Optional[typing.List[str]]=None, expose_headers: typing.Optional[typing.List[str]]=None, max_age: typing.Optional[jsii.Number]=None) -> None:
        """
        :param disabled: If true, specifies the CORS policy is disabled.
        :param allow_credentials: In response to a preflight request, setting this to true indicates that the actual request can include user credentials. This translates to the Access- Control-Allow-Credentials header. Defaults to false.
        :param allow_headers: Specifies the content for the Access-Control-Allow-Headers header.
        :param allow_methods: Specifies the content for the Access-Control-Allow-Methods header.
        :param allow_origin_regexes: Specifies the regualar expression patterns that match allowed origins. For regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript An origin is allowed if it matches either allow_origins or allow_origin_regex.
        :param allow_origins: Specifies the list of origins that will be allowed to do CORS requests. An origin is allowed if it matches either allow_origins or allow_origin_regex.
        :param expose_headers: Specifies the content for the Access-Control-Expose-Headers header.
        :param max_age: Specifies how long the results of a preflight request can be cached. This translates to the content for the Access-Control-Max-Age header.
        """
        self._values = {
            'disabled': disabled,
        }
        if allow_credentials is not None: self._values["allow_credentials"] = allow_credentials
        if allow_headers is not None: self._values["allow_headers"] = allow_headers
        if allow_methods is not None: self._values["allow_methods"] = allow_methods
        if allow_origin_regexes is not None: self._values["allow_origin_regexes"] = allow_origin_regexes
        if allow_origins is not None: self._values["allow_origins"] = allow_origins
        if expose_headers is not None: self._values["expose_headers"] = expose_headers
        if max_age is not None: self._values["max_age"] = max_age

    @builtins.property
    def disabled(self) -> bool:
        """If true, specifies the CORS policy is disabled."""
        return self._values.get('disabled')

    @builtins.property
    def allow_credentials(self) -> typing.Optional[bool]:
        """In response to a preflight request, setting this to true indicates that the actual request can include user credentials.

        This translates to the Access-
        Control-Allow-Credentials header. Defaults to false.
        """
        return self._values.get('allow_credentials')

    @builtins.property
    def allow_headers(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Allow-Headers header."""
        return self._values.get('allow_headers')

    @builtins.property
    def allow_methods(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Allow-Methods header."""
        return self._values.get('allow_methods')

    @builtins.property
    def allow_origin_regexes(self) -> typing.Optional[typing.List[str]]:
        """Specifies the regualar expression patterns that match allowed origins.

        For
        regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript
        An origin is allowed if it matches either allow_origins or allow_origin_regex.
        """
        return self._values.get('allow_origin_regexes')

    @builtins.property
    def allow_origins(self) -> typing.Optional[typing.List[str]]:
        """Specifies the list of origins that will be allowed to do CORS requests.

        An
        origin is allowed if it matches either allow_origins or allow_origin_regex.
        """
        return self._values.get('allow_origins')

    @builtins.property
    def expose_headers(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Expose-Headers header."""
        return self._values.get('expose_headers')

    @builtins.property
    def max_age(self) -> typing.Optional[jsii.Number]:
        """Specifies how long the results of a preflight request can be cached.

        This
        translates to the content for the Access-Control-Max-Age header.
        """
        return self._values.get('max_age')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionCorsPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicy", jsii_struct_bases=[], name_mapping={'abort': 'abort', 'delay': 'delay'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicy():
    def __init__(self, *, abort: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbort"]]=None, delay: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelay"]]=None) -> None:
        """
        :param abort: abort block.
        :param delay: delay block.
        """
        self._values = {
        }
        if abort is not None: self._values["abort"] = abort
        if delay is not None: self._values["delay"] = delay

    @builtins.property
    def abort(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbort"]]:
        """abort block."""
        return self._values.get('abort')

    @builtins.property
    def delay(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelay"]]:
        """delay block."""
        return self._values.get('delay')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbort", jsii_struct_bases=[], name_mapping={'http_status': 'httpStatus', 'percentage': 'percentage'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbort():
    def __init__(self, *, http_status: jsii.Number, percentage: jsii.Number) -> None:
        """
        :param http_status: The HTTP status code used to abort the request. The value must be between 200 and 599 inclusive.
        :param percentage: The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection. The value must be between 0.0 and 100.0 inclusive.
        """
        self._values = {
            'http_status': http_status,
            'percentage': percentage,
        }

    @builtins.property
    def http_status(self) -> jsii.Number:
        """The HTTP status code used to abort the request.

        The value must be between 200
        and 599 inclusive.
        """
        return self._values.get('http_status')

    @builtins.property
    def percentage(self) -> jsii.Number:
        """The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection.

        The value must be between 0.0 and 100.0
        inclusive.
        """
        return self._values.get('percentage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbort(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelay", jsii_struct_bases=[], name_mapping={'fixed_delay': 'fixedDelay', 'percentage': 'percentage'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelay():
    def __init__(self, *, fixed_delay: typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelay"], percentage: jsii.Number) -> None:
        """
        :param fixed_delay: fixed_delay block.
        :param percentage: The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection. The value must be between 0.0 and 100.0 inclusive.
        """
        self._values = {
            'fixed_delay': fixed_delay,
            'percentage': percentage,
        }

    @builtins.property
    def fixed_delay(self) -> typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelay"]:
        """fixed_delay block."""
        return self._values.get('fixed_delay')

    @builtins.property
    def percentage(self) -> jsii.Number:
        """The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection.

        The value must be between 0.0 and
        100.0 inclusive.
        """
        return self._values.get('percentage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelay", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelay():
    def __init__(self, *, seconds: str, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> str:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicy", jsii_struct_bases=[], name_mapping={'backend_service': 'backendService'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicy():
    def __init__(self, *, backend_service: str) -> None:
        """
        :param backend_service: The RegionBackendService resource being mirrored to.
        """
        self._values = {
            'backend_service': backend_service,
        }

    @builtins.property
    def backend_service(self) -> str:
        """The RegionBackendService resource being mirrored to."""
        return self._values.get('backend_service')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionRetryPolicy", jsii_struct_bases=[], name_mapping={'num_retries': 'numRetries', 'per_try_timeout': 'perTryTimeout', 'retry_conditions': 'retryConditions'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionRetryPolicy():
    def __init__(self, *, num_retries: typing.Optional[jsii.Number]=None, per_try_timeout: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeout"]]=None, retry_conditions: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param num_retries: Specifies the allowed number retries. This number must be > 0.
        :param per_try_timeout: per_try_timeout block.
        :param retry_conditions: Specifies one or more conditions when this retry rule applies. Valid values are: - 5xx: Loadbalancer will attempt a retry if the backend service responds with any 5xx response code, or if the backend service does not respond at all, example: disconnects, reset, read timeout, connection failure, and refused streams. - gateway-error: Similar to 5xx, but only applies to response codes 502, 503 or 504. - connect-failure: Loadbalancer will retry on failures connecting to backend services, for example due to connection timeouts. - retriable-4xx: Loadbalancer will retry for retriable 4xx response codes. Currently the only retriable error supported is 409. - refused-stream: Loadbalancer will retry if the backend service resets the stream with a REFUSED_STREAM error code. This reset type indicates that it is safe to retry. - cancelled: Loadbalancer will retry if the gRPC status code in the response header is set to cancelled - deadline-exceeded: Loadbalancer will retry if the gRPC status code in the response header is set to deadline-exceeded - resource-exhausted: Loadbalancer will retry if the gRPC status code in the response header is set to resource-exhausted - unavailable: Loadbalancer will retry if the gRPC status code in the response header is set to unavailable
        """
        self._values = {
        }
        if num_retries is not None: self._values["num_retries"] = num_retries
        if per_try_timeout is not None: self._values["per_try_timeout"] = per_try_timeout
        if retry_conditions is not None: self._values["retry_conditions"] = retry_conditions

    @builtins.property
    def num_retries(self) -> typing.Optional[jsii.Number]:
        """Specifies the allowed number retries.

        This number must be > 0.
        """
        return self._values.get('num_retries')

    @builtins.property
    def per_try_timeout(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeout"]]:
        """per_try_timeout block."""
        return self._values.get('per_try_timeout')

    @builtins.property
    def retry_conditions(self) -> typing.Optional[typing.List[str]]:
        """Specifies one or more conditions when this retry rule applies.

        Valid values are:

        - 5xx: Loadbalancer will attempt a retry if the backend service responds with
          any 5xx response code, or if the backend service does not respond at all,
          example: disconnects, reset, read timeout, connection failure, and refused
          streams.
        - gateway-error: Similar to 5xx, but only applies to response codes
          502, 503 or 504.
        - connect-failure: Loadbalancer will retry on failures
          connecting to backend services, for example due to connection timeouts.
        - retriable-4xx: Loadbalancer will retry for retriable 4xx response codes.
          Currently the only retriable error supported is 409.
        - refused-stream: Loadbalancer will retry if the backend service resets the stream with a
          REFUSED_STREAM error code. This reset type indicates that it is safe to retry.
        - cancelled: Loadbalancer will retry if the gRPC status code in the response
          header is set to cancelled
        - deadline-exceeded: Loadbalancer will retry if the
          gRPC status code in the response header is set to deadline-exceeded
        - resource-exhausted: Loadbalancer will retry if the gRPC status code in the response
          header is set to resource-exhausted
        - unavailable: Loadbalancer will retry if
          the gRPC status code in the response header is set to unavailable
        """
        return self._values.get('retry_conditions')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionRetryPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeout", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeout():
    def __init__(self, *, seconds: str, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> str:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeout(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionTimeout", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionTimeout():
    def __init__(self, *, seconds: str, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> str:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionTimeout(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionUrlRewrite", jsii_struct_bases=[], name_mapping={'host_rewrite': 'hostRewrite', 'path_prefix_rewrite': 'pathPrefixRewrite'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionUrlRewrite():
    def __init__(self, *, host_rewrite: typing.Optional[str]=None, path_prefix_rewrite: typing.Optional[str]=None) -> None:
        """
        :param host_rewrite: Prior to forwarding the request to the selected service, the request's host header is replaced with contents of hostRewrite. The value must be between 1 and 255 characters.
        :param path_prefix_rewrite: Prior to forwarding the request to the selected backend service, the matching portion of the request's path is replaced by pathPrefixRewrite. The value must be between 1 and 1024 characters.
        """
        self._values = {
        }
        if host_rewrite is not None: self._values["host_rewrite"] = host_rewrite
        if path_prefix_rewrite is not None: self._values["path_prefix_rewrite"] = path_prefix_rewrite

    @builtins.property
    def host_rewrite(self) -> typing.Optional[str]:
        """Prior to forwarding the request to the selected service, the request's host header is replaced with contents of hostRewrite.

        The value must be between 1 and
        255 characters.
        """
        return self._values.get('host_rewrite')

    @builtins.property
    def path_prefix_rewrite(self) -> typing.Optional[str]:
        """Prior to forwarding the request to the selected backend service, the matching portion of the request's path is replaced by pathPrefixRewrite.

        The value must
        be between 1 and 1024 characters.
        """
        return self._values.get('path_prefix_rewrite')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionUrlRewrite(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServices", jsii_struct_bases=[], name_mapping={'backend_service': 'backendService', 'weight': 'weight', 'header_action': 'headerAction'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServices():
    def __init__(self, *, backend_service: str, weight: jsii.Number, header_action: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderAction"]]=None) -> None:
        """
        :param backend_service: The default RegionBackendService resource. Before forwarding the request to backendService, the loadbalancer applies any relevant headerActions specified as part of this backendServiceWeight.
        :param weight: Specifies the fraction of traffic sent to backendService, computed as weight / (sum of all weightedBackendService weights in routeAction) . The selection of a backend service is determined only for new traffic. Once a user's request has been directed to a backendService, subsequent requests will be sent to the same backendService as determined by the BackendService's session affinity policy. The value must be between 0 and 1000
        :param header_action: header_action block.
        """
        self._values = {
            'backend_service': backend_service,
            'weight': weight,
        }
        if header_action is not None: self._values["header_action"] = header_action

    @builtins.property
    def backend_service(self) -> str:
        """The default RegionBackendService resource.

        Before
        forwarding the request to backendService, the loadbalancer applies any relevant
        headerActions specified as part of this backendServiceWeight.
        """
        return self._values.get('backend_service')

    @builtins.property
    def weight(self) -> jsii.Number:
        """Specifies the fraction of traffic sent to backendService, computed as weight / (sum of all weightedBackendService weights in routeAction) .

        The selection of a
        backend service is determined only for new traffic. Once a user's request has
        been directed to a backendService, subsequent requests will be sent to the same
        backendService as determined by the BackendService's session affinity policy.
        The value must be between 0 and 1000
        """
        return self._values.get('weight')

    @builtins.property
    def header_action(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderAction"]]:
        """header_action block."""
        return self._values.get('header_action')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServices(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderAction", jsii_struct_bases=[], name_mapping={'request_headers_to_add': 'requestHeadersToAdd', 'request_headers_to_remove': 'requestHeadersToRemove', 'response_headers_to_add': 'responseHeadersToAdd', 'response_headers_to_remove': 'responseHeadersToRemove'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderAction():
    def __init__(self, *, request_headers_to_add: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd"]]=None, request_headers_to_remove: typing.Optional[typing.List[str]]=None, response_headers_to_add: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd"]]=None, response_headers_to_remove: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param request_headers_to_add: request_headers_to_add block.
        :param request_headers_to_remove: A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService.
        :param response_headers_to_add: response_headers_to_add block.
        :param response_headers_to_remove: A list of header names for headers that need to be removed from the response prior to sending the response back to the client.
        """
        self._values = {
        }
        if request_headers_to_add is not None: self._values["request_headers_to_add"] = request_headers_to_add
        if request_headers_to_remove is not None: self._values["request_headers_to_remove"] = request_headers_to_remove
        if response_headers_to_add is not None: self._values["response_headers_to_add"] = response_headers_to_add
        if response_headers_to_remove is not None: self._values["response_headers_to_remove"] = response_headers_to_remove

    @builtins.property
    def request_headers_to_add(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd"]]:
        """request_headers_to_add block."""
        return self._values.get('request_headers_to_add')

    @builtins.property
    def request_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService."""
        return self._values.get('request_headers_to_remove')

    @builtins.property
    def response_headers_to_add(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd"]]:
        """response_headers_to_add block."""
        return self._values.get('response_headers_to_add')

    @builtins.property
    def response_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the response prior to sending the response back to the client."""
        return self._values.get('response_headers_to_remove')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherPathRuleUrlRedirect", jsii_struct_bases=[], name_mapping={'strip_query': 'stripQuery', 'host_redirect': 'hostRedirect', 'https_redirect': 'httpsRedirect', 'path_redirect': 'pathRedirect', 'prefix_redirect': 'prefixRedirect', 'redirect_response_code': 'redirectResponseCode'})
class ComputeRegionUrlMapPathMatcherPathRuleUrlRedirect():
    def __init__(self, *, strip_query: bool, host_redirect: typing.Optional[str]=None, https_redirect: typing.Optional[bool]=None, path_redirect: typing.Optional[str]=None, prefix_redirect: typing.Optional[str]=None, redirect_response_code: typing.Optional[str]=None) -> None:
        """
        :param strip_query: If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request. If set to false, the query portion of the original URL is retained. This field is required to ensure an empty block is not set. The normal default value is false.
        :param host_redirect: The host that will be used in the redirect response instead of the one that was supplied in the request. The value must be between 1 and 255 characters.
        :param https_redirect: If set to true, the URL scheme in the redirected request is set to https. If set to false, the URL scheme of the redirected request will remain the same as that of the request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this true for TargetHttpsProxy is not permitted. The default is set to false.
        :param path_redirect: The path that will be used in the redirect response instead of the one that was supplied in the request. pathRedirect cannot be supplied together with prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param prefix_redirect: The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request. prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param redirect_response_code: The HTTP Status code to use for this RedirectAction. Supported values are:. MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301. FOUND, which corresponds to 302. SEE_OTHER which corresponds to 303. TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method will be retained. PERMANENT_REDIRECT, which corresponds to 308. In this case, the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        self._values = {
            'strip_query': strip_query,
        }
        if host_redirect is not None: self._values["host_redirect"] = host_redirect
        if https_redirect is not None: self._values["https_redirect"] = https_redirect
        if path_redirect is not None: self._values["path_redirect"] = path_redirect
        if prefix_redirect is not None: self._values["prefix_redirect"] = prefix_redirect
        if redirect_response_code is not None: self._values["redirect_response_code"] = redirect_response_code

    @builtins.property
    def strip_query(self) -> bool:
        """If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request.

        If set to false, the query portion of the
        original URL is retained.
        This field is required to ensure an empty block is not set. The normal default value is false.
        """
        return self._values.get('strip_query')

    @builtins.property
    def host_redirect(self) -> typing.Optional[str]:
        """The host that will be used in the redirect response instead of the one that was supplied in the request.

        The value must be between 1 and 255
        characters.
        """
        return self._values.get('host_redirect')

    @builtins.property
    def https_redirect(self) -> typing.Optional[bool]:
        """If set to true, the URL scheme in the redirected request is set to https.

        If set to false, the URL scheme of the redirected request will remain the
        same as that of the request. This must only be set for UrlMaps used in
        TargetHttpProxys. Setting this true for TargetHttpsProxy is not
        permitted. The default is set to false.
        """
        return self._values.get('https_redirect')

    @builtins.property
    def path_redirect(self) -> typing.Optional[str]:
        """The path that will be used in the redirect response instead of the one that was supplied in the request.

        pathRedirect cannot be supplied
        together with prefixRedirect. Supply one alone or neither. If neither is
        supplied, the path of the original request will be used for the redirect.
        The value must be between 1 and 1024 characters.
        """
        return self._values.get('path_redirect')

    @builtins.property
    def prefix_redirect(self) -> typing.Optional[str]:
        """The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request.

        prefixRedirect cannot be supplied together with
        pathRedirect. Supply one alone or neither. If neither is supplied, the
        path of the original request will be used for the redirect. The value
        must be between 1 and 1024 characters.
        """
        return self._values.get('prefix_redirect')

    @builtins.property
    def redirect_response_code(self) -> typing.Optional[str]:
        """The HTTP Status code to use for this RedirectAction. Supported values are:.

        MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301.

        FOUND, which corresponds to 302.

        SEE_OTHER which corresponds to 303.

        TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method
        will be retained.

        PERMANENT_REDIRECT, which corresponds to 308. In this case,
        the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        return self._values.get('redirect_response_code')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherPathRuleUrlRedirect(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRules", jsii_struct_bases=[], name_mapping={'priority': 'priority', 'header_action': 'headerAction', 'match_rules': 'matchRules', 'route_action': 'routeAction', 'service': 'service', 'url_redirect': 'urlRedirect'})
class ComputeRegionUrlMapPathMatcherRouteRules():
    def __init__(self, *, priority: jsii.Number, header_action: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesHeaderAction"]]=None, match_rules: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesMatchRules"]]=None, route_action: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteAction"]]=None, service: typing.Optional[str]=None, url_redirect: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesUrlRedirect"]]=None) -> None:
        """
        :param priority: For routeRules within a given pathMatcher, priority determines the order in which load balancer will interpret routeRules. RouteRules are evaluated in order of priority, from the lowest to highest number. The priority of a rule decreases as its number increases (1, 2, 3, N+1). The first rule that matches the request is applied. You cannot configure two or more routeRules with the same priority. Priority for each rule must be set to a number between 0 and 2147483647 inclusive. Priority numbers can have gaps, which enable you to add or remove rules in the future without affecting the rest of the rules. For example, 1, 2, 3, 4, 5, 9, 12, 16 is a valid series of priority numbers to which you could add rules numbered from 6 to 8, 10 to 11, and 13 to 15 in the future without any impact on existing rules.
        :param header_action: header_action block.
        :param match_rules: match_rules block.
        :param route_action: route_action block.
        :param service: The region backend service resource to which traffic is directed if this rule is matched. If routeAction is additionally specified, advanced routing actions like URL Rewrites, etc. take effect prior to sending the request to the backend. However, if service is specified, routeAction cannot contain any weightedBackendService s. Conversely, if routeAction specifies any weightedBackendServices, service must not be specified. Only one of urlRedirect, service or routeAction.weightedBackendService must be set.
        :param url_redirect: url_redirect block.
        """
        self._values = {
            'priority': priority,
        }
        if header_action is not None: self._values["header_action"] = header_action
        if match_rules is not None: self._values["match_rules"] = match_rules
        if route_action is not None: self._values["route_action"] = route_action
        if service is not None: self._values["service"] = service
        if url_redirect is not None: self._values["url_redirect"] = url_redirect

    @builtins.property
    def priority(self) -> jsii.Number:
        """For routeRules within a given pathMatcher, priority determines the order in which load balancer will interpret routeRules.

        RouteRules are evaluated
        in order of priority, from the lowest to highest number. The priority of
        a rule decreases as its number increases (1, 2, 3, N+1). The first rule
        that matches the request is applied.

        You cannot configure two or more routeRules with the same priority.
        Priority for each rule must be set to a number between 0 and
        2147483647 inclusive.

        Priority numbers can have gaps, which enable you to add or remove rules
        in the future without affecting the rest of the rules. For example,
        1, 2, 3, 4, 5, 9, 12, 16 is a valid series of priority numbers to which
        you could add rules numbered from 6 to 8, 10 to 11, and 13 to 15 in the
        future without any impact on existing rules.
        """
        return self._values.get('priority')

    @builtins.property
    def header_action(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesHeaderAction"]]:
        """header_action block."""
        return self._values.get('header_action')

    @builtins.property
    def match_rules(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesMatchRules"]]:
        """match_rules block."""
        return self._values.get('match_rules')

    @builtins.property
    def route_action(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteAction"]]:
        """route_action block."""
        return self._values.get('route_action')

    @builtins.property
    def service(self) -> typing.Optional[str]:
        """The region backend service resource to which traffic is directed if this rule is matched.

        If routeAction is additionally specified,
        advanced routing actions like URL Rewrites, etc. take effect prior to sending
        the request to the backend. However, if service is specified, routeAction cannot
        contain any weightedBackendService s. Conversely, if routeAction specifies any
        weightedBackendServices, service must not be specified. Only one of urlRedirect,
        service or routeAction.weightedBackendService must be set.
        """
        return self._values.get('service')

    @builtins.property
    def url_redirect(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesUrlRedirect"]]:
        """url_redirect block."""
        return self._values.get('url_redirect')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRules(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesHeaderAction", jsii_struct_bases=[], name_mapping={'request_headers_to_add': 'requestHeadersToAdd', 'request_headers_to_remove': 'requestHeadersToRemove', 'response_headers_to_add': 'responseHeadersToAdd', 'response_headers_to_remove': 'responseHeadersToRemove'})
class ComputeRegionUrlMapPathMatcherRouteRulesHeaderAction():
    def __init__(self, *, request_headers_to_add: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesHeaderActionRequestHeadersToAdd"]]=None, request_headers_to_remove: typing.Optional[typing.List[str]]=None, response_headers_to_add: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesHeaderActionResponseHeadersToAdd"]]=None, response_headers_to_remove: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param request_headers_to_add: request_headers_to_add block.
        :param request_headers_to_remove: A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService.
        :param response_headers_to_add: response_headers_to_add block.
        :param response_headers_to_remove: A list of header names for headers that need to be removed from the response prior to sending the response back to the client.
        """
        self._values = {
        }
        if request_headers_to_add is not None: self._values["request_headers_to_add"] = request_headers_to_add
        if request_headers_to_remove is not None: self._values["request_headers_to_remove"] = request_headers_to_remove
        if response_headers_to_add is not None: self._values["response_headers_to_add"] = response_headers_to_add
        if response_headers_to_remove is not None: self._values["response_headers_to_remove"] = response_headers_to_remove

    @builtins.property
    def request_headers_to_add(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesHeaderActionRequestHeadersToAdd"]]:
        """request_headers_to_add block."""
        return self._values.get('request_headers_to_add')

    @builtins.property
    def request_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService."""
        return self._values.get('request_headers_to_remove')

    @builtins.property
    def response_headers_to_add(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesHeaderActionResponseHeadersToAdd"]]:
        """response_headers_to_add block."""
        return self._values.get('response_headers_to_add')

    @builtins.property
    def response_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the response prior to sending the response back to the client."""
        return self._values.get('response_headers_to_remove')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesHeaderAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesHeaderActionRequestHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeRegionUrlMapPathMatcherRouteRulesHeaderActionRequestHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesHeaderActionRequestHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesHeaderActionResponseHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeRegionUrlMapPathMatcherRouteRulesHeaderActionResponseHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesHeaderActionResponseHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesMatchRules", jsii_struct_bases=[], name_mapping={'full_path_match': 'fullPathMatch', 'header_matches': 'headerMatches', 'ignore_case': 'ignoreCase', 'metadata_filters': 'metadataFilters', 'prefix_match': 'prefixMatch', 'query_parameter_matches': 'queryParameterMatches', 'regex_match': 'regexMatch'})
class ComputeRegionUrlMapPathMatcherRouteRulesMatchRules():
    def __init__(self, *, full_path_match: typing.Optional[str]=None, header_matches: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesHeaderMatches"]]=None, ignore_case: typing.Optional[bool]=None, metadata_filters: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesMetadataFilters"]]=None, prefix_match: typing.Optional[str]=None, query_parameter_matches: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesQueryParameterMatches"]]=None, regex_match: typing.Optional[str]=None) -> None:
        """
        :param full_path_match: For satifying the matchRule condition, the path of the request must exactly match the value specified in fullPathMatch after removing any query parameters and anchor that may be part of the original URL. FullPathMatch must be between 1 and 1024 characters. Only one of prefixMatch, fullPathMatch or regexMatch must be specified.
        :param header_matches: header_matches block.
        :param ignore_case: Specifies that prefixMatch and fullPathMatch matches are case sensitive. Defaults to false.
        :param metadata_filters: metadata_filters block.
        :param prefix_match: For satifying the matchRule condition, the request's path must begin with the specified prefixMatch. prefixMatch must begin with a /. The value must be between 1 and 1024 characters. Only one of prefixMatch, fullPathMatch or regexMatch must be specified.
        :param query_parameter_matches: query_parameter_matches block.
        :param regex_match: For satifying the matchRule condition, the path of the request must satisfy the regular expression specified in regexMatch after removing any query parameters and anchor supplied with the original URL. For regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript Only one of prefixMatch, fullPathMatch or regexMatch must be specified.
        """
        self._values = {
        }
        if full_path_match is not None: self._values["full_path_match"] = full_path_match
        if header_matches is not None: self._values["header_matches"] = header_matches
        if ignore_case is not None: self._values["ignore_case"] = ignore_case
        if metadata_filters is not None: self._values["metadata_filters"] = metadata_filters
        if prefix_match is not None: self._values["prefix_match"] = prefix_match
        if query_parameter_matches is not None: self._values["query_parameter_matches"] = query_parameter_matches
        if regex_match is not None: self._values["regex_match"] = regex_match

    @builtins.property
    def full_path_match(self) -> typing.Optional[str]:
        """For satifying the matchRule condition, the path of the request must exactly match the value specified in fullPathMatch after removing any query parameters and anchor that may be part of the original URL.

        FullPathMatch must be between 1
        and 1024 characters. Only one of prefixMatch, fullPathMatch or regexMatch must
        be specified.
        """
        return self._values.get('full_path_match')

    @builtins.property
    def header_matches(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesHeaderMatches"]]:
        """header_matches block."""
        return self._values.get('header_matches')

    @builtins.property
    def ignore_case(self) -> typing.Optional[bool]:
        """Specifies that prefixMatch and fullPathMatch matches are case sensitive.

        Defaults to false.
        """
        return self._values.get('ignore_case')

    @builtins.property
    def metadata_filters(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesMetadataFilters"]]:
        """metadata_filters block."""
        return self._values.get('metadata_filters')

    @builtins.property
    def prefix_match(self) -> typing.Optional[str]:
        """For satifying the matchRule condition, the request's path must begin with the specified prefixMatch.

        prefixMatch must begin with a /. The value must be
        between 1 and 1024 characters. Only one of prefixMatch, fullPathMatch or
        regexMatch must be specified.
        """
        return self._values.get('prefix_match')

    @builtins.property
    def query_parameter_matches(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesQueryParameterMatches"]]:
        """query_parameter_matches block."""
        return self._values.get('query_parameter_matches')

    @builtins.property
    def regex_match(self) -> typing.Optional[str]:
        """For satifying the matchRule condition, the path of the request must satisfy the regular expression specified in regexMatch after removing any query parameters and anchor supplied with the original URL.

        For regular expression grammar please
        see en.cppreference.com/w/cpp/regex/ecmascript  Only one of prefixMatch,
        fullPathMatch or regexMatch must be specified.
        """
        return self._values.get('regex_match')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesMatchRules(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesHeaderMatches", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'exact_match': 'exactMatch', 'invert_match': 'invertMatch', 'prefix_match': 'prefixMatch', 'present_match': 'presentMatch', 'range_match': 'rangeMatch', 'regex_match': 'regexMatch', 'suffix_match': 'suffixMatch'})
class ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesHeaderMatches():
    def __init__(self, *, header_name: str, exact_match: typing.Optional[str]=None, invert_match: typing.Optional[bool]=None, prefix_match: typing.Optional[str]=None, present_match: typing.Optional[bool]=None, range_match: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesHeaderMatchesRangeMatch"]]=None, regex_match: typing.Optional[str]=None, suffix_match: typing.Optional[str]=None) -> None:
        """
        :param header_name: The name of the HTTP header to match. For matching against the HTTP request's authority, use a headerMatch with the header name ":authority". For matching a request's method, use the headerName ":method".
        :param exact_match: The value should exactly match contents of exactMatch. Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        :param invert_match: If set to false, the headerMatch is considered a match if the match criteria above are met. If set to true, the headerMatch is considered a match if the match criteria above are NOT met. Defaults to false.
        :param prefix_match: The value of the header must start with the contents of prefixMatch. Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        :param present_match: A header with the contents of headerName must exist. The match takes place whether or not the request's header has a value or not. Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        :param range_match: range_match block.
        :param regex_match: The value of the header must match the regualar expression specified in regexMatch. For regular expression grammar, please see: en.cppreference.com/w/cpp/regex/ecmascript For matching against a port specified in the HTTP request, use a headerMatch with headerName set to PORT and a regular expression that satisfies the RFC2616 Host header's port specifier. Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        :param suffix_match: The value of the header must end with the contents of suffixMatch. Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        """
        self._values = {
            'header_name': header_name,
        }
        if exact_match is not None: self._values["exact_match"] = exact_match
        if invert_match is not None: self._values["invert_match"] = invert_match
        if prefix_match is not None: self._values["prefix_match"] = prefix_match
        if present_match is not None: self._values["present_match"] = present_match
        if range_match is not None: self._values["range_match"] = range_match
        if regex_match is not None: self._values["regex_match"] = regex_match
        if suffix_match is not None: self._values["suffix_match"] = suffix_match

    @builtins.property
    def header_name(self) -> str:
        """The name of the HTTP header to match.

        For matching against the HTTP request's
        authority, use a headerMatch with the header name ":authority". For matching a
        request's method, use the headerName ":method".
        """
        return self._values.get('header_name')

    @builtins.property
    def exact_match(self) -> typing.Optional[str]:
        """The value should exactly match contents of exactMatch.

        Only one of exactMatch,
        prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        """
        return self._values.get('exact_match')

    @builtins.property
    def invert_match(self) -> typing.Optional[bool]:
        """If set to false, the headerMatch is considered a match if the match criteria above are met.

        If set to true, the headerMatch is considered a match if the
        match criteria above are NOT met. Defaults to false.
        """
        return self._values.get('invert_match')

    @builtins.property
    def prefix_match(self) -> typing.Optional[str]:
        """The value of the header must start with the contents of prefixMatch.

        Only one of
        exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch
        must be set.
        """
        return self._values.get('prefix_match')

    @builtins.property
    def present_match(self) -> typing.Optional[bool]:
        """A header with the contents of headerName must exist.

        The match takes place
        whether or not the request's header has a value or not. Only one of exactMatch,
        prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        """
        return self._values.get('present_match')

    @builtins.property
    def range_match(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesHeaderMatchesRangeMatch"]]:
        """range_match block."""
        return self._values.get('range_match')

    @builtins.property
    def regex_match(self) -> typing.Optional[str]:
        """The value of the header must match the regualar expression specified in regexMatch.

        For regular expression grammar, please see:
        en.cppreference.com/w/cpp/regex/ecmascript  For matching against a port
        specified in the HTTP request, use a headerMatch with headerName set to PORT and
        a regular expression that satisfies the RFC2616 Host header's port specifier.
        Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or
        rangeMatch must be set.
        """
        return self._values.get('regex_match')

    @builtins.property
    def suffix_match(self) -> typing.Optional[str]:
        """The value of the header must end with the contents of suffixMatch.

        Only one of
        exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch
        must be set.
        """
        return self._values.get('suffix_match')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesHeaderMatches(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesHeaderMatchesRangeMatch", jsii_struct_bases=[], name_mapping={'range_end': 'rangeEnd', 'range_start': 'rangeStart'})
class ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesHeaderMatchesRangeMatch():
    def __init__(self, *, range_end: jsii.Number, range_start: jsii.Number) -> None:
        """
        :param range_end: The end of the range (exclusive).
        :param range_start: The start of the range (inclusive).
        """
        self._values = {
            'range_end': range_end,
            'range_start': range_start,
        }

    @builtins.property
    def range_end(self) -> jsii.Number:
        """The end of the range (exclusive)."""
        return self._values.get('range_end')

    @builtins.property
    def range_start(self) -> jsii.Number:
        """The start of the range (inclusive)."""
        return self._values.get('range_start')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesHeaderMatchesRangeMatch(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesMetadataFilters", jsii_struct_bases=[], name_mapping={'filter_labels': 'filterLabels', 'filter_match_criteria': 'filterMatchCriteria'})
class ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesMetadataFilters():
    def __init__(self, *, filter_labels: typing.List["ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesMetadataFiltersFilterLabels"], filter_match_criteria: str) -> None:
        """
        :param filter_labels: filter_labels block.
        :param filter_match_criteria: Specifies how individual filterLabel matches within the list of filterLabels contribute towards the overall metadataFilter match. Supported values are: - MATCH_ANY: At least one of the filterLabels must have a matching label in the provided metadata. - MATCH_ALL: All filterLabels must have matching labels in the provided metadata. Possible values: ["MATCH_ALL", "MATCH_ANY"]
        """
        self._values = {
            'filter_labels': filter_labels,
            'filter_match_criteria': filter_match_criteria,
        }

    @builtins.property
    def filter_labels(self) -> typing.List["ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesMetadataFiltersFilterLabels"]:
        """filter_labels block."""
        return self._values.get('filter_labels')

    @builtins.property
    def filter_match_criteria(self) -> str:
        """Specifies how individual filterLabel matches within the list of filterLabels contribute towards the overall metadataFilter match.

        Supported values are:

        - MATCH_ANY: At least one of the filterLabels must have a matching label in the
          provided metadata.
        - MATCH_ALL: All filterLabels must have matching labels in
          the provided metadata. Possible values: ["MATCH_ALL", "MATCH_ANY"]
        """
        return self._values.get('filter_match_criteria')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesMetadataFilters(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesMetadataFiltersFilterLabels", jsii_struct_bases=[], name_mapping={'name': 'name', 'value': 'value'})
class ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesMetadataFiltersFilterLabels():
    def __init__(self, *, name: str, value: str) -> None:
        """
        :param name: Name of metadata label. The name can have a maximum length of 1024 characters and must be at least 1 character long.
        :param value: The value of the label must match the specified value. value can have a maximum length of 1024 characters.
        """
        self._values = {
            'name': name,
            'value': value,
        }

    @builtins.property
    def name(self) -> str:
        """Name of metadata label.

        The name can have a maximum length of 1024 characters
        and must be at least 1 character long.
        """
        return self._values.get('name')

    @builtins.property
    def value(self) -> str:
        """The value of the label must match the specified value.

        value can have a maximum
        length of 1024 characters.
        """
        return self._values.get('value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesMetadataFiltersFilterLabels(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesQueryParameterMatches", jsii_struct_bases=[], name_mapping={'name': 'name', 'exact_match': 'exactMatch', 'present_match': 'presentMatch', 'regex_match': 'regexMatch'})
class ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesQueryParameterMatches():
    def __init__(self, *, name: str, exact_match: typing.Optional[str]=None, present_match: typing.Optional[bool]=None, regex_match: typing.Optional[str]=None) -> None:
        """
        :param name: The name of the query parameter to match. The query parameter must exist in the request, in the absence of which the request match fails.
        :param exact_match: The queryParameterMatch matches if the value of the parameter exactly matches the contents of exactMatch. Only one of presentMatch, exactMatch and regexMatch must be set.
        :param present_match: Specifies that the queryParameterMatch matches if the request contains the query parameter, irrespective of whether the parameter has a value or not. Only one of presentMatch, exactMatch and regexMatch must be set.
        :param regex_match: The queryParameterMatch matches if the value of the parameter matches the regular expression specified by regexMatch. For the regular expression grammar, please see en.cppreference.com/w/cpp/regex/ecmascript Only one of presentMatch, exactMatch and regexMatch must be set.
        """
        self._values = {
            'name': name,
        }
        if exact_match is not None: self._values["exact_match"] = exact_match
        if present_match is not None: self._values["present_match"] = present_match
        if regex_match is not None: self._values["regex_match"] = regex_match

    @builtins.property
    def name(self) -> str:
        """The name of the query parameter to match.

        The query parameter must exist in the
        request, in the absence of which the request match fails.
        """
        return self._values.get('name')

    @builtins.property
    def exact_match(self) -> typing.Optional[str]:
        """The queryParameterMatch matches if the value of the parameter exactly matches the contents of exactMatch.

        Only one of presentMatch, exactMatch and regexMatch
        must be set.
        """
        return self._values.get('exact_match')

    @builtins.property
    def present_match(self) -> typing.Optional[bool]:
        """Specifies that the queryParameterMatch matches if the request contains the query parameter, irrespective of whether the parameter has a value or not.

        Only one of
        presentMatch, exactMatch and regexMatch must be set.
        """
        return self._values.get('present_match')

    @builtins.property
    def regex_match(self) -> typing.Optional[str]:
        """The queryParameterMatch matches if the value of the parameter matches the regular expression specified by regexMatch.

        For the regular expression grammar,
        please see en.cppreference.com/w/cpp/regex/ecmascript  Only one of presentMatch,
        exactMatch and regexMatch must be set.
        """
        return self._values.get('regex_match')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesQueryParameterMatches(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteAction", jsii_struct_bases=[], name_mapping={'cors_policy': 'corsPolicy', 'fault_injection_policy': 'faultInjectionPolicy', 'request_mirror_policy': 'requestMirrorPolicy', 'retry_policy': 'retryPolicy', 'timeout': 'timeout', 'url_rewrite': 'urlRewrite', 'weighted_backend_services': 'weightedBackendServices'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteAction():
    def __init__(self, *, cors_policy: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionCorsPolicy"]]=None, fault_injection_policy: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicy"]]=None, request_mirror_policy: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRequestMirrorPolicy"]]=None, retry_policy: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRetryPolicy"]]=None, timeout: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionTimeout"]]=None, url_rewrite: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionUrlRewrite"]]=None, weighted_backend_services: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServices"]]=None) -> None:
        """
        :param cors_policy: cors_policy block.
        :param fault_injection_policy: fault_injection_policy block.
        :param request_mirror_policy: request_mirror_policy block.
        :param retry_policy: retry_policy block.
        :param timeout: timeout block.
        :param url_rewrite: url_rewrite block.
        :param weighted_backend_services: weighted_backend_services block.
        """
        self._values = {
        }
        if cors_policy is not None: self._values["cors_policy"] = cors_policy
        if fault_injection_policy is not None: self._values["fault_injection_policy"] = fault_injection_policy
        if request_mirror_policy is not None: self._values["request_mirror_policy"] = request_mirror_policy
        if retry_policy is not None: self._values["retry_policy"] = retry_policy
        if timeout is not None: self._values["timeout"] = timeout
        if url_rewrite is not None: self._values["url_rewrite"] = url_rewrite
        if weighted_backend_services is not None: self._values["weighted_backend_services"] = weighted_backend_services

    @builtins.property
    def cors_policy(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionCorsPolicy"]]:
        """cors_policy block."""
        return self._values.get('cors_policy')

    @builtins.property
    def fault_injection_policy(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicy"]]:
        """fault_injection_policy block."""
        return self._values.get('fault_injection_policy')

    @builtins.property
    def request_mirror_policy(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRequestMirrorPolicy"]]:
        """request_mirror_policy block."""
        return self._values.get('request_mirror_policy')

    @builtins.property
    def retry_policy(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRetryPolicy"]]:
        """retry_policy block."""
        return self._values.get('retry_policy')

    @builtins.property
    def timeout(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionTimeout"]]:
        """timeout block."""
        return self._values.get('timeout')

    @builtins.property
    def url_rewrite(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionUrlRewrite"]]:
        """url_rewrite block."""
        return self._values.get('url_rewrite')

    @builtins.property
    def weighted_backend_services(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServices"]]:
        """weighted_backend_services block."""
        return self._values.get('weighted_backend_services')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionCorsPolicy", jsii_struct_bases=[], name_mapping={'allow_credentials': 'allowCredentials', 'allow_headers': 'allowHeaders', 'allow_methods': 'allowMethods', 'allow_origin_regexes': 'allowOriginRegexes', 'allow_origins': 'allowOrigins', 'disabled': 'disabled', 'expose_headers': 'exposeHeaders', 'max_age': 'maxAge'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionCorsPolicy():
    def __init__(self, *, allow_credentials: typing.Optional[bool]=None, allow_headers: typing.Optional[typing.List[str]]=None, allow_methods: typing.Optional[typing.List[str]]=None, allow_origin_regexes: typing.Optional[typing.List[str]]=None, allow_origins: typing.Optional[typing.List[str]]=None, disabled: typing.Optional[bool]=None, expose_headers: typing.Optional[typing.List[str]]=None, max_age: typing.Optional[jsii.Number]=None) -> None:
        """
        :param allow_credentials: In response to a preflight request, setting this to true indicates that the actual request can include user credentials. This translates to the Access- Control-Allow-Credentials header. Defaults to false.
        :param allow_headers: Specifies the content for the Access-Control-Allow-Headers header.
        :param allow_methods: Specifies the content for the Access-Control-Allow-Methods header.
        :param allow_origin_regexes: Specifies the regualar expression patterns that match allowed origins. For regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript An origin is allowed if it matches either allow_origins or allow_origin_regex.
        :param allow_origins: Specifies the list of origins that will be allowed to do CORS requests. An origin is allowed if it matches either allow_origins or allow_origin_regex.
        :param disabled: If true, specifies the CORS policy is disabled. which indicates that the CORS policy is in effect. Defaults to false.
        :param expose_headers: Specifies the content for the Access-Control-Expose-Headers header.
        :param max_age: Specifies how long the results of a preflight request can be cached. This translates to the content for the Access-Control-Max-Age header.
        """
        self._values = {
        }
        if allow_credentials is not None: self._values["allow_credentials"] = allow_credentials
        if allow_headers is not None: self._values["allow_headers"] = allow_headers
        if allow_methods is not None: self._values["allow_methods"] = allow_methods
        if allow_origin_regexes is not None: self._values["allow_origin_regexes"] = allow_origin_regexes
        if allow_origins is not None: self._values["allow_origins"] = allow_origins
        if disabled is not None: self._values["disabled"] = disabled
        if expose_headers is not None: self._values["expose_headers"] = expose_headers
        if max_age is not None: self._values["max_age"] = max_age

    @builtins.property
    def allow_credentials(self) -> typing.Optional[bool]:
        """In response to a preflight request, setting this to true indicates that the actual request can include user credentials.

        This translates to the Access-
        Control-Allow-Credentials header. Defaults to false.
        """
        return self._values.get('allow_credentials')

    @builtins.property
    def allow_headers(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Allow-Headers header."""
        return self._values.get('allow_headers')

    @builtins.property
    def allow_methods(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Allow-Methods header."""
        return self._values.get('allow_methods')

    @builtins.property
    def allow_origin_regexes(self) -> typing.Optional[typing.List[str]]:
        """Specifies the regualar expression patterns that match allowed origins.

        For
        regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript
        An origin is allowed if it matches either allow_origins or allow_origin_regex.
        """
        return self._values.get('allow_origin_regexes')

    @builtins.property
    def allow_origins(self) -> typing.Optional[typing.List[str]]:
        """Specifies the list of origins that will be allowed to do CORS requests.

        An
        origin is allowed if it matches either allow_origins or allow_origin_regex.
        """
        return self._values.get('allow_origins')

    @builtins.property
    def disabled(self) -> typing.Optional[bool]:
        """If true, specifies the CORS policy is disabled.

        which indicates that the CORS policy is in effect. Defaults to false.
        """
        return self._values.get('disabled')

    @builtins.property
    def expose_headers(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Expose-Headers header."""
        return self._values.get('expose_headers')

    @builtins.property
    def max_age(self) -> typing.Optional[jsii.Number]:
        """Specifies how long the results of a preflight request can be cached.

        This
        translates to the content for the Access-Control-Max-Age header.
        """
        return self._values.get('max_age')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionCorsPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicy", jsii_struct_bases=[], name_mapping={'abort': 'abort', 'delay': 'delay'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicy():
    def __init__(self, *, abort: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyAbort"]]=None, delay: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelay"]]=None) -> None:
        """
        :param abort: abort block.
        :param delay: delay block.
        """
        self._values = {
        }
        if abort is not None: self._values["abort"] = abort
        if delay is not None: self._values["delay"] = delay

    @builtins.property
    def abort(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyAbort"]]:
        """abort block."""
        return self._values.get('abort')

    @builtins.property
    def delay(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelay"]]:
        """delay block."""
        return self._values.get('delay')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyAbort", jsii_struct_bases=[], name_mapping={'http_status': 'httpStatus', 'percentage': 'percentage'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyAbort():
    def __init__(self, *, http_status: typing.Optional[jsii.Number]=None, percentage: typing.Optional[jsii.Number]=None) -> None:
        """
        :param http_status: The HTTP status code used to abort the request. The value must be between 200 and 599 inclusive.
        :param percentage: The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection. The value must be between 0.0 and 100.0 inclusive.
        """
        self._values = {
        }
        if http_status is not None: self._values["http_status"] = http_status
        if percentage is not None: self._values["percentage"] = percentage

    @builtins.property
    def http_status(self) -> typing.Optional[jsii.Number]:
        """The HTTP status code used to abort the request.

        The value must be between 200
        and 599 inclusive.
        """
        return self._values.get('http_status')

    @builtins.property
    def percentage(self) -> typing.Optional[jsii.Number]:
        """The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection.

        The value must be between 0.0 and 100.0
        inclusive.
        """
        return self._values.get('percentage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyAbort(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelay", jsii_struct_bases=[], name_mapping={'fixed_delay': 'fixedDelay', 'percentage': 'percentage'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelay():
    def __init__(self, *, fixed_delay: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelayFixedDelay"]]=None, percentage: typing.Optional[jsii.Number]=None) -> None:
        """
        :param fixed_delay: fixed_delay block.
        :param percentage: The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection. The value must be between 0.0 and 100.0 inclusive.
        """
        self._values = {
        }
        if fixed_delay is not None: self._values["fixed_delay"] = fixed_delay
        if percentage is not None: self._values["percentage"] = percentage

    @builtins.property
    def fixed_delay(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelayFixedDelay"]]:
        """fixed_delay block."""
        return self._values.get('fixed_delay')

    @builtins.property
    def percentage(self) -> typing.Optional[jsii.Number]:
        """The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection.

        The value must be between 0.0 and
        100.0 inclusive.
        """
        return self._values.get('percentage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelayFixedDelay", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelayFixedDelay():
    def __init__(self, *, seconds: str, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> str:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelayFixedDelay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRequestMirrorPolicy", jsii_struct_bases=[], name_mapping={'backend_service': 'backendService'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRequestMirrorPolicy():
    def __init__(self, *, backend_service: str) -> None:
        """
        :param backend_service: The RegionBackendService resource being mirrored to.
        """
        self._values = {
            'backend_service': backend_service,
        }

    @builtins.property
    def backend_service(self) -> str:
        """The RegionBackendService resource being mirrored to."""
        return self._values.get('backend_service')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRequestMirrorPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRetryPolicy", jsii_struct_bases=[], name_mapping={'num_retries': 'numRetries', 'per_try_timeout': 'perTryTimeout', 'retry_conditions': 'retryConditions'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRetryPolicy():
    def __init__(self, *, num_retries: jsii.Number, per_try_timeout: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRetryPolicyPerTryTimeout"]]=None, retry_conditions: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param num_retries: Specifies the allowed number retries. This number must be > 0.
        :param per_try_timeout: per_try_timeout block.
        :param retry_conditions: Specfies one or more conditions when this retry rule applies. Valid values are: - 5xx: Loadbalancer will attempt a retry if the backend service responds with any 5xx response code, or if the backend service does not respond at all, example: disconnects, reset, read timeout, connection failure, and refused streams. - gateway-error: Similar to 5xx, but only applies to response codes 502, 503 or 504. - connect-failure: Loadbalancer will retry on failures connecting to backend services, for example due to connection timeouts. - retriable-4xx: Loadbalancer will retry for retriable 4xx response codes. Currently the only retriable error supported is 409. - refused-stream: Loadbalancer will retry if the backend service resets the stream with a REFUSED_STREAM error code. This reset type indicates that it is safe to retry. - cancelled: Loadbalancer will retry if the gRPC status code in the response header is set to cancelled - deadline-exceeded: Loadbalancer will retry if the gRPC status code in the response header is set to deadline-exceeded - resource-exhausted: Loadbalancer will retry if the gRPC status code in the response header is set to resource-exhausted - unavailable: Loadbalancer will retry if the gRPC status code in the response header is set to unavailable
        """
        self._values = {
            'num_retries': num_retries,
        }
        if per_try_timeout is not None: self._values["per_try_timeout"] = per_try_timeout
        if retry_conditions is not None: self._values["retry_conditions"] = retry_conditions

    @builtins.property
    def num_retries(self) -> jsii.Number:
        """Specifies the allowed number retries.

        This number must be > 0.
        """
        return self._values.get('num_retries')

    @builtins.property
    def per_try_timeout(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRetryPolicyPerTryTimeout"]]:
        """per_try_timeout block."""
        return self._values.get('per_try_timeout')

    @builtins.property
    def retry_conditions(self) -> typing.Optional[typing.List[str]]:
        """Specfies one or more conditions when this retry rule applies.

        Valid values are:

        - 5xx: Loadbalancer will attempt a retry if the backend service responds with
          any 5xx response code, or if the backend service does not respond at all,
          example: disconnects, reset, read timeout, connection failure, and refused
          streams.
        - gateway-error: Similar to 5xx, but only applies to response codes
          502, 503 or 504.
        - connect-failure: Loadbalancer will retry on failures
          connecting to backend services, for example due to connection timeouts.
        - retriable-4xx: Loadbalancer will retry for retriable 4xx response codes.
          Currently the only retriable error supported is 409.
        - refused-stream: Loadbalancer will retry if the backend service resets the stream with a
          REFUSED_STREAM error code. This reset type indicates that it is safe to retry.
        - cancelled: Loadbalancer will retry if the gRPC status code in the response
          header is set to cancelled
        - deadline-exceeded: Loadbalancer will retry if the
          gRPC status code in the response header is set to deadline-exceeded
        - resource-exhausted: Loadbalancer will retry if the gRPC status code in the response
          header is set to resource-exhausted
        - unavailable: Loadbalancer will retry if the gRPC status code in
          the response header is set to unavailable
        """
        return self._values.get('retry_conditions')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRetryPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRetryPolicyPerTryTimeout", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRetryPolicyPerTryTimeout():
    def __init__(self, *, seconds: str, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> str:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRetryPolicyPerTryTimeout(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionTimeout", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionTimeout():
    def __init__(self, *, seconds: str, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> str:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionTimeout(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionUrlRewrite", jsii_struct_bases=[], name_mapping={'host_rewrite': 'hostRewrite', 'path_prefix_rewrite': 'pathPrefixRewrite'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionUrlRewrite():
    def __init__(self, *, host_rewrite: typing.Optional[str]=None, path_prefix_rewrite: typing.Optional[str]=None) -> None:
        """
        :param host_rewrite: Prior to forwarding the request to the selected service, the request's host header is replaced with contents of hostRewrite. The value must be between 1 and 255 characters.
        :param path_prefix_rewrite: Prior to forwarding the request to the selected backend service, the matching portion of the request's path is replaced by pathPrefixRewrite. The value must be between 1 and 1024 characters.
        """
        self._values = {
        }
        if host_rewrite is not None: self._values["host_rewrite"] = host_rewrite
        if path_prefix_rewrite is not None: self._values["path_prefix_rewrite"] = path_prefix_rewrite

    @builtins.property
    def host_rewrite(self) -> typing.Optional[str]:
        """Prior to forwarding the request to the selected service, the request's host header is replaced with contents of hostRewrite.

        The value must be between 1 and
        255 characters.
        """
        return self._values.get('host_rewrite')

    @builtins.property
    def path_prefix_rewrite(self) -> typing.Optional[str]:
        """Prior to forwarding the request to the selected backend service, the matching portion of the request's path is replaced by pathPrefixRewrite.

        The value must
        be between 1 and 1024 characters.
        """
        return self._values.get('path_prefix_rewrite')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionUrlRewrite(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServices", jsii_struct_bases=[], name_mapping={'backend_service': 'backendService', 'weight': 'weight', 'header_action': 'headerAction'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServices():
    def __init__(self, *, backend_service: str, weight: jsii.Number, header_action: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderAction"]]=None) -> None:
        """
        :param backend_service: The default RegionBackendService resource. Before forwarding the request to backendService, the loadbalancer applies any relevant headerActions specified as part of this backendServiceWeight.
        :param weight: Specifies the fraction of traffic sent to backendService, computed as weight / (sum of all weightedBackendService weights in routeAction) . The selection of a backend service is determined only for new traffic. Once a user's request has been directed to a backendService, subsequent requests will be sent to the same backendService as determined by the BackendService's session affinity policy. The value must be between 0 and 1000
        :param header_action: header_action block.
        """
        self._values = {
            'backend_service': backend_service,
            'weight': weight,
        }
        if header_action is not None: self._values["header_action"] = header_action

    @builtins.property
    def backend_service(self) -> str:
        """The default RegionBackendService resource.

        Before
        forwarding the request to backendService, the loadbalancer applies any relevant
        headerActions specified as part of this backendServiceWeight.
        """
        return self._values.get('backend_service')

    @builtins.property
    def weight(self) -> jsii.Number:
        """Specifies the fraction of traffic sent to backendService, computed as weight / (sum of all weightedBackendService weights in routeAction) .

        The selection of a
        backend service is determined only for new traffic. Once a user's request has
        been directed to a backendService, subsequent requests will be sent to the same
        backendService as determined by the BackendService's session affinity policy.
        The value must be between 0 and 1000
        """
        return self._values.get('weight')

    @builtins.property
    def header_action(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderAction"]]:
        """header_action block."""
        return self._values.get('header_action')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServices(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderAction", jsii_struct_bases=[], name_mapping={'request_headers_to_add': 'requestHeadersToAdd', 'request_headers_to_remove': 'requestHeadersToRemove', 'response_headers_to_add': 'responseHeadersToAdd', 'response_headers_to_remove': 'responseHeadersToRemove'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderAction():
    def __init__(self, *, request_headers_to_add: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd"]]=None, request_headers_to_remove: typing.Optional[typing.List[str]]=None, response_headers_to_add: typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd"]]=None, response_headers_to_remove: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param request_headers_to_add: request_headers_to_add block.
        :param request_headers_to_remove: A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService.
        :param response_headers_to_add: response_headers_to_add block.
        :param response_headers_to_remove: A list of header names for headers that need to be removed from the response prior to sending the response back to the client.
        """
        self._values = {
        }
        if request_headers_to_add is not None: self._values["request_headers_to_add"] = request_headers_to_add
        if request_headers_to_remove is not None: self._values["request_headers_to_remove"] = request_headers_to_remove
        if response_headers_to_add is not None: self._values["response_headers_to_add"] = response_headers_to_add
        if response_headers_to_remove is not None: self._values["response_headers_to_remove"] = response_headers_to_remove

    @builtins.property
    def request_headers_to_add(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd"]]:
        """request_headers_to_add block."""
        return self._values.get('request_headers_to_add')

    @builtins.property
    def request_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService."""
        return self._values.get('request_headers_to_remove')

    @builtins.property
    def response_headers_to_add(self) -> typing.Optional[typing.List["ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd"]]:
        """response_headers_to_add block."""
        return self._values.get('response_headers_to_add')

    @builtins.property
    def response_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the response prior to sending the response back to the client."""
        return self._values.get('response_headers_to_remove')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapPathMatcherRouteRulesUrlRedirect", jsii_struct_bases=[], name_mapping={'host_redirect': 'hostRedirect', 'https_redirect': 'httpsRedirect', 'path_redirect': 'pathRedirect', 'prefix_redirect': 'prefixRedirect', 'redirect_response_code': 'redirectResponseCode', 'strip_query': 'stripQuery'})
class ComputeRegionUrlMapPathMatcherRouteRulesUrlRedirect():
    def __init__(self, *, host_redirect: typing.Optional[str]=None, https_redirect: typing.Optional[bool]=None, path_redirect: typing.Optional[str]=None, prefix_redirect: typing.Optional[str]=None, redirect_response_code: typing.Optional[str]=None, strip_query: typing.Optional[bool]=None) -> None:
        """
        :param host_redirect: The host that will be used in the redirect response instead of the one that was supplied in the request. The value must be between 1 and 255 characters.
        :param https_redirect: If set to true, the URL scheme in the redirected request is set to https. If set to false, the URL scheme of the redirected request will remain the same as that of the request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this true for TargetHttpsProxy is not permitted. The default is set to false.
        :param path_redirect: The path that will be used in the redirect response instead of the one that was supplied in the request. pathRedirect cannot be supplied together with prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param prefix_redirect: The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request. prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param redirect_response_code: The HTTP Status code to use for this RedirectAction. Supported values are:. MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301. FOUND, which corresponds to 302. SEE_OTHER which corresponds to 303. TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method will be retained. PERMANENT_REDIRECT, which corresponds to 308. In this case, the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        :param strip_query: If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request. If set to false, the query portion of the original URL is retained. The default value is false.
        """
        self._values = {
        }
        if host_redirect is not None: self._values["host_redirect"] = host_redirect
        if https_redirect is not None: self._values["https_redirect"] = https_redirect
        if path_redirect is not None: self._values["path_redirect"] = path_redirect
        if prefix_redirect is not None: self._values["prefix_redirect"] = prefix_redirect
        if redirect_response_code is not None: self._values["redirect_response_code"] = redirect_response_code
        if strip_query is not None: self._values["strip_query"] = strip_query

    @builtins.property
    def host_redirect(self) -> typing.Optional[str]:
        """The host that will be used in the redirect response instead of the one that was supplied in the request.

        The value must be between 1 and 255
        characters.
        """
        return self._values.get('host_redirect')

    @builtins.property
    def https_redirect(self) -> typing.Optional[bool]:
        """If set to true, the URL scheme in the redirected request is set to https.

        If set to false, the URL scheme of the redirected request will remain the
        same as that of the request. This must only be set for UrlMaps used in
        TargetHttpProxys. Setting this true for TargetHttpsProxy is not
        permitted. The default is set to false.
        """
        return self._values.get('https_redirect')

    @builtins.property
    def path_redirect(self) -> typing.Optional[str]:
        """The path that will be used in the redirect response instead of the one that was supplied in the request.

        pathRedirect cannot be supplied
        together with prefixRedirect. Supply one alone or neither. If neither is
        supplied, the path of the original request will be used for the redirect.
        The value must be between 1 and 1024 characters.
        """
        return self._values.get('path_redirect')

    @builtins.property
    def prefix_redirect(self) -> typing.Optional[str]:
        """The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request.

        prefixRedirect cannot be supplied together with
        pathRedirect. Supply one alone or neither. If neither is supplied, the
        path of the original request will be used for the redirect. The value
        must be between 1 and 1024 characters.
        """
        return self._values.get('prefix_redirect')

    @builtins.property
    def redirect_response_code(self) -> typing.Optional[str]:
        """The HTTP Status code to use for this RedirectAction. Supported values are:.

        MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301.

        FOUND, which corresponds to 302.

        SEE_OTHER which corresponds to 303.

        TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method
        will be retained.

        PERMANENT_REDIRECT, which corresponds to 308. In this case,
        the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        return self._values.get('redirect_response_code')

    @builtins.property
    def strip_query(self) -> typing.Optional[bool]:
        """If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request.

        If set to false, the query
        portion of the original URL is retained. The default value is false.
        """
        return self._values.get('strip_query')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapPathMatcherRouteRulesUrlRedirect(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapTest", jsii_struct_bases=[], name_mapping={'host': 'host', 'path': 'path', 'service': 'service', 'description': 'description'})
class ComputeRegionUrlMapTest():
    def __init__(self, *, host: str, path: str, service: str, description: typing.Optional[str]=None) -> None:
        """
        :param host: Host portion of the URL.
        :param path: Path portion of the URL.
        :param service: A reference to expected RegionBackendService resource the given URL should be mapped to.
        :param description: Description of this test case.
        """
        self._values = {
            'host': host,
            'path': path,
            'service': service,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def host(self) -> str:
        """Host portion of the URL."""
        return self._values.get('host')

    @builtins.property
    def path(self) -> str:
        """Path portion of the URL."""
        return self._values.get('path')

    @builtins.property
    def service(self) -> str:
        """A reference to expected RegionBackendService resource the given URL should be mapped to."""
        return self._values.get('service')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Description of this test case."""
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapTest(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRegionUrlMapTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeRegionUrlMapTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRegionUrlMapTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeReservation(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeReservation"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, specific_reservation: typing.List["ComputeReservationSpecificReservation"], zone: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, specific_reservation_required: typing.Optional[bool]=None, timeouts: typing.Optional["ComputeReservationTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param specific_reservation: specific_reservation block.
        :param zone: The zone where the reservation is made.
        :param description: An optional description of this resource.
        :param project: 
        :param specific_reservation_required: When set to true, only VMs that target this reservation by name can consume this reservation. Otherwise, it can be consumed by VMs with affinity for any reservation. Defaults to false.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeReservationConfig(name=name, specific_reservation=specific_reservation, zone=zone, description=description, project=project, specific_reservation_required=specific_reservation_required, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeReservation, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="commitment")
    def commitment(self) -> str:
        return jsii.get(self, "commitment")

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="status")
    def status(self) -> str:
        return jsii.get(self, "status")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="specificReservation")
    def specific_reservation(self) -> typing.List["ComputeReservationSpecificReservation"]:
        return jsii.get(self, "specificReservation")

    @specific_reservation.setter
    def specific_reservation(self, value: typing.List["ComputeReservationSpecificReservation"]) -> None:
        jsii.set(self, "specificReservation", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> str:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: str) -> None:
        jsii.set(self, "zone", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="specificReservationRequired")
    def specific_reservation_required(self) -> typing.Optional[bool]:
        return jsii.get(self, "specificReservationRequired")

    @specific_reservation_required.setter
    def specific_reservation_required(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "specificReservationRequired", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeReservationTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeReservationTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeReservationConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'specific_reservation': 'specificReservation', 'zone': 'zone', 'description': 'description', 'project': 'project', 'specific_reservation_required': 'specificReservationRequired', 'timeouts': 'timeouts'})
class ComputeReservationConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, specific_reservation: typing.List["ComputeReservationSpecificReservation"], zone: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, specific_reservation_required: typing.Optional[bool]=None, timeouts: typing.Optional["ComputeReservationTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param specific_reservation: specific_reservation block.
        :param zone: The zone where the reservation is made.
        :param description: An optional description of this resource.
        :param project: 
        :param specific_reservation_required: When set to true, only VMs that target this reservation by name can consume this reservation. Otherwise, it can be consumed by VMs with affinity for any reservation. Defaults to false.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeReservationTimeouts(**timeouts)
        self._values = {
            'name': name,
            'specific_reservation': specific_reservation,
            'zone': zone,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if specific_reservation_required is not None: self._values["specific_reservation_required"] = specific_reservation_required
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def specific_reservation(self) -> typing.List["ComputeReservationSpecificReservation"]:
        """specific_reservation block."""
        return self._values.get('specific_reservation')

    @builtins.property
    def zone(self) -> str:
        """The zone where the reservation is made."""
        return self._values.get('zone')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def specific_reservation_required(self) -> typing.Optional[bool]:
        """When set to true, only VMs that target this reservation by name can consume this reservation.

        Otherwise, it can be consumed by VMs with
        affinity for any reservation. Defaults to false.
        """
        return self._values.get('specific_reservation_required')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeReservationTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeReservationConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeReservationSpecificReservation", jsii_struct_bases=[], name_mapping={'count': 'count', 'instance_properties': 'instanceProperties'})
class ComputeReservationSpecificReservation():
    def __init__(self, *, count: jsii.Number, instance_properties: typing.List["ComputeReservationSpecificReservationInstanceProperties"]) -> None:
        """
        :param count: The number of resources that are allocated.
        :param instance_properties: instance_properties block.
        """
        self._values = {
            'count': count,
            'instance_properties': instance_properties,
        }

    @builtins.property
    def count(self) -> jsii.Number:
        """The number of resources that are allocated."""
        return self._values.get('count')

    @builtins.property
    def instance_properties(self) -> typing.List["ComputeReservationSpecificReservationInstanceProperties"]:
        """instance_properties block."""
        return self._values.get('instance_properties')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeReservationSpecificReservation(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeReservationSpecificReservationInstanceProperties", jsii_struct_bases=[], name_mapping={'machine_type': 'machineType', 'guest_accelerators': 'guestAccelerators', 'local_ssds': 'localSsds', 'min_cpu_platform': 'minCpuPlatform'})
class ComputeReservationSpecificReservationInstanceProperties():
    def __init__(self, *, machine_type: str, guest_accelerators: typing.Optional[typing.List["ComputeReservationSpecificReservationInstancePropertiesGuestAccelerators"]]=None, local_ssds: typing.Optional[typing.List["ComputeReservationSpecificReservationInstancePropertiesLocalSsds"]]=None, min_cpu_platform: typing.Optional[str]=None) -> None:
        """
        :param machine_type: The name of the machine type to reserve.
        :param guest_accelerators: guest_accelerators block.
        :param local_ssds: local_ssds block.
        :param min_cpu_platform: The minimum CPU platform for the reservation. For example, '"Intel Skylake"'. See the CPU platform availability reference](https://cloud.google.com/compute/docs/instances/specify-min-cpu-platform#availablezones) for information on available CPU platforms.
        """
        self._values = {
            'machine_type': machine_type,
        }
        if guest_accelerators is not None: self._values["guest_accelerators"] = guest_accelerators
        if local_ssds is not None: self._values["local_ssds"] = local_ssds
        if min_cpu_platform is not None: self._values["min_cpu_platform"] = min_cpu_platform

    @builtins.property
    def machine_type(self) -> str:
        """The name of the machine type to reserve."""
        return self._values.get('machine_type')

    @builtins.property
    def guest_accelerators(self) -> typing.Optional[typing.List["ComputeReservationSpecificReservationInstancePropertiesGuestAccelerators"]]:
        """guest_accelerators block."""
        return self._values.get('guest_accelerators')

    @builtins.property
    def local_ssds(self) -> typing.Optional[typing.List["ComputeReservationSpecificReservationInstancePropertiesLocalSsds"]]:
        """local_ssds block."""
        return self._values.get('local_ssds')

    @builtins.property
    def min_cpu_platform(self) -> typing.Optional[str]:
        """The minimum CPU platform for the reservation.

        For example,
        '"Intel Skylake"'. See
        the CPU platform availability reference](https://cloud.google.com/compute/docs/instances/specify-min-cpu-platform#availablezones)
        for information on available CPU platforms.
        """
        return self._values.get('min_cpu_platform')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeReservationSpecificReservationInstanceProperties(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeReservationSpecificReservationInstancePropertiesGuestAccelerators", jsii_struct_bases=[], name_mapping={'accelerator_count': 'acceleratorCount', 'accelerator_type': 'acceleratorType'})
class ComputeReservationSpecificReservationInstancePropertiesGuestAccelerators():
    def __init__(self, *, accelerator_count: jsii.Number, accelerator_type: str) -> None:
        """
        :param accelerator_count: The number of the guest accelerator cards exposed to this instance.
        :param accelerator_type: The full or partial URL of the accelerator type to attach to this instance. For example: 'projects/my-project/zones/us-central1-c/acceleratorTypes/nvidia-tesla-p100'. If you are creating an instance template, specify only the accelerator name.
        """
        self._values = {
            'accelerator_count': accelerator_count,
            'accelerator_type': accelerator_type,
        }

    @builtins.property
    def accelerator_count(self) -> jsii.Number:
        """The number of the guest accelerator cards exposed to this instance."""
        return self._values.get('accelerator_count')

    @builtins.property
    def accelerator_type(self) -> str:
        """The full or partial URL of the accelerator type to attach to this instance. For example: 'projects/my-project/zones/us-central1-c/acceleratorTypes/nvidia-tesla-p100'.

        If you are creating an instance template, specify only the accelerator name.
        """
        return self._values.get('accelerator_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeReservationSpecificReservationInstancePropertiesGuestAccelerators(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeReservationSpecificReservationInstancePropertiesLocalSsds", jsii_struct_bases=[], name_mapping={'disk_size_gb': 'diskSizeGb', 'interface': 'interface'})
class ComputeReservationSpecificReservationInstancePropertiesLocalSsds():
    def __init__(self, *, disk_size_gb: jsii.Number, interface: typing.Optional[str]=None) -> None:
        """
        :param disk_size_gb: The size of the disk in base-2 GB.
        :param interface: The disk interface to use for attaching this disk. Default value: "SCSI" Possible values: ["SCSI", "NVME"]
        """
        self._values = {
            'disk_size_gb': disk_size_gb,
        }
        if interface is not None: self._values["interface"] = interface

    @builtins.property
    def disk_size_gb(self) -> jsii.Number:
        """The size of the disk in base-2 GB."""
        return self._values.get('disk_size_gb')

    @builtins.property
    def interface(self) -> typing.Optional[str]:
        """The disk interface to use for attaching this disk.

        Default value: "SCSI" Possible values: ["SCSI", "NVME"]
        """
        return self._values.get('interface')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeReservationSpecificReservationInstancePropertiesLocalSsds(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeReservationTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeReservationTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeReservationTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeResourcePolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeResourcePolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, group_placement_policy: typing.Optional[typing.List["ComputeResourcePolicyGroupPlacementPolicy"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, snapshot_schedule_policy: typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicy"]]=None, timeouts: typing.Optional["ComputeResourcePolicyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the resource, provided by the client when initially creating the resource. The resource name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_'? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param group_placement_policy: group_placement_policy block.
        :param project: 
        :param region: Region where resource policy resides.
        :param snapshot_schedule_policy: snapshot_schedule_policy block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeResourcePolicyConfig(name=name, group_placement_policy=group_placement_policy, project=project, region=region, snapshot_schedule_policy=snapshot_schedule_policy, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeResourcePolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="groupPlacementPolicy")
    def group_placement_policy(self) -> typing.Optional[typing.List["ComputeResourcePolicyGroupPlacementPolicy"]]:
        return jsii.get(self, "groupPlacementPolicy")

    @group_placement_policy.setter
    def group_placement_policy(self, value: typing.Optional[typing.List["ComputeResourcePolicyGroupPlacementPolicy"]]) -> None:
        jsii.set(self, "groupPlacementPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="snapshotSchedulePolicy")
    def snapshot_schedule_policy(self) -> typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicy"]]:
        return jsii.get(self, "snapshotSchedulePolicy")

    @snapshot_schedule_policy.setter
    def snapshot_schedule_policy(self, value: typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicy"]]) -> None:
        jsii.set(self, "snapshotSchedulePolicy", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeResourcePolicyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeResourcePolicyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeResourcePolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'group_placement_policy': 'groupPlacementPolicy', 'project': 'project', 'region': 'region', 'snapshot_schedule_policy': 'snapshotSchedulePolicy', 'timeouts': 'timeouts'})
class ComputeResourcePolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, group_placement_policy: typing.Optional[typing.List["ComputeResourcePolicyGroupPlacementPolicy"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, snapshot_schedule_policy: typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicy"]]=None, timeouts: typing.Optional["ComputeResourcePolicyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the resource, provided by the client when initially creating the resource. The resource name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_'? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param group_placement_policy: group_placement_policy block.
        :param project: 
        :param region: Region where resource policy resides.
        :param snapshot_schedule_policy: snapshot_schedule_policy block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeResourcePolicyTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if group_placement_policy is not None: self._values["group_placement_policy"] = group_placement_policy
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if snapshot_schedule_policy is not None: self._values["snapshot_schedule_policy"] = snapshot_schedule_policy
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name of the resource, provided by the client when initially creating the resource.

        The resource name must be 1-63 characters long, and comply
        with RFC1035. Specifically, the name must be 1-63 characters long and
        match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_'? which means the
        first character must be a lowercase letter, and all following characters
        must be a dash, lowercase letter, or digit, except the last character,
        which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def group_placement_policy(self) -> typing.Optional[typing.List["ComputeResourcePolicyGroupPlacementPolicy"]]:
        """group_placement_policy block."""
        return self._values.get('group_placement_policy')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """Region where resource policy resides."""
        return self._values.get('region')

    @builtins.property
    def snapshot_schedule_policy(self) -> typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicy"]]:
        """snapshot_schedule_policy block."""
        return self._values.get('snapshot_schedule_policy')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeResourcePolicyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeResourcePolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeResourcePolicyGroupPlacementPolicy", jsii_struct_bases=[], name_mapping={'availability_domain_count': 'availabilityDomainCount', 'collocation': 'collocation', 'vm_count': 'vmCount'})
class ComputeResourcePolicyGroupPlacementPolicy():
    def __init__(self, *, availability_domain_count: typing.Optional[jsii.Number]=None, collocation: typing.Optional[str]=None, vm_count: typing.Optional[jsii.Number]=None) -> None:
        """
        :param availability_domain_count: The number of availability domains instances will be spread across. If two instances are in different availability domain, they will not be put in the same low latency network
        :param collocation: Collocation specifies whether to place VMs inside the same availability domain on the same low-latency network. Specify 'COLLOCATED' to enable collocation. Can only be specified with 'vm_count'. If compute instances are created with a COLLOCATED policy, then exactly 'vm_count' instances must be created at the same time with the resource policy attached. Possible values: ["COLLOCATED"]
        :param vm_count: Number of vms in this placement group.
        """
        self._values = {
        }
        if availability_domain_count is not None: self._values["availability_domain_count"] = availability_domain_count
        if collocation is not None: self._values["collocation"] = collocation
        if vm_count is not None: self._values["vm_count"] = vm_count

    @builtins.property
    def availability_domain_count(self) -> typing.Optional[jsii.Number]:
        """The number of availability domains instances will be spread across.

        If two instances are in different
        availability domain, they will not be put in the same low latency network
        """
        return self._values.get('availability_domain_count')

    @builtins.property
    def collocation(self) -> typing.Optional[str]:
        """Collocation specifies whether to place VMs inside the same availability domain on the same low-latency network.

        Specify 'COLLOCATED' to enable collocation. Can only be specified with 'vm_count'. If compute instances are created
        with a COLLOCATED policy, then exactly 'vm_count' instances must be created at the same time with the resource policy
        attached. Possible values: ["COLLOCATED"]
        """
        return self._values.get('collocation')

    @builtins.property
    def vm_count(self) -> typing.Optional[jsii.Number]:
        """Number of vms in this placement group."""
        return self._values.get('vm_count')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeResourcePolicyGroupPlacementPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeResourcePolicySnapshotSchedulePolicy", jsii_struct_bases=[], name_mapping={'schedule': 'schedule', 'retention_policy': 'retentionPolicy', 'snapshot_properties': 'snapshotProperties'})
class ComputeResourcePolicySnapshotSchedulePolicy():
    def __init__(self, *, schedule: typing.List["ComputeResourcePolicySnapshotSchedulePolicySchedule"], retention_policy: typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicyRetentionPolicy"]]=None, snapshot_properties: typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicySnapshotProperties"]]=None) -> None:
        """
        :param schedule: schedule block.
        :param retention_policy: retention_policy block.
        :param snapshot_properties: snapshot_properties block.
        """
        self._values = {
            'schedule': schedule,
        }
        if retention_policy is not None: self._values["retention_policy"] = retention_policy
        if snapshot_properties is not None: self._values["snapshot_properties"] = snapshot_properties

    @builtins.property
    def schedule(self) -> typing.List["ComputeResourcePolicySnapshotSchedulePolicySchedule"]:
        """schedule block."""
        return self._values.get('schedule')

    @builtins.property
    def retention_policy(self) -> typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicyRetentionPolicy"]]:
        """retention_policy block."""
        return self._values.get('retention_policy')

    @builtins.property
    def snapshot_properties(self) -> typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicySnapshotProperties"]]:
        """snapshot_properties block."""
        return self._values.get('snapshot_properties')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeResourcePolicySnapshotSchedulePolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeResourcePolicySnapshotSchedulePolicyRetentionPolicy", jsii_struct_bases=[], name_mapping={'max_retention_days': 'maxRetentionDays', 'on_source_disk_delete': 'onSourceDiskDelete'})
class ComputeResourcePolicySnapshotSchedulePolicyRetentionPolicy():
    def __init__(self, *, max_retention_days: jsii.Number, on_source_disk_delete: typing.Optional[str]=None) -> None:
        """
        :param max_retention_days: Maximum age of the snapshot that is allowed to be kept.
        :param on_source_disk_delete: Specifies the behavior to apply to scheduled snapshots when the source disk is deleted. Default value: "KEEP_AUTO_SNAPSHOTS" Possible values: ["KEEP_AUTO_SNAPSHOTS", "APPLY_RETENTION_POLICY"]
        """
        self._values = {
            'max_retention_days': max_retention_days,
        }
        if on_source_disk_delete is not None: self._values["on_source_disk_delete"] = on_source_disk_delete

    @builtins.property
    def max_retention_days(self) -> jsii.Number:
        """Maximum age of the snapshot that is allowed to be kept."""
        return self._values.get('max_retention_days')

    @builtins.property
    def on_source_disk_delete(self) -> typing.Optional[str]:
        """Specifies the behavior to apply to scheduled snapshots when the source disk is deleted.

        Default value: "KEEP_AUTO_SNAPSHOTS" Possible values: ["KEEP_AUTO_SNAPSHOTS", "APPLY_RETENTION_POLICY"]
        """
        return self._values.get('on_source_disk_delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeResourcePolicySnapshotSchedulePolicyRetentionPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeResourcePolicySnapshotSchedulePolicySchedule", jsii_struct_bases=[], name_mapping={'daily_schedule': 'dailySchedule', 'hourly_schedule': 'hourlySchedule', 'weekly_schedule': 'weeklySchedule'})
class ComputeResourcePolicySnapshotSchedulePolicySchedule():
    def __init__(self, *, daily_schedule: typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicyScheduleDailySchedule"]]=None, hourly_schedule: typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicyScheduleHourlySchedule"]]=None, weekly_schedule: typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicyScheduleWeeklySchedule"]]=None) -> None:
        """
        :param daily_schedule: daily_schedule block.
        :param hourly_schedule: hourly_schedule block.
        :param weekly_schedule: weekly_schedule block.
        """
        self._values = {
        }
        if daily_schedule is not None: self._values["daily_schedule"] = daily_schedule
        if hourly_schedule is not None: self._values["hourly_schedule"] = hourly_schedule
        if weekly_schedule is not None: self._values["weekly_schedule"] = weekly_schedule

    @builtins.property
    def daily_schedule(self) -> typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicyScheduleDailySchedule"]]:
        """daily_schedule block."""
        return self._values.get('daily_schedule')

    @builtins.property
    def hourly_schedule(self) -> typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicyScheduleHourlySchedule"]]:
        """hourly_schedule block."""
        return self._values.get('hourly_schedule')

    @builtins.property
    def weekly_schedule(self) -> typing.Optional[typing.List["ComputeResourcePolicySnapshotSchedulePolicyScheduleWeeklySchedule"]]:
        """weekly_schedule block."""
        return self._values.get('weekly_schedule')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeResourcePolicySnapshotSchedulePolicySchedule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeResourcePolicySnapshotSchedulePolicyScheduleDailySchedule", jsii_struct_bases=[], name_mapping={'days_in_cycle': 'daysInCycle', 'start_time': 'startTime'})
class ComputeResourcePolicySnapshotSchedulePolicyScheduleDailySchedule():
    def __init__(self, *, days_in_cycle: jsii.Number, start_time: str) -> None:
        """
        :param days_in_cycle: The number of days between snapshots.
        :param start_time: This must be in UTC format that resolves to one of 00:00, 04:00, 08:00, 12:00, 16:00, or 20:00. For example, both 13:00-5 and 08:00 are valid.
        """
        self._values = {
            'days_in_cycle': days_in_cycle,
            'start_time': start_time,
        }

    @builtins.property
    def days_in_cycle(self) -> jsii.Number:
        """The number of days between snapshots."""
        return self._values.get('days_in_cycle')

    @builtins.property
    def start_time(self) -> str:
        """This must be in UTC format that resolves to one of 00:00, 04:00, 08:00, 12:00, 16:00, or 20:00.

        For example,
        both 13:00-5 and 08:00 are valid.
        """
        return self._values.get('start_time')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeResourcePolicySnapshotSchedulePolicyScheduleDailySchedule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeResourcePolicySnapshotSchedulePolicyScheduleHourlySchedule", jsii_struct_bases=[], name_mapping={'hours_in_cycle': 'hoursInCycle', 'start_time': 'startTime'})
class ComputeResourcePolicySnapshotSchedulePolicyScheduleHourlySchedule():
    def __init__(self, *, hours_in_cycle: jsii.Number, start_time: str) -> None:
        """
        :param hours_in_cycle: The number of hours between snapshots.
        :param start_time: Time within the window to start the operations. It must be in an hourly format "HH:MM", where HH : [00-23] and MM : [00] GMT. eg: 21:00
        """
        self._values = {
            'hours_in_cycle': hours_in_cycle,
            'start_time': start_time,
        }

    @builtins.property
    def hours_in_cycle(self) -> jsii.Number:
        """The number of hours between snapshots."""
        return self._values.get('hours_in_cycle')

    @builtins.property
    def start_time(self) -> str:
        """Time within the window to start the operations.

        It must be in an hourly format "HH:MM",
        where HH : [00-23] and MM : [00] GMT.
        eg: 21:00
        """
        return self._values.get('start_time')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeResourcePolicySnapshotSchedulePolicyScheduleHourlySchedule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeResourcePolicySnapshotSchedulePolicyScheduleWeeklySchedule", jsii_struct_bases=[], name_mapping={'day_of_weeks': 'dayOfWeeks'})
class ComputeResourcePolicySnapshotSchedulePolicyScheduleWeeklySchedule():
    def __init__(self, *, day_of_weeks: typing.List["ComputeResourcePolicySnapshotSchedulePolicyScheduleWeeklyScheduleDayOfWeeks"]) -> None:
        """
        :param day_of_weeks: day_of_weeks block.
        """
        self._values = {
            'day_of_weeks': day_of_weeks,
        }

    @builtins.property
    def day_of_weeks(self) -> typing.List["ComputeResourcePolicySnapshotSchedulePolicyScheduleWeeklyScheduleDayOfWeeks"]:
        """day_of_weeks block."""
        return self._values.get('day_of_weeks')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeResourcePolicySnapshotSchedulePolicyScheduleWeeklySchedule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeResourcePolicySnapshotSchedulePolicyScheduleWeeklyScheduleDayOfWeeks", jsii_struct_bases=[], name_mapping={'day': 'day', 'start_time': 'startTime'})
class ComputeResourcePolicySnapshotSchedulePolicyScheduleWeeklyScheduleDayOfWeeks():
    def __init__(self, *, day: str, start_time: str) -> None:
        """
        :param day: The day of the week to create the snapshot. e.g. MONDAY Possible values: ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"]
        :param start_time: Time within the window to start the operations. It must be in format "HH:MM", where HH : [00-23] and MM : [00-00] GMT.
        """
        self._values = {
            'day': day,
            'start_time': start_time,
        }

    @builtins.property
    def day(self) -> str:
        """The day of the week to create the snapshot.

        e.g. MONDAY Possible values: ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"]
        """
        return self._values.get('day')

    @builtins.property
    def start_time(self) -> str:
        """Time within the window to start the operations.

        It must be in format "HH:MM", where HH : [00-23] and MM : [00-00] GMT.
        """
        return self._values.get('start_time')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeResourcePolicySnapshotSchedulePolicyScheduleWeeklyScheduleDayOfWeeks(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeResourcePolicySnapshotSchedulePolicySnapshotProperties", jsii_struct_bases=[], name_mapping={'guest_flush': 'guestFlush', 'labels': 'labels', 'storage_locations': 'storageLocations'})
class ComputeResourcePolicySnapshotSchedulePolicySnapshotProperties():
    def __init__(self, *, guest_flush: typing.Optional[bool]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, storage_locations: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param guest_flush: Whether to perform a 'guest aware' snapshot.
        :param labels: A set of key-value pairs.
        :param storage_locations: Cloud Storage bucket location to store the auto snapshot (regional or multi-regional).
        """
        self._values = {
        }
        if guest_flush is not None: self._values["guest_flush"] = guest_flush
        if labels is not None: self._values["labels"] = labels
        if storage_locations is not None: self._values["storage_locations"] = storage_locations

    @builtins.property
    def guest_flush(self) -> typing.Optional[bool]:
        """Whether to perform a 'guest aware' snapshot."""
        return self._values.get('guest_flush')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key-value pairs."""
        return self._values.get('labels')

    @builtins.property
    def storage_locations(self) -> typing.Optional[typing.List[str]]:
        """Cloud Storage bucket location to store the auto snapshot (regional or multi-regional)."""
        return self._values.get('storage_locations')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeResourcePolicySnapshotSchedulePolicySnapshotProperties(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeResourcePolicyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeResourcePolicyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeResourcePolicyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRoute(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRoute"):
    def __init__(self, scope: constructs.Construct, id: str, *, dest_range: str, name: str, network: str, description: typing.Optional[str]=None, next_hop_gateway: typing.Optional[str]=None, next_hop_ilb: typing.Optional[str]=None, next_hop_instance: typing.Optional[str]=None, next_hop_instance_zone: typing.Optional[str]=None, next_hop_ip: typing.Optional[str]=None, next_hop_vpn_tunnel: typing.Optional[str]=None, priority: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, tags: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["ComputeRouteTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dest_range: The destination range of outgoing packets that this route applies to. Only IPv4 is supported.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: The network that this route applies to.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param next_hop_gateway: URL to a gateway that should handle matching packets. Currently, you can only specify the internet gateway, using a full or partial valid URL: 'https://www.googleapis.com/compute/v1/projects/project/global/gateways/default-internet-gateway' 'projects/project/global/gateways/default-internet-gateway' 'global/gateways/default-internet-gateway' The string 'default-internet-gateway'.
        :param next_hop_ilb: The URL to a forwarding rule of type loadBalancingScheme=INTERNAL that should handle matching packets. You can only specify the forwarding rule as a partial or full URL. For example, the following are all valid URLs: https://www.googleapis.com/compute/v1/projects/project/regions/region/forwardingRules/forwardingRule regions/region/forwardingRules/forwardingRule Note that this can only be used when the destinationRange is a public (non-RFC 1918) IP CIDR range.
        :param next_hop_instance: URL to an instance that should handle matching packets. You can specify this as a full or partial URL. For example: 'https://www.googleapis.com/compute/v1/projects/project/zones/zone/instances/instance' 'projects/project/zones/zone/instances/instance' 'zones/zone/instances/instance' Just the instance name, with the zone in 'next_hop_instance_zone'.
        :param next_hop_instance_zone: 
        :param next_hop_ip: Network IP address of an instance that should handle matching packets.
        :param next_hop_vpn_tunnel: URL to a VpnTunnel that should handle matching packets.
        :param priority: The priority of this route. Priority is used to break ties in cases where there is more than one matching route of equal prefix length. In the case of two routes with equal prefix length, the one with the lowest-numbered priority value wins. Default value is 1000. Valid range is 0 through 65535.
        :param project: 
        :param tags: A list of instance tags to which this route applies.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRouteConfig(dest_range=dest_range, name=name, network=network, description=description, next_hop_gateway=next_hop_gateway, next_hop_ilb=next_hop_ilb, next_hop_instance=next_hop_instance, next_hop_instance_zone=next_hop_instance_zone, next_hop_ip=next_hop_ip, next_hop_vpn_tunnel=next_hop_vpn_tunnel, priority=priority, project=project, tags=tags, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRoute, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="nextHopNetwork")
    def next_hop_network(self) -> str:
        return jsii.get(self, "nextHopNetwork")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="destRange")
    def dest_range(self) -> str:
        return jsii.get(self, "destRange")

    @dest_range.setter
    def dest_range(self, value: str) -> None:
        jsii.set(self, "destRange", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: str) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="nextHopGateway")
    def next_hop_gateway(self) -> typing.Optional[str]:
        return jsii.get(self, "nextHopGateway")

    @next_hop_gateway.setter
    def next_hop_gateway(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "nextHopGateway", value)

    @builtins.property
    @jsii.member(jsii_name="nextHopIlb")
    def next_hop_ilb(self) -> typing.Optional[str]:
        return jsii.get(self, "nextHopIlb")

    @next_hop_ilb.setter
    def next_hop_ilb(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "nextHopIlb", value)

    @builtins.property
    @jsii.member(jsii_name="nextHopInstance")
    def next_hop_instance(self) -> typing.Optional[str]:
        return jsii.get(self, "nextHopInstance")

    @next_hop_instance.setter
    def next_hop_instance(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "nextHopInstance", value)

    @builtins.property
    @jsii.member(jsii_name="nextHopInstanceZone")
    def next_hop_instance_zone(self) -> typing.Optional[str]:
        return jsii.get(self, "nextHopInstanceZone")

    @next_hop_instance_zone.setter
    def next_hop_instance_zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "nextHopInstanceZone", value)

    @builtins.property
    @jsii.member(jsii_name="nextHopIp")
    def next_hop_ip(self) -> typing.Optional[str]:
        return jsii.get(self, "nextHopIp")

    @next_hop_ip.setter
    def next_hop_ip(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "nextHopIp", value)

    @builtins.property
    @jsii.member(jsii_name="nextHopVpnTunnel")
    def next_hop_vpn_tunnel(self) -> typing.Optional[str]:
        return jsii.get(self, "nextHopVpnTunnel")

    @next_hop_vpn_tunnel.setter
    def next_hop_vpn_tunnel(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "nextHopVpnTunnel", value)

    @builtins.property
    @jsii.member(jsii_name="priority")
    def priority(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "priority")

    @priority.setter
    def priority(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "priority", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "tags")

    @tags.setter
    def tags(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "tags", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRouteTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRouteTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouteConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dest_range': 'destRange', 'name': 'name', 'network': 'network', 'description': 'description', 'next_hop_gateway': 'nextHopGateway', 'next_hop_ilb': 'nextHopIlb', 'next_hop_instance': 'nextHopInstance', 'next_hop_instance_zone': 'nextHopInstanceZone', 'next_hop_ip': 'nextHopIp', 'next_hop_vpn_tunnel': 'nextHopVpnTunnel', 'priority': 'priority', 'project': 'project', 'tags': 'tags', 'timeouts': 'timeouts'})
class ComputeRouteConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dest_range: str, name: str, network: str, description: typing.Optional[str]=None, next_hop_gateway: typing.Optional[str]=None, next_hop_ilb: typing.Optional[str]=None, next_hop_instance: typing.Optional[str]=None, next_hop_instance_zone: typing.Optional[str]=None, next_hop_ip: typing.Optional[str]=None, next_hop_vpn_tunnel: typing.Optional[str]=None, priority: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, tags: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["ComputeRouteTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dest_range: The destination range of outgoing packets that this route applies to. Only IPv4 is supported.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: The network that this route applies to.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param next_hop_gateway: URL to a gateway that should handle matching packets. Currently, you can only specify the internet gateway, using a full or partial valid URL: 'https://www.googleapis.com/compute/v1/projects/project/global/gateways/default-internet-gateway' 'projects/project/global/gateways/default-internet-gateway' 'global/gateways/default-internet-gateway' The string 'default-internet-gateway'.
        :param next_hop_ilb: The URL to a forwarding rule of type loadBalancingScheme=INTERNAL that should handle matching packets. You can only specify the forwarding rule as a partial or full URL. For example, the following are all valid URLs: https://www.googleapis.com/compute/v1/projects/project/regions/region/forwardingRules/forwardingRule regions/region/forwardingRules/forwardingRule Note that this can only be used when the destinationRange is a public (non-RFC 1918) IP CIDR range.
        :param next_hop_instance: URL to an instance that should handle matching packets. You can specify this as a full or partial URL. For example: 'https://www.googleapis.com/compute/v1/projects/project/zones/zone/instances/instance' 'projects/project/zones/zone/instances/instance' 'zones/zone/instances/instance' Just the instance name, with the zone in 'next_hop_instance_zone'.
        :param next_hop_instance_zone: 
        :param next_hop_ip: Network IP address of an instance that should handle matching packets.
        :param next_hop_vpn_tunnel: URL to a VpnTunnel that should handle matching packets.
        :param priority: The priority of this route. Priority is used to break ties in cases where there is more than one matching route of equal prefix length. In the case of two routes with equal prefix length, the one with the lowest-numbered priority value wins. Default value is 1000. Valid range is 0 through 65535.
        :param project: 
        :param tags: A list of instance tags to which this route applies.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRouteTimeouts(**timeouts)
        self._values = {
            'dest_range': dest_range,
            'name': name,
            'network': network,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if next_hop_gateway is not None: self._values["next_hop_gateway"] = next_hop_gateway
        if next_hop_ilb is not None: self._values["next_hop_ilb"] = next_hop_ilb
        if next_hop_instance is not None: self._values["next_hop_instance"] = next_hop_instance
        if next_hop_instance_zone is not None: self._values["next_hop_instance_zone"] = next_hop_instance_zone
        if next_hop_ip is not None: self._values["next_hop_ip"] = next_hop_ip
        if next_hop_vpn_tunnel is not None: self._values["next_hop_vpn_tunnel"] = next_hop_vpn_tunnel
        if priority is not None: self._values["priority"] = priority
        if project is not None: self._values["project"] = project
        if tags is not None: self._values["tags"] = tags
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dest_range(self) -> str:
        """The destination range of outgoing packets that this route applies to.

        Only IPv4 is supported.
        """
        return self._values.get('dest_range')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035.  Specifically, the name must be 1-63 characters long and
        match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means
        the first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the
        last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def network(self) -> str:
        """The network that this route applies to."""
        return self._values.get('network')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property
        when you create the resource.
        """
        return self._values.get('description')

    @builtins.property
    def next_hop_gateway(self) -> typing.Optional[str]:
        """URL to a gateway that should handle matching packets.

        Currently, you can only specify the internet gateway, using a full or
        partial valid URL:
        'https://www.googleapis.com/compute/v1/projects/project/global/gateways/default-internet-gateway'
        'projects/project/global/gateways/default-internet-gateway'
        'global/gateways/default-internet-gateway'
        The string 'default-internet-gateway'.
        """
        return self._values.get('next_hop_gateway')

    @builtins.property
    def next_hop_ilb(self) -> typing.Optional[str]:
        """The URL to a forwarding rule of type loadBalancingScheme=INTERNAL that should handle matching packets.

        You can only specify the forwarding rule as a partial or full URL. For example, the following are all valid URLs:
        https://www.googleapis.com/compute/v1/projects/project/regions/region/forwardingRules/forwardingRule
        regions/region/forwardingRules/forwardingRule
        Note that this can only be used when the destinationRange is a public (non-RFC 1918) IP CIDR range.
        """
        return self._values.get('next_hop_ilb')

    @builtins.property
    def next_hop_instance(self) -> typing.Optional[str]:
        """URL to an instance that should handle matching packets.

        You can specify this as a full or partial URL. For example:
        'https://www.googleapis.com/compute/v1/projects/project/zones/zone/instances/instance'
        'projects/project/zones/zone/instances/instance'
        'zones/zone/instances/instance'
        Just the instance name, with the zone in 'next_hop_instance_zone'.
        """
        return self._values.get('next_hop_instance')

    @builtins.property
    def next_hop_instance_zone(self) -> typing.Optional[str]:
        return self._values.get('next_hop_instance_zone')

    @builtins.property
    def next_hop_ip(self) -> typing.Optional[str]:
        """Network IP address of an instance that should handle matching packets."""
        return self._values.get('next_hop_ip')

    @builtins.property
    def next_hop_vpn_tunnel(self) -> typing.Optional[str]:
        """URL to a VpnTunnel that should handle matching packets."""
        return self._values.get('next_hop_vpn_tunnel')

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        """The priority of this route.

        Priority is used to break ties in cases
        where there is more than one matching route of equal prefix length.

        In the case of two routes with equal prefix length, the one with the
        lowest-numbered priority value wins.

        Default value is 1000. Valid range is 0 through 65535.
        """
        return self._values.get('priority')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[str]]:
        """A list of instance tags to which this route applies."""
        return self._values.get('tags')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRouteTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouteConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouteTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeRouteTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouteTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRouter(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRouter"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, network: str, bgp: typing.Optional[typing.List["ComputeRouterBgp"]]=None, description: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRouterTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: A reference to the network to which this router belongs.
        :param bgp: bgp block.
        :param description: An optional description of this resource.
        :param project: 
        :param region: Region where the router resides.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRouterConfig(name=name, network=network, bgp=bgp, description=description, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRouter, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: str) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="bgp")
    def bgp(self) -> typing.Optional[typing.List["ComputeRouterBgp"]]:
        return jsii.get(self, "bgp")

    @bgp.setter
    def bgp(self, value: typing.Optional[typing.List["ComputeRouterBgp"]]) -> None:
        jsii.set(self, "bgp", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRouterTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRouterTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterBgp", jsii_struct_bases=[], name_mapping={'asn': 'asn', 'advertised_groups': 'advertisedGroups', 'advertised_ip_ranges': 'advertisedIpRanges', 'advertise_mode': 'advertiseMode'})
class ComputeRouterBgp():
    def __init__(self, *, asn: jsii.Number, advertised_groups: typing.Optional[typing.List[str]]=None, advertised_ip_ranges: typing.Optional[typing.List["ComputeRouterBgpAdvertisedIpRanges"]]=None, advertise_mode: typing.Optional[str]=None) -> None:
        """
        :param asn: Local BGP Autonomous System Number (ASN). Must be an RFC6996 private ASN, either 16-bit or 32-bit. The value will be fixed for this router resource. All VPN tunnels that link to this router will have the same local ASN.
        :param advertised_groups: User-specified list of prefix groups to advertise in custom mode. This field can only be populated if advertiseMode is CUSTOM and is advertised to all peers of the router. These groups will be advertised in addition to any specified prefixes. Leave this field blank to advertise no custom groups. This enum field has the one valid value: ALL_SUBNETS
        :param advertised_ip_ranges: advertised_ip_ranges block.
        :param advertise_mode: User-specified flag to indicate which mode to use for advertisement. Default value: "DEFAULT" Possible values: ["DEFAULT", "CUSTOM"]
        """
        self._values = {
            'asn': asn,
        }
        if advertised_groups is not None: self._values["advertised_groups"] = advertised_groups
        if advertised_ip_ranges is not None: self._values["advertised_ip_ranges"] = advertised_ip_ranges
        if advertise_mode is not None: self._values["advertise_mode"] = advertise_mode

    @builtins.property
    def asn(self) -> jsii.Number:
        """Local BGP Autonomous System Number (ASN).

        Must be an RFC6996
        private ASN, either 16-bit or 32-bit. The value will be fixed for
        this router resource. All VPN tunnels that link to this router
        will have the same local ASN.
        """
        return self._values.get('asn')

    @builtins.property
    def advertised_groups(self) -> typing.Optional[typing.List[str]]:
        """User-specified list of prefix groups to advertise in custom mode.

        This field can only be populated if advertiseMode is CUSTOM and
        is advertised to all peers of the router. These groups will be
        advertised in addition to any specified prefixes. Leave this field
        blank to advertise no custom groups.

        This enum field has the one valid value: ALL_SUBNETS
        """
        return self._values.get('advertised_groups')

    @builtins.property
    def advertised_ip_ranges(self) -> typing.Optional[typing.List["ComputeRouterBgpAdvertisedIpRanges"]]:
        """advertised_ip_ranges block."""
        return self._values.get('advertised_ip_ranges')

    @builtins.property
    def advertise_mode(self) -> typing.Optional[str]:
        """User-specified flag to indicate which mode to use for advertisement.

        Default value: "DEFAULT" Possible values: ["DEFAULT", "CUSTOM"]
        """
        return self._values.get('advertise_mode')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterBgp(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterBgpAdvertisedIpRanges", jsii_struct_bases=[], name_mapping={'range': 'range', 'description': 'description'})
class ComputeRouterBgpAdvertisedIpRanges():
    def __init__(self, *, range: str, description: typing.Optional[str]=None) -> None:
        """
        :param range: The IP range to advertise. The value must be a CIDR-formatted string.
        :param description: User-specified description for the IP range.
        """
        self._values = {
            'range': range,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def range(self) -> str:
        """The IP range to advertise.

        The value must be a
        CIDR-formatted string.
        """
        return self._values.get('range')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """User-specified description for the IP range."""
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterBgpAdvertisedIpRanges(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'network': 'network', 'bgp': 'bgp', 'description': 'description', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class ComputeRouterConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, network: str, bgp: typing.Optional[typing.List["ComputeRouterBgp"]]=None, description: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRouterTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: A reference to the network to which this router belongs.
        :param bgp: bgp block.
        :param description: An optional description of this resource.
        :param project: 
        :param region: Region where the router resides.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRouterTimeouts(**timeouts)
        self._values = {
            'name': name,
            'network': network,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if bgp is not None: self._values["bgp"] = bgp
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        The name must be 1-63 characters long, and
        comply with RFC1035. Specifically, the name must be 1-63 characters
        long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?'
        which means the first character must be a lowercase letter, and all
        following characters must be a dash, lowercase letter, or digit,
        except the last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def network(self) -> str:
        """A reference to the network to which this router belongs."""
        return self._values.get('network')

    @builtins.property
    def bgp(self) -> typing.Optional[typing.List["ComputeRouterBgp"]]:
        """bgp block."""
        return self._values.get('bgp')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """Region where the router resides."""
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRouterTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRouterInterface(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRouterInterface"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, router: str, interconnect_attachment: typing.Optional[str]=None, ip_range: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRouterInterfaceTimeouts"]=None, vpn_tunnel: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: A unique name for the interface, required by GCE. Changing this forces a new interface to be created.
        :param router: The name of the router this interface will be attached to. Changing this forces a new interface to be created.
        :param interconnect_attachment: The name or resource link to the VLAN interconnect for this interface. Changing this forces a new interface to be created. Only one of vpn_tunnel and interconnect_attachment can be specified.
        :param ip_range: IP address and range of the interface. The IP range must be in the RFC3927 link-local IP space. Changing this forces a new interface to be created.
        :param project: The ID of the project in which this interface's router belongs. If it is not provided, the provider project is used. Changing this forces a new interface to be created.
        :param region: The region this interface's router sits in. If not specified, the project region will be used. Changing this forces a new interface to be created.
        :param timeouts: timeouts block.
        :param vpn_tunnel: The name or resource link to the VPN tunnel this interface will be linked to. Changing this forces a new interface to be created. Only one of vpn_tunnel and interconnect_attachment can be specified.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRouterInterfaceConfig(name=name, router=router, interconnect_attachment=interconnect_attachment, ip_range=ip_range, project=project, region=region, timeouts=timeouts, vpn_tunnel=vpn_tunnel, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRouterInterface, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="router")
    def router(self) -> str:
        return jsii.get(self, "router")

    @router.setter
    def router(self, value: str) -> None:
        jsii.set(self, "router", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="interconnectAttachment")
    def interconnect_attachment(self) -> typing.Optional[str]:
        return jsii.get(self, "interconnectAttachment")

    @interconnect_attachment.setter
    def interconnect_attachment(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "interconnectAttachment", value)

    @builtins.property
    @jsii.member(jsii_name="ipRange")
    def ip_range(self) -> typing.Optional[str]:
        return jsii.get(self, "ipRange")

    @ip_range.setter
    def ip_range(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "ipRange", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRouterInterfaceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRouterInterfaceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="vpnTunnel")
    def vpn_tunnel(self) -> typing.Optional[str]:
        return jsii.get(self, "vpnTunnel")

    @vpn_tunnel.setter
    def vpn_tunnel(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "vpnTunnel", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterInterfaceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'router': 'router', 'interconnect_attachment': 'interconnectAttachment', 'ip_range': 'ipRange', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts', 'vpn_tunnel': 'vpnTunnel'})
class ComputeRouterInterfaceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, router: str, interconnect_attachment: typing.Optional[str]=None, ip_range: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRouterInterfaceTimeouts"]=None, vpn_tunnel: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: A unique name for the interface, required by GCE. Changing this forces a new interface to be created.
        :param router: The name of the router this interface will be attached to. Changing this forces a new interface to be created.
        :param interconnect_attachment: The name or resource link to the VLAN interconnect for this interface. Changing this forces a new interface to be created. Only one of vpn_tunnel and interconnect_attachment can be specified.
        :param ip_range: IP address and range of the interface. The IP range must be in the RFC3927 link-local IP space. Changing this forces a new interface to be created.
        :param project: The ID of the project in which this interface's router belongs. If it is not provided, the provider project is used. Changing this forces a new interface to be created.
        :param region: The region this interface's router sits in. If not specified, the project region will be used. Changing this forces a new interface to be created.
        :param timeouts: timeouts block.
        :param vpn_tunnel: The name or resource link to the VPN tunnel this interface will be linked to. Changing this forces a new interface to be created. Only one of vpn_tunnel and interconnect_attachment can be specified.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRouterInterfaceTimeouts(**timeouts)
        self._values = {
            'name': name,
            'router': router,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if interconnect_attachment is not None: self._values["interconnect_attachment"] = interconnect_attachment
        if ip_range is not None: self._values["ip_range"] = ip_range
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts
        if vpn_tunnel is not None: self._values["vpn_tunnel"] = vpn_tunnel

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """A unique name for the interface, required by GCE.

        Changing this forces a new interface to be created.
        """
        return self._values.get('name')

    @builtins.property
    def router(self) -> str:
        """The name of the router this interface will be attached to.

        Changing this forces a new interface to be created.
        """
        return self._values.get('router')

    @builtins.property
    def interconnect_attachment(self) -> typing.Optional[str]:
        """The name or resource link to the VLAN interconnect for this interface.

        Changing this forces a new interface to be created. Only one of vpn_tunnel and interconnect_attachment can be specified.
        """
        return self._values.get('interconnect_attachment')

    @builtins.property
    def ip_range(self) -> typing.Optional[str]:
        """IP address and range of the interface.

        The IP range must be in the RFC3927 link-local IP space. Changing this forces a new interface to be created.
        """
        return self._values.get('ip_range')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which this interface's router belongs.

        If it is not provided, the provider project is used. Changing this forces a new interface to be created.
        """
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The region this interface's router sits in.

        If not specified, the project region will be used. Changing this forces a new interface to be created.
        """
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRouterInterfaceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def vpn_tunnel(self) -> typing.Optional[str]:
        """The name or resource link to the VPN tunnel this interface will be linked to.

        Changing this forces a new interface to be created. Only one of vpn_tunnel and interconnect_attachment can be specified.
        """
        return self._values.get('vpn_tunnel')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterInterfaceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterInterfaceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeRouterInterfaceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterInterfaceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRouterNat(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRouterNat"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, nat_ip_allocate_option: str, router: str, source_subnetwork_ip_ranges_to_nat: str, drain_nat_ips: typing.Optional[typing.List[str]]=None, icmp_idle_timeout_sec: typing.Optional[jsii.Number]=None, log_config: typing.Optional[typing.List["ComputeRouterNatLogConfig"]]=None, min_ports_per_vm: typing.Optional[jsii.Number]=None, nat_ips: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, subnetwork: typing.Optional[typing.List["ComputeRouterNatSubnetwork"]]=None, tcp_established_idle_timeout_sec: typing.Optional[jsii.Number]=None, tcp_transitory_idle_timeout_sec: typing.Optional[jsii.Number]=None, timeouts: typing.Optional["ComputeRouterNatTimeouts"]=None, udp_idle_timeout_sec: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the NAT service. The name must be 1-63 characters long and comply with RFC1035.
        :param nat_ip_allocate_option: 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. Possible values: ["MANUAL_ONLY", "AUTO_ONLY"]
        :param router: The name of the Cloud Router in which this NAT will be configured.
        :param source_subnetwork_ip_ranges_to_nat: 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. Possible values: ["ALL_SUBNETWORKS_ALL_IP_RANGES", "ALL_SUBNETWORKS_ALL_PRIMARY_IP_RANGES", "LIST_OF_SUBNETWORKS"]
        :param drain_nat_ips: 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.
        :param icmp_idle_timeout_sec: Timeout (in seconds) for ICMP connections. Defaults to 30s if not set.
        :param log_config: log_config block.
        :param min_ports_per_vm: Minimum number of ports allocated to a VM from this NAT.
        :param nat_ips: Self-links of NAT IPs. Only valid if natIpAllocateOption is set to MANUAL_ONLY.
        :param project: 
        :param region: Region where the router and NAT reside.
        :param subnetwork: subnetwork block.
        :param tcp_established_idle_timeout_sec: Timeout (in seconds) for TCP established connections. Defaults to 1200s if not set.
        :param tcp_transitory_idle_timeout_sec: Timeout (in seconds) for TCP transitory connections. Defaults to 30s if not set.
        :param timeouts: timeouts block.
        :param udp_idle_timeout_sec: Timeout (in seconds) for UDP connections. Defaults to 30s if not set.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRouterNatConfig(name=name, nat_ip_allocate_option=nat_ip_allocate_option, router=router, source_subnetwork_ip_ranges_to_nat=source_subnetwork_ip_ranges_to_nat, drain_nat_ips=drain_nat_ips, icmp_idle_timeout_sec=icmp_idle_timeout_sec, log_config=log_config, min_ports_per_vm=min_ports_per_vm, nat_ips=nat_ips, project=project, region=region, subnetwork=subnetwork, tcp_established_idle_timeout_sec=tcp_established_idle_timeout_sec, tcp_transitory_idle_timeout_sec=tcp_transitory_idle_timeout_sec, timeouts=timeouts, udp_idle_timeout_sec=udp_idle_timeout_sec, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRouterNat, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="natIpAllocateOption")
    def nat_ip_allocate_option(self) -> str:
        return jsii.get(self, "natIpAllocateOption")

    @nat_ip_allocate_option.setter
    def nat_ip_allocate_option(self, value: str) -> None:
        jsii.set(self, "natIpAllocateOption", value)

    @builtins.property
    @jsii.member(jsii_name="router")
    def router(self) -> str:
        return jsii.get(self, "router")

    @router.setter
    def router(self, value: str) -> None:
        jsii.set(self, "router", value)

    @builtins.property
    @jsii.member(jsii_name="sourceSubnetworkIpRangesToNat")
    def source_subnetwork_ip_ranges_to_nat(self) -> str:
        return jsii.get(self, "sourceSubnetworkIpRangesToNat")

    @source_subnetwork_ip_ranges_to_nat.setter
    def source_subnetwork_ip_ranges_to_nat(self, value: str) -> None:
        jsii.set(self, "sourceSubnetworkIpRangesToNat", value)

    @builtins.property
    @jsii.member(jsii_name="drainNatIps")
    def drain_nat_ips(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "drainNatIps")

    @drain_nat_ips.setter
    def drain_nat_ips(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "drainNatIps", value)

    @builtins.property
    @jsii.member(jsii_name="icmpIdleTimeoutSec")
    def icmp_idle_timeout_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "icmpIdleTimeoutSec")

    @icmp_idle_timeout_sec.setter
    def icmp_idle_timeout_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "icmpIdleTimeoutSec", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="logConfig")
    def log_config(self) -> typing.Optional[typing.List["ComputeRouterNatLogConfig"]]:
        return jsii.get(self, "logConfig")

    @log_config.setter
    def log_config(self, value: typing.Optional[typing.List["ComputeRouterNatLogConfig"]]) -> None:
        jsii.set(self, "logConfig", value)

    @builtins.property
    @jsii.member(jsii_name="minPortsPerVm")
    def min_ports_per_vm(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "minPortsPerVm")

    @min_ports_per_vm.setter
    def min_ports_per_vm(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "minPortsPerVm", value)

    @builtins.property
    @jsii.member(jsii_name="natIps")
    def nat_ips(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "natIps")

    @nat_ips.setter
    def nat_ips(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "natIps", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> typing.Optional[typing.List["ComputeRouterNatSubnetwork"]]:
        return jsii.get(self, "subnetwork")

    @subnetwork.setter
    def subnetwork(self, value: typing.Optional[typing.List["ComputeRouterNatSubnetwork"]]) -> None:
        jsii.set(self, "subnetwork", value)

    @builtins.property
    @jsii.member(jsii_name="tcpEstablishedIdleTimeoutSec")
    def tcp_established_idle_timeout_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "tcpEstablishedIdleTimeoutSec")

    @tcp_established_idle_timeout_sec.setter
    def tcp_established_idle_timeout_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "tcpEstablishedIdleTimeoutSec", value)

    @builtins.property
    @jsii.member(jsii_name="tcpTransitoryIdleTimeoutSec")
    def tcp_transitory_idle_timeout_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "tcpTransitoryIdleTimeoutSec")

    @tcp_transitory_idle_timeout_sec.setter
    def tcp_transitory_idle_timeout_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "tcpTransitoryIdleTimeoutSec", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRouterNatTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRouterNatTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="udpIdleTimeoutSec")
    def udp_idle_timeout_sec(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "udpIdleTimeoutSec")

    @udp_idle_timeout_sec.setter
    def udp_idle_timeout_sec(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "udpIdleTimeoutSec", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterNatConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'nat_ip_allocate_option': 'natIpAllocateOption', 'router': 'router', 'source_subnetwork_ip_ranges_to_nat': 'sourceSubnetworkIpRangesToNat', 'drain_nat_ips': 'drainNatIps', 'icmp_idle_timeout_sec': 'icmpIdleTimeoutSec', 'log_config': 'logConfig', 'min_ports_per_vm': 'minPortsPerVm', 'nat_ips': 'natIps', 'project': 'project', 'region': 'region', 'subnetwork': 'subnetwork', 'tcp_established_idle_timeout_sec': 'tcpEstablishedIdleTimeoutSec', 'tcp_transitory_idle_timeout_sec': 'tcpTransitoryIdleTimeoutSec', 'timeouts': 'timeouts', 'udp_idle_timeout_sec': 'udpIdleTimeoutSec'})
class ComputeRouterNatConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, nat_ip_allocate_option: str, router: str, source_subnetwork_ip_ranges_to_nat: str, drain_nat_ips: typing.Optional[typing.List[str]]=None, icmp_idle_timeout_sec: typing.Optional[jsii.Number]=None, log_config: typing.Optional[typing.List["ComputeRouterNatLogConfig"]]=None, min_ports_per_vm: typing.Optional[jsii.Number]=None, nat_ips: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, subnetwork: typing.Optional[typing.List["ComputeRouterNatSubnetwork"]]=None, tcp_established_idle_timeout_sec: typing.Optional[jsii.Number]=None, tcp_transitory_idle_timeout_sec: typing.Optional[jsii.Number]=None, timeouts: typing.Optional["ComputeRouterNatTimeouts"]=None, udp_idle_timeout_sec: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the NAT service. The name must be 1-63 characters long and comply with RFC1035.
        :param nat_ip_allocate_option: 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. Possible values: ["MANUAL_ONLY", "AUTO_ONLY"]
        :param router: The name of the Cloud Router in which this NAT will be configured.
        :param source_subnetwork_ip_ranges_to_nat: 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. Possible values: ["ALL_SUBNETWORKS_ALL_IP_RANGES", "ALL_SUBNETWORKS_ALL_PRIMARY_IP_RANGES", "LIST_OF_SUBNETWORKS"]
        :param drain_nat_ips: 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.
        :param icmp_idle_timeout_sec: Timeout (in seconds) for ICMP connections. Defaults to 30s if not set.
        :param log_config: log_config block.
        :param min_ports_per_vm: Minimum number of ports allocated to a VM from this NAT.
        :param nat_ips: Self-links of NAT IPs. Only valid if natIpAllocateOption is set to MANUAL_ONLY.
        :param project: 
        :param region: Region where the router and NAT reside.
        :param subnetwork: subnetwork block.
        :param tcp_established_idle_timeout_sec: Timeout (in seconds) for TCP established connections. Defaults to 1200s if not set.
        :param tcp_transitory_idle_timeout_sec: Timeout (in seconds) for TCP transitory connections. Defaults to 30s if not set.
        :param timeouts: timeouts block.
        :param udp_idle_timeout_sec: Timeout (in seconds) for UDP connections. Defaults to 30s if not set.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRouterNatTimeouts(**timeouts)
        self._values = {
            'name': name,
            'nat_ip_allocate_option': nat_ip_allocate_option,
            'router': router,
            'source_subnetwork_ip_ranges_to_nat': source_subnetwork_ip_ranges_to_nat,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if drain_nat_ips is not None: self._values["drain_nat_ips"] = drain_nat_ips
        if icmp_idle_timeout_sec is not None: self._values["icmp_idle_timeout_sec"] = icmp_idle_timeout_sec
        if log_config is not None: self._values["log_config"] = log_config
        if min_ports_per_vm is not None: self._values["min_ports_per_vm"] = min_ports_per_vm
        if nat_ips is not None: self._values["nat_ips"] = nat_ips
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if subnetwork is not None: self._values["subnetwork"] = subnetwork
        if tcp_established_idle_timeout_sec is not None: self._values["tcp_established_idle_timeout_sec"] = tcp_established_idle_timeout_sec
        if tcp_transitory_idle_timeout_sec is not None: self._values["tcp_transitory_idle_timeout_sec"] = tcp_transitory_idle_timeout_sec
        if timeouts is not None: self._values["timeouts"] = timeouts
        if udp_idle_timeout_sec is not None: self._values["udp_idle_timeout_sec"] = udp_idle_timeout_sec

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the NAT service.

        The name must be 1-63 characters long and
        comply with RFC1035.
        """
        return self._values.get('name')

    @builtins.property
    def nat_ip_allocate_option(self) -> str:
        """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. Possible values: ["MANUAL_ONLY", "AUTO_ONLY"]
        """
        return self._values.get('nat_ip_allocate_option')

    @builtins.property
    def router(self) -> str:
        """The name of the Cloud Router in which this NAT will be configured."""
        return self._values.get('router')

    @builtins.property
    def source_subnetwork_ip_ranges_to_nat(self) -> str:
        """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. Possible values: ["ALL_SUBNETWORKS_ALL_IP_RANGES", "ALL_SUBNETWORKS_ALL_PRIMARY_IP_RANGES", "LIST_OF_SUBNETWORKS"]
        """
        return self._values.get('source_subnetwork_ip_ranges_to_nat')

    @builtins.property
    def drain_nat_ips(self) -> typing.Optional[typing.List[str]]:
        """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.
        """
        return self._values.get('drain_nat_ips')

    @builtins.property
    def icmp_idle_timeout_sec(self) -> typing.Optional[jsii.Number]:
        """Timeout (in seconds) for ICMP connections.

        Defaults to 30s if not set.
        """
        return self._values.get('icmp_idle_timeout_sec')

    @builtins.property
    def log_config(self) -> typing.Optional[typing.List["ComputeRouterNatLogConfig"]]:
        """log_config block."""
        return self._values.get('log_config')

    @builtins.property
    def min_ports_per_vm(self) -> typing.Optional[jsii.Number]:
        """Minimum number of ports allocated to a VM from this NAT."""
        return self._values.get('min_ports_per_vm')

    @builtins.property
    def nat_ips(self) -> typing.Optional[typing.List[str]]:
        """Self-links of NAT IPs.

        Only valid if natIpAllocateOption
        is set to MANUAL_ONLY.
        """
        return self._values.get('nat_ips')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """Region where the router and NAT reside."""
        return self._values.get('region')

    @builtins.property
    def subnetwork(self) -> typing.Optional[typing.List["ComputeRouterNatSubnetwork"]]:
        """subnetwork block."""
        return self._values.get('subnetwork')

    @builtins.property
    def tcp_established_idle_timeout_sec(self) -> typing.Optional[jsii.Number]:
        """Timeout (in seconds) for TCP established connections.

        Defaults to 1200s if not set.
        """
        return self._values.get('tcp_established_idle_timeout_sec')

    @builtins.property
    def tcp_transitory_idle_timeout_sec(self) -> typing.Optional[jsii.Number]:
        """Timeout (in seconds) for TCP transitory connections.

        Defaults to 30s if not set.
        """
        return self._values.get('tcp_transitory_idle_timeout_sec')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRouterNatTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def udp_idle_timeout_sec(self) -> typing.Optional[jsii.Number]:
        """Timeout (in seconds) for UDP connections.

        Defaults to 30s if not set.
        """
        return self._values.get('udp_idle_timeout_sec')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterNatConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterNatLogConfig", jsii_struct_bases=[], name_mapping={'enable': 'enable', 'filter': 'filter'})
class ComputeRouterNatLogConfig():
    def __init__(self, *, enable: bool, filter: str) -> None:
        """
        :param enable: Indicates whether or not to export logs.
        :param filter: Specifies the desired filtering of logs on this NAT. Possible values: ["ERRORS_ONLY", "TRANSLATIONS_ONLY", "ALL"]
        """
        self._values = {
            'enable': enable,
            'filter': filter,
        }

    @builtins.property
    def enable(self) -> bool:
        """Indicates whether or not to export logs."""
        return self._values.get('enable')

    @builtins.property
    def filter(self) -> str:
        """Specifies the desired filtering of logs on this NAT.

        Possible values: ["ERRORS_ONLY", "TRANSLATIONS_ONLY", "ALL"]
        """
        return self._values.get('filter')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterNatLogConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterNatSubnetwork", jsii_struct_bases=[], name_mapping={'name': 'name', 'source_ip_ranges_to_nat': 'sourceIpRangesToNat', 'secondary_ip_range_names': 'secondaryIpRangeNames'})
class ComputeRouterNatSubnetwork():
    def __init__(self, *, name: str, source_ip_ranges_to_nat: typing.List[str], secondary_ip_range_names: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param name: Self-link of subnetwork to NAT.
        :param source_ip_ranges_to_nat: 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'.
        :param secondary_ip_range_names: 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
        """
        self._values = {
            'name': name,
            'source_ip_ranges_to_nat': source_ip_ranges_to_nat,
        }
        if secondary_ip_range_names is not None: self._values["secondary_ip_range_names"] = secondary_ip_range_names

    @builtins.property
    def name(self) -> str:
        """Self-link of subnetwork to NAT."""
        return self._values.get('name')

    @builtins.property
    def source_ip_ranges_to_nat(self) -> typing.List[str]:
        """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'.
        """
        return self._values.get('source_ip_ranges_to_nat')

    @builtins.property
    def secondary_ip_range_names(self) -> typing.Optional[typing.List[str]]:
        """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
        """
        return self._values.get('secondary_ip_range_names')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterNatSubnetwork(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterNatTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeRouterNatTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterNatTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeRouterPeer(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeRouterPeer"):
    def __init__(self, scope: constructs.Construct, id: str, *, interface: str, name: str, peer_asn: jsii.Number, peer_ip_address: str, router: str, advertised_groups: typing.Optional[typing.List[str]]=None, advertised_ip_ranges: typing.Optional[typing.List["ComputeRouterPeerAdvertisedIpRanges"]]=None, advertised_route_priority: typing.Optional[jsii.Number]=None, advertise_mode: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRouterPeerTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param interface: Name of the interface the BGP peer is associated with.
        :param name: Name of this BGP peer. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param peer_asn: Peer BGP Autonomous System Number (ASN). Each BGP interface may use a different value.
        :param peer_ip_address: IP address of the BGP interface outside Google Cloud Platform. Only IPv4 is supported.
        :param router: The name of the Cloud Router in which this BgpPeer will be configured.
        :param advertised_groups: User-specified list of prefix groups to advertise in custom mode, which can take one of the following options:. 'ALL_SUBNETS': Advertises all available subnets, including peer VPC subnets. 'ALL_VPC_SUBNETS': Advertises the router's own VPC subnets. 'ALL_PEER_VPC_SUBNETS': Advertises peer subnets of the router's VPC network. Note that this field can only be populated if advertiseMode is 'CUSTOM' and overrides the list defined for the router (in the "bgp" message). These groups are advertised in addition to any specified prefixes. Leave this field blank to advertise no custom groups.
        :param advertised_ip_ranges: advertised_ip_ranges block.
        :param advertised_route_priority: The priority of routes advertised to this BGP peer. Where there is more than one matching route of maximum length, the routes with the lowest priority value win.
        :param advertise_mode: User-specified flag to indicate which mode to use for advertisement. Valid values of this enum field are: 'DEFAULT', 'CUSTOM' Default value: "DEFAULT" Possible values: ["DEFAULT", "CUSTOM"]
        :param project: 
        :param region: Region where the router and BgpPeer reside. If it is not provided, the provider region is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeRouterPeerConfig(interface=interface, name=name, peer_asn=peer_asn, peer_ip_address=peer_ip_address, router=router, advertised_groups=advertised_groups, advertised_ip_ranges=advertised_ip_ranges, advertised_route_priority=advertised_route_priority, advertise_mode=advertise_mode, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeRouterPeer, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> str:
        return jsii.get(self, "ipAddress")

    @builtins.property
    @jsii.member(jsii_name="managementType")
    def management_type(self) -> str:
        return jsii.get(self, "managementType")

    @builtins.property
    @jsii.member(jsii_name="interface")
    def interface(self) -> str:
        return jsii.get(self, "interface")

    @interface.setter
    def interface(self, value: str) -> None:
        jsii.set(self, "interface", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="peerAsn")
    def peer_asn(self) -> jsii.Number:
        return jsii.get(self, "peerAsn")

    @peer_asn.setter
    def peer_asn(self, value: jsii.Number) -> None:
        jsii.set(self, "peerAsn", value)

    @builtins.property
    @jsii.member(jsii_name="peerIpAddress")
    def peer_ip_address(self) -> str:
        return jsii.get(self, "peerIpAddress")

    @peer_ip_address.setter
    def peer_ip_address(self, value: str) -> None:
        jsii.set(self, "peerIpAddress", value)

    @builtins.property
    @jsii.member(jsii_name="router")
    def router(self) -> str:
        return jsii.get(self, "router")

    @router.setter
    def router(self, value: str) -> None:
        jsii.set(self, "router", value)

    @builtins.property
    @jsii.member(jsii_name="advertisedGroups")
    def advertised_groups(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "advertisedGroups")

    @advertised_groups.setter
    def advertised_groups(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "advertisedGroups", value)

    @builtins.property
    @jsii.member(jsii_name="advertisedIpRanges")
    def advertised_ip_ranges(self) -> typing.Optional[typing.List["ComputeRouterPeerAdvertisedIpRanges"]]:
        return jsii.get(self, "advertisedIpRanges")

    @advertised_ip_ranges.setter
    def advertised_ip_ranges(self, value: typing.Optional[typing.List["ComputeRouterPeerAdvertisedIpRanges"]]) -> None:
        jsii.set(self, "advertisedIpRanges", value)

    @builtins.property
    @jsii.member(jsii_name="advertisedRoutePriority")
    def advertised_route_priority(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "advertisedRoutePriority")

    @advertised_route_priority.setter
    def advertised_route_priority(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "advertisedRoutePriority", value)

    @builtins.property
    @jsii.member(jsii_name="advertiseMode")
    def advertise_mode(self) -> typing.Optional[str]:
        return jsii.get(self, "advertiseMode")

    @advertise_mode.setter
    def advertise_mode(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "advertiseMode", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeRouterPeerTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeRouterPeerTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterPeerAdvertisedIpRanges", jsii_struct_bases=[], name_mapping={'range': 'range', 'description': 'description'})
class ComputeRouterPeerAdvertisedIpRanges():
    def __init__(self, *, range: str, description: typing.Optional[str]=None) -> None:
        """
        :param range: The IP range to advertise. The value must be a CIDR-formatted string.
        :param description: User-specified description for the IP range.
        """
        self._values = {
            'range': range,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def range(self) -> str:
        """The IP range to advertise.

        The value must be a
        CIDR-formatted string.
        """
        return self._values.get('range')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """User-specified description for the IP range."""
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterPeerAdvertisedIpRanges(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterPeerConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'interface': 'interface', 'name': 'name', 'peer_asn': 'peerAsn', 'peer_ip_address': 'peerIpAddress', 'router': 'router', 'advertised_groups': 'advertisedGroups', 'advertised_ip_ranges': 'advertisedIpRanges', 'advertised_route_priority': 'advertisedRoutePriority', 'advertise_mode': 'advertiseMode', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class ComputeRouterPeerConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, interface: str, name: str, peer_asn: jsii.Number, peer_ip_address: str, router: str, advertised_groups: typing.Optional[typing.List[str]]=None, advertised_ip_ranges: typing.Optional[typing.List["ComputeRouterPeerAdvertisedIpRanges"]]=None, advertised_route_priority: typing.Optional[jsii.Number]=None, advertise_mode: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeRouterPeerTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param interface: Name of the interface the BGP peer is associated with.
        :param name: Name of this BGP peer. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param peer_asn: Peer BGP Autonomous System Number (ASN). Each BGP interface may use a different value.
        :param peer_ip_address: IP address of the BGP interface outside Google Cloud Platform. Only IPv4 is supported.
        :param router: The name of the Cloud Router in which this BgpPeer will be configured.
        :param advertised_groups: User-specified list of prefix groups to advertise in custom mode, which can take one of the following options:. 'ALL_SUBNETS': Advertises all available subnets, including peer VPC subnets. 'ALL_VPC_SUBNETS': Advertises the router's own VPC subnets. 'ALL_PEER_VPC_SUBNETS': Advertises peer subnets of the router's VPC network. Note that this field can only be populated if advertiseMode is 'CUSTOM' and overrides the list defined for the router (in the "bgp" message). These groups are advertised in addition to any specified prefixes. Leave this field blank to advertise no custom groups.
        :param advertised_ip_ranges: advertised_ip_ranges block.
        :param advertised_route_priority: The priority of routes advertised to this BGP peer. Where there is more than one matching route of maximum length, the routes with the lowest priority value win.
        :param advertise_mode: User-specified flag to indicate which mode to use for advertisement. Valid values of this enum field are: 'DEFAULT', 'CUSTOM' Default value: "DEFAULT" Possible values: ["DEFAULT", "CUSTOM"]
        :param project: 
        :param region: Region where the router and BgpPeer reside. If it is not provided, the provider region is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeRouterPeerTimeouts(**timeouts)
        self._values = {
            'interface': interface,
            'name': name,
            'peer_asn': peer_asn,
            'peer_ip_address': peer_ip_address,
            'router': router,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if advertised_groups is not None: self._values["advertised_groups"] = advertised_groups
        if advertised_ip_ranges is not None: self._values["advertised_ip_ranges"] = advertised_ip_ranges
        if advertised_route_priority is not None: self._values["advertised_route_priority"] = advertised_route_priority
        if advertise_mode is not None: self._values["advertise_mode"] = advertise_mode
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def interface(self) -> str:
        """Name of the interface the BGP peer is associated with."""
        return self._values.get('interface')

    @builtins.property
    def name(self) -> str:
        """Name of this BGP peer.

        The name must be 1-63 characters long,
        and comply with RFC1035. Specifically, the name must be 1-63 characters
        long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which
        means the first character must be a lowercase letter, and all
        following characters must be a dash, lowercase letter, or digit,
        except the last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def peer_asn(self) -> jsii.Number:
        """Peer BGP Autonomous System Number (ASN).

        Each BGP interface may use a different value.
        """
        return self._values.get('peer_asn')

    @builtins.property
    def peer_ip_address(self) -> str:
        """IP address of the BGP interface outside Google Cloud Platform.

        Only IPv4 is supported.
        """
        return self._values.get('peer_ip_address')

    @builtins.property
    def router(self) -> str:
        """The name of the Cloud Router in which this BgpPeer will be configured."""
        return self._values.get('router')

    @builtins.property
    def advertised_groups(self) -> typing.Optional[typing.List[str]]:
        """User-specified list of prefix groups to advertise in custom mode, which can take one of the following options:.

        'ALL_SUBNETS': Advertises all available subnets, including peer VPC subnets.
        'ALL_VPC_SUBNETS': Advertises the router's own VPC subnets.
        'ALL_PEER_VPC_SUBNETS': Advertises peer subnets of the router's VPC network.

        Note that this field can only be populated if advertiseMode is 'CUSTOM'
        and overrides the list defined for the router (in the "bgp" message).
        These groups are advertised in addition to any specified prefixes.
        Leave this field blank to advertise no custom groups.
        """
        return self._values.get('advertised_groups')

    @builtins.property
    def advertised_ip_ranges(self) -> typing.Optional[typing.List["ComputeRouterPeerAdvertisedIpRanges"]]:
        """advertised_ip_ranges block."""
        return self._values.get('advertised_ip_ranges')

    @builtins.property
    def advertised_route_priority(self) -> typing.Optional[jsii.Number]:
        """The priority of routes advertised to this BGP peer.

        Where there is more than one matching route of maximum
        length, the routes with the lowest priority value win.
        """
        return self._values.get('advertised_route_priority')

    @builtins.property
    def advertise_mode(self) -> typing.Optional[str]:
        """User-specified flag to indicate which mode to use for advertisement.

        Valid values of this enum field are: 'DEFAULT', 'CUSTOM' Default value: "DEFAULT" Possible values: ["DEFAULT", "CUSTOM"]
        """
        return self._values.get('advertise_mode')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """Region where the router and BgpPeer reside.

        If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeRouterPeerTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterPeerConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterPeerTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeRouterPeerTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterPeerTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeRouterTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeRouterTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeRouterTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeSecurityPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeSecurityPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, rule: typing.Optional[typing.List["ComputeSecurityPolicyRule"]]=None, timeouts: typing.Optional["ComputeSecurityPolicyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the security policy.
        :param description: An optional description of this security policy. Max size is 2048.
        :param project: The project in which the resource belongs. If it is not provided, the provider project is used.
        :param rule: rule block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeSecurityPolicyConfig(name=name, description=description, project=project, rule=rule, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeSecurityPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="fingerprint")
    def fingerprint(self) -> str:
        return jsii.get(self, "fingerprint")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="rule")
    def rule(self) -> typing.Optional[typing.List["ComputeSecurityPolicyRule"]]:
        return jsii.get(self, "rule")

    @rule.setter
    def rule(self, value: typing.Optional[typing.List["ComputeSecurityPolicyRule"]]) -> None:
        jsii.set(self, "rule", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeSecurityPolicyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeSecurityPolicyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSecurityPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'description': 'description', 'project': 'project', 'rule': 'rule', 'timeouts': 'timeouts'})
class ComputeSecurityPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, rule: typing.Optional[typing.List["ComputeSecurityPolicyRule"]]=None, timeouts: typing.Optional["ComputeSecurityPolicyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the security policy.
        :param description: An optional description of this security policy. Max size is 2048.
        :param project: The project in which the resource belongs. If it is not provided, the provider project is used.
        :param rule: rule block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeSecurityPolicyTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if rule is not None: self._values["rule"] = rule
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name of the security policy."""
        return self._values.get('name')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this security policy.

        Max size is 2048.
        """
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def rule(self) -> typing.Optional[typing.List["ComputeSecurityPolicyRule"]]:
        """rule block."""
        return self._values.get('rule')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeSecurityPolicyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSecurityPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSecurityPolicyRule", jsii_struct_bases=[], name_mapping={'action': 'action', 'match': 'match', 'priority': 'priority', 'description': 'description', 'preview': 'preview'})
class ComputeSecurityPolicyRule():
    def __init__(self, *, action: str, match: typing.List["ComputeSecurityPolicyRuleMatch"], priority: jsii.Number, description: typing.Optional[str]=None, preview: typing.Optional[bool]=None) -> None:
        """
        :param action: Action to take when match matches the request. Valid values: "allow" : allow access to target, "deny(status)" : deny access to target, returns the HTTP response code specified (valid values are 403, 404 and 502)
        :param match: match block.
        :param priority: An unique positive integer indicating the priority of evaluation for a rule. Rules are evaluated from highest priority (lowest numerically) to lowest priority (highest numerically) in order.
        :param description: An optional description of this rule. Max size is 64.
        :param preview: When set to true, the action specified above is not enforced. Stackdriver logs for requests that trigger a preview action are annotated as such.
        """
        self._values = {
            'action': action,
            'match': match,
            'priority': priority,
        }
        if description is not None: self._values["description"] = description
        if preview is not None: self._values["preview"] = preview

    @builtins.property
    def action(self) -> str:
        """Action to take when match matches the request.

        Valid values:   "allow" : allow access to target, "deny(status)" : deny access to target, returns the HTTP response code specified (valid values are 403, 404 and 502)
        """
        return self._values.get('action')

    @builtins.property
    def match(self) -> typing.List["ComputeSecurityPolicyRuleMatch"]:
        """match block."""
        return self._values.get('match')

    @builtins.property
    def priority(self) -> jsii.Number:
        """An unique positive integer indicating the priority of evaluation for a rule.

        Rules are evaluated from highest priority (lowest numerically) to lowest priority (highest numerically) in order.
        """
        return self._values.get('priority')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this rule.

        Max size is 64.
        """
        return self._values.get('description')

    @builtins.property
    def preview(self) -> typing.Optional[bool]:
        """When set to true, the action specified above is not enforced.

        Stackdriver logs for requests that trigger a preview action are annotated as such.
        """
        return self._values.get('preview')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSecurityPolicyRule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSecurityPolicyRuleMatch", jsii_struct_bases=[], name_mapping={'config': 'config', 'expr': 'expr', 'versioned_expr': 'versionedExpr'})
class ComputeSecurityPolicyRuleMatch():
    def __init__(self, *, config: typing.Optional[typing.List["ComputeSecurityPolicyRuleMatchConfig"]]=None, expr: typing.Optional[typing.List["ComputeSecurityPolicyRuleMatchExpr"]]=None, versioned_expr: typing.Optional[str]=None) -> None:
        """
        :param config: config block.
        :param expr: expr block.
        :param versioned_expr: Predefined rule expression. If this field is specified, config must also be specified. Available options: SRC_IPS_V1: Must specify the corresponding src_ip_ranges field in config.
        """
        self._values = {
        }
        if config is not None: self._values["config"] = config
        if expr is not None: self._values["expr"] = expr
        if versioned_expr is not None: self._values["versioned_expr"] = versioned_expr

    @builtins.property
    def config(self) -> typing.Optional[typing.List["ComputeSecurityPolicyRuleMatchConfig"]]:
        """config block."""
        return self._values.get('config')

    @builtins.property
    def expr(self) -> typing.Optional[typing.List["ComputeSecurityPolicyRuleMatchExpr"]]:
        """expr block."""
        return self._values.get('expr')

    @builtins.property
    def versioned_expr(self) -> typing.Optional[str]:
        """Predefined rule expression.

        If this field is specified, config must also be specified. Available options:   SRC_IPS_V1: Must specify the corresponding src_ip_ranges field in config.
        """
        return self._values.get('versioned_expr')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSecurityPolicyRuleMatch(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSecurityPolicyRuleMatchConfig", jsii_struct_bases=[], name_mapping={'src_ip_ranges': 'srcIpRanges'})
class ComputeSecurityPolicyRuleMatchConfig():
    def __init__(self, *, src_ip_ranges: typing.List[str]) -> None:
        """
        :param src_ip_ranges: Set of IP addresses or ranges (IPV4 or IPV6) in CIDR notation to match against inbound traffic. There is a limit of 10 IP ranges per rule. A value of '*' matches all IPs (can be used to override the default behavior).
        """
        self._values = {
            'src_ip_ranges': src_ip_ranges,
        }

    @builtins.property
    def src_ip_ranges(self) -> typing.List[str]:
        """Set of IP addresses or ranges (IPV4 or IPV6) in CIDR notation to match against inbound traffic.

        There is a limit of 10 IP ranges per rule. A value of '*' matches all IPs (can be used to override the default behavior).
        """
        return self._values.get('src_ip_ranges')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSecurityPolicyRuleMatchConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSecurityPolicyRuleMatchExpr", jsii_struct_bases=[], name_mapping={'expression': 'expression'})
class ComputeSecurityPolicyRuleMatchExpr():
    def __init__(self, *, expression: str) -> None:
        """
        :param expression: Textual representation of an expression in Common Expression Language syntax. The application context of the containing message determines which well-known feature set of CEL is supported.
        """
        self._values = {
            'expression': expression,
        }

    @builtins.property
    def expression(self) -> str:
        """Textual representation of an expression in Common Expression Language syntax.

        The application context of the containing message determines which well-known feature set of CEL is supported.
        """
        return self._values.get('expression')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSecurityPolicyRuleMatchExpr(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSecurityPolicyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeSecurityPolicyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSecurityPolicyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeSharedVpcHostProject(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeSharedVpcHostProject"):
    def __init__(self, scope: constructs.Construct, id: str, *, project: str, timeouts: typing.Optional["ComputeSharedVpcHostProjectTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param project: The ID of the project that will serve as a Shared VPC host project.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeSharedVpcHostProjectConfig(project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeSharedVpcHostProject, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> str:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: str) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeSharedVpcHostProjectTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeSharedVpcHostProjectTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSharedVpcHostProjectConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeSharedVpcHostProjectConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, project: str, timeouts: typing.Optional["ComputeSharedVpcHostProjectTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param project: The ID of the project that will serve as a Shared VPC host project.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeSharedVpcHostProjectTimeouts(**timeouts)
        self._values = {
            'project': project,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def project(self) -> str:
        """The ID of the project that will serve as a Shared VPC host project."""
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeSharedVpcHostProjectTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSharedVpcHostProjectConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSharedVpcHostProjectTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeSharedVpcHostProjectTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSharedVpcHostProjectTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeSharedVpcServiceProject(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeSharedVpcServiceProject"):
    def __init__(self, scope: constructs.Construct, id: str, *, host_project: str, service_project: str, timeouts: typing.Optional["ComputeSharedVpcServiceProjectTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param host_project: The ID of a host project to associate.
        :param service_project: The ID of the project that will serve as a Shared VPC service project.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeSharedVpcServiceProjectConfig(host_project=host_project, service_project=service_project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeSharedVpcServiceProject, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="hostProject")
    def host_project(self) -> str:
        return jsii.get(self, "hostProject")

    @host_project.setter
    def host_project(self, value: str) -> None:
        jsii.set(self, "hostProject", value)

    @builtins.property
    @jsii.member(jsii_name="serviceProject")
    def service_project(self) -> str:
        return jsii.get(self, "serviceProject")

    @service_project.setter
    def service_project(self, value: str) -> None:
        jsii.set(self, "serviceProject", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeSharedVpcServiceProjectTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeSharedVpcServiceProjectTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSharedVpcServiceProjectConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'host_project': 'hostProject', 'service_project': 'serviceProject', 'timeouts': 'timeouts'})
class ComputeSharedVpcServiceProjectConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, host_project: str, service_project: str, timeouts: typing.Optional["ComputeSharedVpcServiceProjectTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param host_project: The ID of a host project to associate.
        :param service_project: The ID of the project that will serve as a Shared VPC service project.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeSharedVpcServiceProjectTimeouts(**timeouts)
        self._values = {
            'host_project': host_project,
            'service_project': service_project,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def host_project(self) -> str:
        """The ID of a host project to associate."""
        return self._values.get('host_project')

    @builtins.property
    def service_project(self) -> str:
        """The ID of the project that will serve as a Shared VPC service project."""
        return self._values.get('service_project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeSharedVpcServiceProjectTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSharedVpcServiceProjectConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSharedVpcServiceProjectTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeSharedVpcServiceProjectTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSharedVpcServiceProjectTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeSnapshot(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeSnapshot"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, source_disk: str, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, snapshot_encryption_key: typing.Optional[typing.List["ComputeSnapshotSnapshotEncryptionKey"]]=None, source_disk_encryption_key: typing.Optional[typing.List["ComputeSnapshotSourceDiskEncryptionKey"]]=None, timeouts: typing.Optional["ComputeSnapshotTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param source_disk: A reference to the disk used to create this snapshot.
        :param description: An optional description of this resource.
        :param labels: Labels to apply to this Snapshot.
        :param project: 
        :param snapshot_encryption_key: snapshot_encryption_key block.
        :param source_disk_encryption_key: source_disk_encryption_key block.
        :param timeouts: timeouts block.
        :param zone: A reference to the zone where the disk is hosted.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeSnapshotConfig(name=name, source_disk=source_disk, description=description, labels=labels, project=project, snapshot_encryption_key=snapshot_encryption_key, source_disk_encryption_key=source_disk_encryption_key, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeSnapshot, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="diskSizeGb")
    def disk_size_gb(self) -> jsii.Number:
        return jsii.get(self, "diskSizeGb")

    @builtins.property
    @jsii.member(jsii_name="labelFingerprint")
    def label_fingerprint(self) -> str:
        return jsii.get(self, "labelFingerprint")

    @builtins.property
    @jsii.member(jsii_name="licenses")
    def licenses(self) -> typing.List[str]:
        return jsii.get(self, "licenses")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="snapshotId")
    def snapshot_id(self) -> jsii.Number:
        return jsii.get(self, "snapshotId")

    @builtins.property
    @jsii.member(jsii_name="sourceDiskLink")
    def source_disk_link(self) -> str:
        return jsii.get(self, "sourceDiskLink")

    @builtins.property
    @jsii.member(jsii_name="storageBytes")
    def storage_bytes(self) -> jsii.Number:
        return jsii.get(self, "storageBytes")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="sourceDisk")
    def source_disk(self) -> str:
        return jsii.get(self, "sourceDisk")

    @source_disk.setter
    def source_disk(self, value: str) -> None:
        jsii.set(self, "sourceDisk", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="snapshotEncryptionKey")
    def snapshot_encryption_key(self) -> typing.Optional[typing.List["ComputeSnapshotSnapshotEncryptionKey"]]:
        return jsii.get(self, "snapshotEncryptionKey")

    @snapshot_encryption_key.setter
    def snapshot_encryption_key(self, value: typing.Optional[typing.List["ComputeSnapshotSnapshotEncryptionKey"]]) -> None:
        jsii.set(self, "snapshotEncryptionKey", value)

    @builtins.property
    @jsii.member(jsii_name="sourceDiskEncryptionKey")
    def source_disk_encryption_key(self) -> typing.Optional[typing.List["ComputeSnapshotSourceDiskEncryptionKey"]]:
        return jsii.get(self, "sourceDiskEncryptionKey")

    @source_disk_encryption_key.setter
    def source_disk_encryption_key(self, value: typing.Optional[typing.List["ComputeSnapshotSourceDiskEncryptionKey"]]) -> None:
        jsii.set(self, "sourceDiskEncryptionKey", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeSnapshotTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeSnapshotTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSnapshotConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'source_disk': 'sourceDisk', 'description': 'description', 'labels': 'labels', 'project': 'project', 'snapshot_encryption_key': 'snapshotEncryptionKey', 'source_disk_encryption_key': 'sourceDiskEncryptionKey', 'timeouts': 'timeouts', 'zone': 'zone'})
class ComputeSnapshotConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, source_disk: str, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, snapshot_encryption_key: typing.Optional[typing.List["ComputeSnapshotSnapshotEncryptionKey"]]=None, source_disk_encryption_key: typing.Optional[typing.List["ComputeSnapshotSourceDiskEncryptionKey"]]=None, timeouts: typing.Optional["ComputeSnapshotTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param source_disk: A reference to the disk used to create this snapshot.
        :param description: An optional description of this resource.
        :param labels: Labels to apply to this Snapshot.
        :param project: 
        :param snapshot_encryption_key: snapshot_encryption_key block.
        :param source_disk_encryption_key: source_disk_encryption_key block.
        :param timeouts: timeouts block.
        :param zone: A reference to the zone where the disk is hosted.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeSnapshotTimeouts(**timeouts)
        self._values = {
            'name': name,
            'source_disk': source_disk,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if labels is not None: self._values["labels"] = labels
        if project is not None: self._values["project"] = project
        if snapshot_encryption_key is not None: self._values["snapshot_encryption_key"] = snapshot_encryption_key
        if source_disk_encryption_key is not None: self._values["source_disk_encryption_key"] = source_disk_encryption_key
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource;

        provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def source_disk(self) -> str:
        """A reference to the disk used to create this snapshot."""
        return self._values.get('source_disk')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Labels to apply to this Snapshot."""
        return self._values.get('labels')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def snapshot_encryption_key(self) -> typing.Optional[typing.List["ComputeSnapshotSnapshotEncryptionKey"]]:
        """snapshot_encryption_key block."""
        return self._values.get('snapshot_encryption_key')

    @builtins.property
    def source_disk_encryption_key(self) -> typing.Optional[typing.List["ComputeSnapshotSourceDiskEncryptionKey"]]:
        """source_disk_encryption_key block."""
        return self._values.get('source_disk_encryption_key')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeSnapshotTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """A reference to the zone where the disk is hosted."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSnapshotConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSnapshotSnapshotEncryptionKey", jsii_struct_bases=[], name_mapping={'raw_key': 'rawKey'})
class ComputeSnapshotSnapshotEncryptionKey():
    def __init__(self, *, raw_key: str) -> None:
        """
        :param raw_key: Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource.
        """
        self._values = {
            'raw_key': raw_key,
        }

    @builtins.property
    def raw_key(self) -> str:
        """Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource."""
        return self._values.get('raw_key')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSnapshotSnapshotEncryptionKey(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSnapshotSourceDiskEncryptionKey", jsii_struct_bases=[], name_mapping={'raw_key': 'rawKey'})
class ComputeSnapshotSourceDiskEncryptionKey():
    def __init__(self, *, raw_key: typing.Optional[str]=None) -> None:
        """
        :param raw_key: Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource.
        """
        self._values = {
        }
        if raw_key is not None: self._values["raw_key"] = raw_key

    @builtins.property
    def raw_key(self) -> typing.Optional[str]:
        """Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource."""
        return self._values.get('raw_key')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSnapshotSourceDiskEncryptionKey(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSnapshotTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeSnapshotTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSnapshotTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeSslCertificate(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeSslCertificate"):
    def __init__(self, scope: constructs.Construct, id: str, *, certificate: str, private_key: str, description: typing.Optional[str]=None, name: typing.Optional[str]=None, name_prefix: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeSslCertificateTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param certificate: The certificate in PEM format. The certificate chain must be no greater than 5 certs long. The chain must include at least one intermediate cert.
        :param private_key: The write-only private key in PEM format.
        :param description: An optional description of this resource.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash. These are in the same namespace as the managed SSL certificates.
        :param name_prefix: 
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeSslCertificateConfig(certificate=certificate, private_key=private_key, description=description, name=name, name_prefix=name_prefix, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeSslCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="certificateId")
    def certificate_id(self) -> jsii.Number:
        return jsii.get(self, "certificateId")

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="certificate")
    def certificate(self) -> str:
        return jsii.get(self, "certificate")

    @certificate.setter
    def certificate(self, value: str) -> None:
        jsii.set(self, "certificate", value)

    @builtins.property
    @jsii.member(jsii_name="privateKey")
    def private_key(self) -> str:
        return jsii.get(self, "privateKey")

    @private_key.setter
    def private_key(self, value: str) -> None:
        jsii.set(self, "privateKey", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="namePrefix")
    def name_prefix(self) -> typing.Optional[str]:
        return jsii.get(self, "namePrefix")

    @name_prefix.setter
    def name_prefix(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "namePrefix", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeSslCertificateTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeSslCertificateTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSslCertificateConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'certificate': 'certificate', 'private_key': 'privateKey', 'description': 'description', 'name': 'name', 'name_prefix': 'namePrefix', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeSslCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, certificate: str, private_key: str, description: typing.Optional[str]=None, name: typing.Optional[str]=None, name_prefix: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeSslCertificateTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param certificate: The certificate in PEM format. The certificate chain must be no greater than 5 certs long. The chain must include at least one intermediate cert.
        :param private_key: The write-only private key in PEM format.
        :param description: An optional description of this resource.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash. These are in the same namespace as the managed SSL certificates.
        :param name_prefix: 
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeSslCertificateTimeouts(**timeouts)
        self._values = {
            'certificate': certificate,
            'private_key': private_key,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if name is not None: self._values["name"] = name
        if name_prefix is not None: self._values["name_prefix"] = name_prefix
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def certificate(self) -> str:
        """The certificate in PEM format.

        The certificate chain must be no greater than 5 certs long.
        The chain must include at least one intermediate cert.
        """
        return self._values.get('certificate')

    @builtins.property
    def private_key(self) -> str:
        """The write-only private key in PEM format."""
        return self._values.get('private_key')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.

        These are in the same namespace as the managed SSL certificates.
        """
        return self._values.get('name')

    @builtins.property
    def name_prefix(self) -> typing.Optional[str]:
        return self._values.get('name_prefix')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeSslCertificateTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSslCertificateConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSslCertificateTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeSslCertificateTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSslCertificateTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeSslPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeSslPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, custom_features: typing.Optional[typing.List[str]]=None, description: typing.Optional[str]=None, min_tls_version: typing.Optional[str]=None, profile: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeSslPolicyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param custom_features: Profile specifies the set of SSL features that can be used by the load balancer when negotiating SSL with clients. This can be one of 'COMPATIBLE', 'MODERN', 'RESTRICTED', or 'CUSTOM'. If using 'CUSTOM', the set of SSL features to enable must be specified in the 'customFeatures' field. See the `official documentation <https://cloud.google.com/compute/docs/load-balancing/ssl-policies#profilefeaturesupport>`_ for which ciphers are available to use. **Note**: this argument must* be present when using the 'CUSTOM' profile. This argument must not* be present when using any other profile.
        :param description: An optional description of this resource.
        :param min_tls_version: The minimum version of SSL protocol that can be used by the clients to establish a connection with the load balancer. Default value: "TLS_1_0" Possible values: ["TLS_1_0", "TLS_1_1", "TLS_1_2"]
        :param profile: Profile specifies the set of SSL features that can be used by the load balancer when negotiating SSL with clients. If using 'CUSTOM', the set of SSL features to enable must be specified in the 'customFeatures' field. See the `official documentation <https://cloud.google.com/compute/docs/load-balancing/ssl-policies#profilefeaturesupport>`_ for information on what cipher suites each profile provides. If 'CUSTOM' is used, the 'custom_features' attribute **must be set**. Default value: "COMPATIBLE" Possible values: ["COMPATIBLE", "MODERN", "RESTRICTED", "CUSTOM"]
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeSslPolicyConfig(name=name, custom_features=custom_features, description=description, min_tls_version=min_tls_version, profile=profile, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeSslPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="enabledFeatures")
    def enabled_features(self) -> typing.List[str]:
        return jsii.get(self, "enabledFeatures")

    @builtins.property
    @jsii.member(jsii_name="fingerprint")
    def fingerprint(self) -> str:
        return jsii.get(self, "fingerprint")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="customFeatures")
    def custom_features(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "customFeatures")

    @custom_features.setter
    def custom_features(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "customFeatures", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="minTlsVersion")
    def min_tls_version(self) -> typing.Optional[str]:
        return jsii.get(self, "minTlsVersion")

    @min_tls_version.setter
    def min_tls_version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "minTlsVersion", value)

    @builtins.property
    @jsii.member(jsii_name="profile")
    def profile(self) -> typing.Optional[str]:
        return jsii.get(self, "profile")

    @profile.setter
    def profile(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "profile", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeSslPolicyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeSslPolicyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSslPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'custom_features': 'customFeatures', 'description': 'description', 'min_tls_version': 'minTlsVersion', 'profile': 'profile', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeSslPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, custom_features: typing.Optional[typing.List[str]]=None, description: typing.Optional[str]=None, min_tls_version: typing.Optional[str]=None, profile: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeSslPolicyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param custom_features: Profile specifies the set of SSL features that can be used by the load balancer when negotiating SSL with clients. This can be one of 'COMPATIBLE', 'MODERN', 'RESTRICTED', or 'CUSTOM'. If using 'CUSTOM', the set of SSL features to enable must be specified in the 'customFeatures' field. See the `official documentation <https://cloud.google.com/compute/docs/load-balancing/ssl-policies#profilefeaturesupport>`_ for which ciphers are available to use. **Note**: this argument must* be present when using the 'CUSTOM' profile. This argument must not* be present when using any other profile.
        :param description: An optional description of this resource.
        :param min_tls_version: The minimum version of SSL protocol that can be used by the clients to establish a connection with the load balancer. Default value: "TLS_1_0" Possible values: ["TLS_1_0", "TLS_1_1", "TLS_1_2"]
        :param profile: Profile specifies the set of SSL features that can be used by the load balancer when negotiating SSL with clients. If using 'CUSTOM', the set of SSL features to enable must be specified in the 'customFeatures' field. See the `official documentation <https://cloud.google.com/compute/docs/load-balancing/ssl-policies#profilefeaturesupport>`_ for information on what cipher suites each profile provides. If 'CUSTOM' is used, the 'custom_features' attribute **must be set**. Default value: "COMPATIBLE" Possible values: ["COMPATIBLE", "MODERN", "RESTRICTED", "CUSTOM"]
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeSslPolicyTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if custom_features is not None: self._values["custom_features"] = custom_features
        if description is not None: self._values["description"] = description
        if min_tls_version is not None: self._values["min_tls_version"] = min_tls_version
        if profile is not None: self._values["profile"] = profile
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def custom_features(self) -> typing.Optional[typing.List[str]]:
        """Profile specifies the set of SSL features that can be used by the load balancer when negotiating SSL with clients.

        This can be one of
        'COMPATIBLE', 'MODERN', 'RESTRICTED', or 'CUSTOM'. If using 'CUSTOM',
        the set of SSL features to enable must be specified in the
        'customFeatures' field.

        See the `official documentation <https://cloud.google.com/compute/docs/load-balancing/ssl-policies#profilefeaturesupport>`_
        for which ciphers are available to use. **Note**: this argument
        must* be present when using the 'CUSTOM' profile. This argument
        must not* be present when using any other profile.
        """
        return self._values.get('custom_features')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def min_tls_version(self) -> typing.Optional[str]:
        """The minimum version of SSL protocol that can be used by the clients to establish a connection with the load balancer.

        Default value: "TLS_1_0" Possible values: ["TLS_1_0", "TLS_1_1", "TLS_1_2"]
        """
        return self._values.get('min_tls_version')

    @builtins.property
    def profile(self) -> typing.Optional[str]:
        """Profile specifies the set of SSL features that can be used by the load balancer when negotiating SSL with clients.

        If using 'CUSTOM',
        the set of SSL features to enable must be specified in the
        'customFeatures' field.

        See the `official documentation <https://cloud.google.com/compute/docs/load-balancing/ssl-policies#profilefeaturesupport>`_
        for information on what cipher suites each profile provides. If
        'CUSTOM' is used, the 'custom_features' attribute **must be set**. Default value: "COMPATIBLE" Possible values: ["COMPATIBLE", "MODERN", "RESTRICTED", "CUSTOM"]
        """
        return self._values.get('profile')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeSslPolicyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSslPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSslPolicyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeSslPolicyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSslPolicyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeSubnetwork(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeSubnetwork"):
    def __init__(self, scope: constructs.Construct, id: str, *, ip_cidr_range: str, name: str, network: str, description: typing.Optional[str]=None, enable_flow_logs: typing.Optional[bool]=None, log_config: typing.Optional[typing.List["ComputeSubnetworkLogConfig"]]=None, private_ip_google_access: typing.Optional[bool]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, secondary_ip_range: typing.Optional[typing.List["ComputeSubnetworkSecondaryIpRange"]]=None, timeouts: typing.Optional["ComputeSubnetworkTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param ip_cidr_range: The range of internal addresses that are owned by this subnetwork. Provide this property when you create the subnetwork. For example, 10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and non-overlapping within a network. Only IPv4 is supported.
        :param name: The name of the resource, provided by the client when initially creating the resource. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: The network this subnet belongs to. Only networks that are in the distributed mode can have subnetworks.
        :param description: An optional description of this resource. Provide this property when you create the resource. This field can be set only at resource creation time.
        :param enable_flow_logs: 
        :param log_config: log_config block.
        :param private_ip_google_access: When enabled, VMs in this subnetwork without external IP addresses can access Google APIs and services by using Private Google Access.
        :param project: 
        :param region: The GCP region for this subnetwork.
        :param secondary_ip_range: An array of configurations for secondary IP ranges for VM instances contained in this subnetwork. The primary IP of such VM must belong to the primary ipCidrRange of the subnetwork. The alias IPs may belong to either primary or secondary ranges. *Note**: This field uses `attr-as-block mode <https://www.terraform.io/docs/configuration/attr-as-blocks.html>`_ to avoid breaking users during the 0.12 upgrade. To explicitly send a list of zero objects you must use the following syntax: 'example=[]' For more details about this behavior, see `this section <https://www.terraform.io/docs/configuration/attr-as-blocks.html#defining-a-fixed-object-collection-value>`_.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeSubnetworkConfig(ip_cidr_range=ip_cidr_range, name=name, network=network, description=description, enable_flow_logs=enable_flow_logs, log_config=log_config, private_ip_google_access=private_ip_google_access, project=project, region=region, secondary_ip_range=secondary_ip_range, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeSubnetwork, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="fingerprint")
    def fingerprint(self) -> str:
        return jsii.get(self, "fingerprint")

    @builtins.property
    @jsii.member(jsii_name="gatewayAddress")
    def gateway_address(self) -> str:
        return jsii.get(self, "gatewayAddress")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="ipCidrRange")
    def ip_cidr_range(self) -> str:
        return jsii.get(self, "ipCidrRange")

    @ip_cidr_range.setter
    def ip_cidr_range(self, value: str) -> None:
        jsii.set(self, "ipCidrRange", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: str) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="enableFlowLogs")
    def enable_flow_logs(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableFlowLogs")

    @enable_flow_logs.setter
    def enable_flow_logs(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableFlowLogs", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="logConfig")
    def log_config(self) -> typing.Optional[typing.List["ComputeSubnetworkLogConfig"]]:
        return jsii.get(self, "logConfig")

    @log_config.setter
    def log_config(self, value: typing.Optional[typing.List["ComputeSubnetworkLogConfig"]]) -> None:
        jsii.set(self, "logConfig", value)

    @builtins.property
    @jsii.member(jsii_name="privateIpGoogleAccess")
    def private_ip_google_access(self) -> typing.Optional[bool]:
        return jsii.get(self, "privateIpGoogleAccess")

    @private_ip_google_access.setter
    def private_ip_google_access(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "privateIpGoogleAccess", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="secondaryIpRange")
    def secondary_ip_range(self) -> typing.Optional[typing.List["ComputeSubnetworkSecondaryIpRange"]]:
        return jsii.get(self, "secondaryIpRange")

    @secondary_ip_range.setter
    def secondary_ip_range(self, value: typing.Optional[typing.List["ComputeSubnetworkSecondaryIpRange"]]) -> None:
        jsii.set(self, "secondaryIpRange", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeSubnetworkTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeSubnetworkTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSubnetworkConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'ip_cidr_range': 'ipCidrRange', 'name': 'name', 'network': 'network', 'description': 'description', 'enable_flow_logs': 'enableFlowLogs', 'log_config': 'logConfig', 'private_ip_google_access': 'privateIpGoogleAccess', 'project': 'project', 'region': 'region', 'secondary_ip_range': 'secondaryIpRange', 'timeouts': 'timeouts'})
class ComputeSubnetworkConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, ip_cidr_range: str, name: str, network: str, description: typing.Optional[str]=None, enable_flow_logs: typing.Optional[bool]=None, log_config: typing.Optional[typing.List["ComputeSubnetworkLogConfig"]]=None, private_ip_google_access: typing.Optional[bool]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, secondary_ip_range: typing.Optional[typing.List["ComputeSubnetworkSecondaryIpRange"]]=None, timeouts: typing.Optional["ComputeSubnetworkTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param ip_cidr_range: The range of internal addresses that are owned by this subnetwork. Provide this property when you create the subnetwork. For example, 10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and non-overlapping within a network. Only IPv4 is supported.
        :param name: The name of the resource, provided by the client when initially creating the resource. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: The network this subnet belongs to. Only networks that are in the distributed mode can have subnetworks.
        :param description: An optional description of this resource. Provide this property when you create the resource. This field can be set only at resource creation time.
        :param enable_flow_logs: 
        :param log_config: log_config block.
        :param private_ip_google_access: When enabled, VMs in this subnetwork without external IP addresses can access Google APIs and services by using Private Google Access.
        :param project: 
        :param region: The GCP region for this subnetwork.
        :param secondary_ip_range: An array of configurations for secondary IP ranges for VM instances contained in this subnetwork. The primary IP of such VM must belong to the primary ipCidrRange of the subnetwork. The alias IPs may belong to either primary or secondary ranges. *Note**: This field uses `attr-as-block mode <https://www.terraform.io/docs/configuration/attr-as-blocks.html>`_ to avoid breaking users during the 0.12 upgrade. To explicitly send a list of zero objects you must use the following syntax: 'example=[]' For more details about this behavior, see `this section <https://www.terraform.io/docs/configuration/attr-as-blocks.html#defining-a-fixed-object-collection-value>`_.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeSubnetworkTimeouts(**timeouts)
        self._values = {
            'ip_cidr_range': ip_cidr_range,
            'name': name,
            'network': network,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if enable_flow_logs is not None: self._values["enable_flow_logs"] = enable_flow_logs
        if log_config is not None: self._values["log_config"] = log_config
        if private_ip_google_access is not None: self._values["private_ip_google_access"] = private_ip_google_access
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if secondary_ip_range is not None: self._values["secondary_ip_range"] = secondary_ip_range
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def ip_cidr_range(self) -> str:
        """The range of internal addresses that are owned by this subnetwork.

        Provide this property when you create the subnetwork. For example,
        10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and
        non-overlapping within a network. Only IPv4 is supported.
        """
        return self._values.get('ip_cidr_range')

    @builtins.property
    def name(self) -> str:
        """The name of the resource, provided by the client when initially creating the resource.

        The name must be 1-63 characters long, and
        comply with RFC1035. Specifically, the name must be 1-63 characters
        long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which
        means the first character must be a lowercase letter, and all
        following characters must be a dash, lowercase letter, or digit,
        except the last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def network(self) -> str:
        """The network this subnet belongs to.

        Only networks that are in the distributed mode can have subnetworks.
        """
        return self._values.get('network')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when
        you create the resource. This field can be set only at resource
        creation time.
        """
        return self._values.get('description')

    @builtins.property
    def enable_flow_logs(self) -> typing.Optional[bool]:
        return self._values.get('enable_flow_logs')

    @builtins.property
    def log_config(self) -> typing.Optional[typing.List["ComputeSubnetworkLogConfig"]]:
        """log_config block."""
        return self._values.get('log_config')

    @builtins.property
    def private_ip_google_access(self) -> typing.Optional[bool]:
        """When enabled, VMs in this subnetwork without external IP addresses can access Google APIs and services by using Private Google Access."""
        return self._values.get('private_ip_google_access')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The GCP region for this subnetwork."""
        return self._values.get('region')

    @builtins.property
    def secondary_ip_range(self) -> typing.Optional[typing.List["ComputeSubnetworkSecondaryIpRange"]]:
        """An array of configurations for secondary IP ranges for VM instances contained in this subnetwork.

        The primary IP of such VM must belong
        to the primary ipCidrRange of the subnetwork. The alias IPs may belong
        to either primary or secondary ranges.

        *Note**: This field uses `attr-as-block mode <https://www.terraform.io/docs/configuration/attr-as-blocks.html>`_ to avoid
        breaking users during the 0.12 upgrade. To explicitly send a list
        of zero objects you must use the following syntax:
        'example=[]'
        For more details about this behavior, see `this section <https://www.terraform.io/docs/configuration/attr-as-blocks.html#defining-a-fixed-object-collection-value>`_.
        """
        return self._values.get('secondary_ip_range')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeSubnetworkTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSubnetworkConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeSubnetworkIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeSubnetworkIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], role: str, subnetwork: str, condition: typing.Optional[typing.List["ComputeSubnetworkIamBindingCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param role: 
        :param subnetwork: 
        :param condition: condition block.
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeSubnetworkIamBindingConfig(members=members, role=role, subnetwork=subnetwork, condition=condition, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeSubnetworkIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> str:
        return jsii.get(self, "subnetwork")

    @subnetwork.setter
    def subnetwork(self, value: str) -> None:
        jsii.set(self, "subnetwork", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["ComputeSubnetworkIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["ComputeSubnetworkIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSubnetworkIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class ComputeSubnetworkIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSubnetworkIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSubnetworkIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'role': 'role', 'subnetwork': 'subnetwork', 'condition': 'condition', 'project': 'project', 'region': 'region'})
class ComputeSubnetworkIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], role: str, subnetwork: str, condition: typing.Optional[typing.List["ComputeSubnetworkIamBindingCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param role: 
        :param subnetwork: 
        :param condition: condition block.
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'role': role,
            'subnetwork': subnetwork,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def subnetwork(self) -> str:
        return self._values.get('subnetwork')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["ComputeSubnetworkIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSubnetworkIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeSubnetworkIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeSubnetworkIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, role: str, subnetwork: str, condition: typing.Optional[typing.List["ComputeSubnetworkIamMemberCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param role: 
        :param subnetwork: 
        :param condition: condition block.
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeSubnetworkIamMemberConfig(member=member, role=role, subnetwork=subnetwork, condition=condition, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeSubnetworkIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> str:
        return jsii.get(self, "subnetwork")

    @subnetwork.setter
    def subnetwork(self, value: str) -> None:
        jsii.set(self, "subnetwork", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["ComputeSubnetworkIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["ComputeSubnetworkIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSubnetworkIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class ComputeSubnetworkIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSubnetworkIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSubnetworkIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'role': 'role', 'subnetwork': 'subnetwork', 'condition': 'condition', 'project': 'project', 'region': 'region'})
class ComputeSubnetworkIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, role: str, subnetwork: str, condition: typing.Optional[typing.List["ComputeSubnetworkIamMemberCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param role: 
        :param subnetwork: 
        :param condition: condition block.
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'role': role,
            'subnetwork': subnetwork,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def subnetwork(self) -> str:
        return self._values.get('subnetwork')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["ComputeSubnetworkIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSubnetworkIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeSubnetworkIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeSubnetworkIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_data: str, subnetwork: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_data: 
        :param subnetwork: 
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeSubnetworkIamPolicyConfig(policy_data=policy_data, subnetwork=subnetwork, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeSubnetworkIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> str:
        return jsii.get(self, "subnetwork")

    @subnetwork.setter
    def subnetwork(self, value: str) -> None:
        jsii.set(self, "subnetwork", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSubnetworkIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_data': 'policyData', 'subnetwork': 'subnetwork', 'project': 'project', 'region': 'region'})
class ComputeSubnetworkIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_data: str, subnetwork: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_data: 
        :param subnetwork: 
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'policy_data': policy_data,
            'subnetwork': subnetwork,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def subnetwork(self) -> str:
        return self._values.get('subnetwork')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSubnetworkIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSubnetworkLogConfig", jsii_struct_bases=[], name_mapping={'aggregation_interval': 'aggregationInterval', 'flow_sampling': 'flowSampling', 'metadata': 'metadata'})
class ComputeSubnetworkLogConfig():
    def __init__(self, *, aggregation_interval: typing.Optional[str]=None, flow_sampling: typing.Optional[jsii.Number]=None, metadata: typing.Optional[str]=None) -> None:
        """
        :param aggregation_interval: Can only be specified if VPC flow logging for this subnetwork is enabled. Toggles the aggregation interval for collecting flow logs. Increasing the interval time will reduce the amount of generated flow logs for long lasting connections. Default is an interval of 5 seconds per connection. Possible values are INTERVAL_5_SEC, INTERVAL_30_SEC, INTERVAL_1_MIN, INTERVAL_5_MIN, INTERVAL_10_MIN, INTERVAL_15_MIN Default value: "INTERVAL_5_SEC" Possible values: ["INTERVAL_5_SEC", "INTERVAL_30_SEC", "INTERVAL_1_MIN", "INTERVAL_5_MIN", "INTERVAL_10_MIN", "INTERVAL_15_MIN"]
        :param flow_sampling: Can only be specified if VPC flow logging for this subnetwork is enabled. The value of the field must be in [0, 1]. Set the sampling rate of VPC flow logs within the subnetwork where 1.0 means all collected logs are reported and 0.0 means no logs are reported. Default is 0.5 which means half of all collected logs are reported.
        :param metadata: Can only be specified if VPC flow logging for this subnetwork is enabled. Configures whether metadata fields should be added to the reported VPC flow logs. Default value: "INCLUDE_ALL_METADATA" Possible values: ["EXCLUDE_ALL_METADATA", "INCLUDE_ALL_METADATA"]
        """
        self._values = {
        }
        if aggregation_interval is not None: self._values["aggregation_interval"] = aggregation_interval
        if flow_sampling is not None: self._values["flow_sampling"] = flow_sampling
        if metadata is not None: self._values["metadata"] = metadata

    @builtins.property
    def aggregation_interval(self) -> typing.Optional[str]:
        """Can only be specified if VPC flow logging for this subnetwork is enabled.

        Toggles the aggregation interval for collecting flow logs. Increasing the
        interval time will reduce the amount of generated flow logs for long
        lasting connections. Default is an interval of 5 seconds per connection.
        Possible values are INTERVAL_5_SEC, INTERVAL_30_SEC, INTERVAL_1_MIN,
        INTERVAL_5_MIN, INTERVAL_10_MIN, INTERVAL_15_MIN Default value: "INTERVAL_5_SEC" Possible values: ["INTERVAL_5_SEC", "INTERVAL_30_SEC", "INTERVAL_1_MIN", "INTERVAL_5_MIN", "INTERVAL_10_MIN", "INTERVAL_15_MIN"]
        """
        return self._values.get('aggregation_interval')

    @builtins.property
    def flow_sampling(self) -> typing.Optional[jsii.Number]:
        """Can only be specified if VPC flow logging for this subnetwork is enabled.

        The value of the field must be in [0, 1]. Set the sampling rate of VPC
        flow logs within the subnetwork where 1.0 means all collected logs are
        reported and 0.0 means no logs are reported. Default is 0.5 which means
        half of all collected logs are reported.
        """
        return self._values.get('flow_sampling')

    @builtins.property
    def metadata(self) -> typing.Optional[str]:
        """Can only be specified if VPC flow logging for this subnetwork is enabled.

        Configures whether metadata fields should be added to the reported VPC
        flow logs. Default value: "INCLUDE_ALL_METADATA" Possible values: ["EXCLUDE_ALL_METADATA", "INCLUDE_ALL_METADATA"]
        """
        return self._values.get('metadata')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSubnetworkLogConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSubnetworkSecondaryIpRange", jsii_struct_bases=[], name_mapping={'ip_cidr_range': 'ipCidrRange', 'range_name': 'rangeName'})
class ComputeSubnetworkSecondaryIpRange():
    def __init__(self, *, ip_cidr_range: typing.Optional[str]=None, range_name: typing.Optional[str]=None) -> None:
        """
        :param ip_cidr_range: 
        :param range_name: 
        """
        self._values = {
        }
        if ip_cidr_range is not None: self._values["ip_cidr_range"] = ip_cidr_range
        if range_name is not None: self._values["range_name"] = range_name

    @builtins.property
    def ip_cidr_range(self) -> typing.Optional[str]:
        return self._values.get('ip_cidr_range')

    @builtins.property
    def range_name(self) -> typing.Optional[str]:
        return self._values.get('range_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSubnetworkSecondaryIpRange(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeSubnetworkTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeSubnetworkTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeSubnetworkTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeTargetHttpProxy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeTargetHttpProxy"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, url_map: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeTargetHttpProxyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param url_map: A reference to the UrlMap resource that defines the mapping from URL to the BackendService.
        :param description: An optional description of this resource.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeTargetHttpProxyConfig(name=name, url_map=url_map, description=description, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeTargetHttpProxy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="proxyId")
    def proxy_id(self) -> jsii.Number:
        return jsii.get(self, "proxyId")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="urlMap")
    def url_map(self) -> str:
        return jsii.get(self, "urlMap")

    @url_map.setter
    def url_map(self, value: str) -> None:
        jsii.set(self, "urlMap", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeTargetHttpProxyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeTargetHttpProxyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeTargetHttpProxyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'url_map': 'urlMap', 'description': 'description', 'project': 'project', 'timeouts': 'timeouts'})
class ComputeTargetHttpProxyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, url_map: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeTargetHttpProxyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param url_map: A reference to the UrlMap resource that defines the mapping from URL to the BackendService.
        :param description: An optional description of this resource.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeTargetHttpProxyTimeouts(**timeouts)
        self._values = {
            'name': name,
            'url_map': url_map,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def url_map(self) -> str:
        """A reference to the UrlMap resource that defines the mapping from URL to the BackendService."""
        return self._values.get('url_map')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeTargetHttpProxyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeTargetHttpProxyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeTargetHttpProxyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeTargetHttpProxyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeTargetHttpProxyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeTargetHttpsProxy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeTargetHttpsProxy"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, ssl_certificates: typing.List[str], url_map: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, quic_override: typing.Optional[str]=None, ssl_policy: typing.Optional[str]=None, timeouts: typing.Optional["ComputeTargetHttpsProxyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param ssl_certificates: A list of SslCertificate resources that are used to authenticate connections between users and the load balancer. At least one SSL certificate must be specified.
        :param url_map: A reference to the UrlMap resource that defines the mapping from URL to the BackendService.
        :param description: An optional description of this resource.
        :param project: 
        :param quic_override: Specifies the QUIC override policy for this resource. This determines whether the load balancer will attempt to negotiate QUIC with clients or not. Can specify one of NONE, ENABLE, or DISABLE. If NONE is specified, uses the QUIC policy with no user overrides, which is equivalent to DISABLE. Default value: "NONE" Possible values: ["NONE", "ENABLE", "DISABLE"]
        :param ssl_policy: A reference to the SslPolicy resource that will be associated with the TargetHttpsProxy resource. If not set, the TargetHttpsProxy resource will not have any SSL policy configured.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeTargetHttpsProxyConfig(name=name, ssl_certificates=ssl_certificates, url_map=url_map, description=description, project=project, quic_override=quic_override, ssl_policy=ssl_policy, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeTargetHttpsProxy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="proxyId")
    def proxy_id(self) -> jsii.Number:
        return jsii.get(self, "proxyId")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="sslCertificates")
    def ssl_certificates(self) -> typing.List[str]:
        return jsii.get(self, "sslCertificates")

    @ssl_certificates.setter
    def ssl_certificates(self, value: typing.List[str]) -> None:
        jsii.set(self, "sslCertificates", value)

    @builtins.property
    @jsii.member(jsii_name="urlMap")
    def url_map(self) -> str:
        return jsii.get(self, "urlMap")

    @url_map.setter
    def url_map(self, value: str) -> None:
        jsii.set(self, "urlMap", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="quicOverride")
    def quic_override(self) -> typing.Optional[str]:
        return jsii.get(self, "quicOverride")

    @quic_override.setter
    def quic_override(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "quicOverride", value)

    @builtins.property
    @jsii.member(jsii_name="sslPolicy")
    def ssl_policy(self) -> typing.Optional[str]:
        return jsii.get(self, "sslPolicy")

    @ssl_policy.setter
    def ssl_policy(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sslPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeTargetHttpsProxyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeTargetHttpsProxyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeTargetHttpsProxyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'ssl_certificates': 'sslCertificates', 'url_map': 'urlMap', 'description': 'description', 'project': 'project', 'quic_override': 'quicOverride', 'ssl_policy': 'sslPolicy', 'timeouts': 'timeouts'})
class ComputeTargetHttpsProxyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, ssl_certificates: typing.List[str], url_map: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, quic_override: typing.Optional[str]=None, ssl_policy: typing.Optional[str]=None, timeouts: typing.Optional["ComputeTargetHttpsProxyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param ssl_certificates: A list of SslCertificate resources that are used to authenticate connections between users and the load balancer. At least one SSL certificate must be specified.
        :param url_map: A reference to the UrlMap resource that defines the mapping from URL to the BackendService.
        :param description: An optional description of this resource.
        :param project: 
        :param quic_override: Specifies the QUIC override policy for this resource. This determines whether the load balancer will attempt to negotiate QUIC with clients or not. Can specify one of NONE, ENABLE, or DISABLE. If NONE is specified, uses the QUIC policy with no user overrides, which is equivalent to DISABLE. Default value: "NONE" Possible values: ["NONE", "ENABLE", "DISABLE"]
        :param ssl_policy: A reference to the SslPolicy resource that will be associated with the TargetHttpsProxy resource. If not set, the TargetHttpsProxy resource will not have any SSL policy configured.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeTargetHttpsProxyTimeouts(**timeouts)
        self._values = {
            'name': name,
            'ssl_certificates': ssl_certificates,
            'url_map': url_map,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if quic_override is not None: self._values["quic_override"] = quic_override
        if ssl_policy is not None: self._values["ssl_policy"] = ssl_policy
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def ssl_certificates(self) -> typing.List[str]:
        """A list of SslCertificate resources that are used to authenticate connections between users and the load balancer.

        At least one SSL
        certificate must be specified.
        """
        return self._values.get('ssl_certificates')

    @builtins.property
    def url_map(self) -> str:
        """A reference to the UrlMap resource that defines the mapping from URL to the BackendService."""
        return self._values.get('url_map')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def quic_override(self) -> typing.Optional[str]:
        """Specifies the QUIC override policy for this resource.

        This determines
        whether the load balancer will attempt to negotiate QUIC with clients
        or not. Can specify one of NONE, ENABLE, or DISABLE. If NONE is
        specified, uses the QUIC policy with no user overrides, which is
        equivalent to DISABLE. Default value: "NONE" Possible values: ["NONE", "ENABLE", "DISABLE"]
        """
        return self._values.get('quic_override')

    @builtins.property
    def ssl_policy(self) -> typing.Optional[str]:
        """A reference to the SslPolicy resource that will be associated with the TargetHttpsProxy resource.

        If not set, the TargetHttpsProxy
        resource will not have any SSL policy configured.
        """
        return self._values.get('ssl_policy')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeTargetHttpsProxyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeTargetHttpsProxyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeTargetHttpsProxyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeTargetHttpsProxyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeTargetHttpsProxyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeTargetInstance(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeTargetInstance"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, name: str, description: typing.Optional[str]=None, nat_policy: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeTargetInstanceTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: The Compute instance VM handling traffic for this target instance. Accepts the instance self-link, relative path (e.g. 'projects/project/zones/zone/instances/instance') or name. If name is given, the zone will default to the given zone or the provider-default zone and the project will default to the provider-level project.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param description: An optional description of this resource.
        :param nat_policy: NAT option controlling how IPs are NAT'ed to the instance. Currently only NO_NAT (default value) is supported. Default value: "NO_NAT" Possible values: ["NO_NAT"]
        :param project: 
        :param timeouts: timeouts block.
        :param zone: URL of the zone where the target instance resides.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeTargetInstanceConfig(instance=instance, name=name, description=description, nat_policy=nat_policy, project=project, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeTargetInstance, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="natPolicy")
    def nat_policy(self) -> typing.Optional[str]:
        return jsii.get(self, "natPolicy")

    @nat_policy.setter
    def nat_policy(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "natPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeTargetInstanceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeTargetInstanceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeTargetInstanceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'name': 'name', 'description': 'description', 'nat_policy': 'natPolicy', 'project': 'project', 'timeouts': 'timeouts', 'zone': 'zone'})
class ComputeTargetInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, name: str, description: typing.Optional[str]=None, nat_policy: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ComputeTargetInstanceTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: The Compute instance VM handling traffic for this target instance. Accepts the instance self-link, relative path (e.g. 'projects/project/zones/zone/instances/instance') or name. If name is given, the zone will default to the given zone or the provider-default zone and the project will default to the provider-level project.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param description: An optional description of this resource.
        :param nat_policy: NAT option controlling how IPs are NAT'ed to the instance. Currently only NO_NAT (default value) is supported. Default value: "NO_NAT" Possible values: ["NO_NAT"]
        :param project: 
        :param timeouts: timeouts block.
        :param zone: URL of the zone where the target instance resides.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeTargetInstanceTimeouts(**timeouts)
        self._values = {
            'instance': instance,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if nat_policy is not None: self._values["nat_policy"] = nat_policy
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        """The Compute instance VM handling traffic for this target instance.

        Accepts the instance self-link, relative path
        (e.g. 'projects/project/zones/zone/instances/instance') or name. If
        name is given, the zone will default to the given zone or
        the provider-default zone and the project will default to the
        provider-level project.
        """
        return self._values.get('instance')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def nat_policy(self) -> typing.Optional[str]:
        """NAT option controlling how IPs are NAT'ed to the instance.

        Currently only NO_NAT (default value) is supported. Default value: "NO_NAT" Possible values: ["NO_NAT"]
        """
        return self._values.get('nat_policy')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeTargetInstanceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """URL of the zone where the target instance resides."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeTargetInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeTargetInstanceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeTargetInstanceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeTargetInstanceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeTargetPool(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeTargetPool"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, backup_pool: typing.Optional[str]=None, description: typing.Optional[str]=None, failover_ratio: typing.Optional[jsii.Number]=None, health_checks: typing.Optional[typing.List[str]]=None, instances: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, session_affinity: typing.Optional[str]=None, timeouts: typing.Optional["ComputeTargetPoolTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: A unique name for the resource, required by GCE. Changing this forces a new resource to be created.
        :param backup_pool: URL to the backup target pool. Must also set failover_ratio.
        :param description: Textual description field.
        :param failover_ratio: Ratio (0 to 1) of failed nodes before using the backup pool (which must also be set).
        :param health_checks: List of zero or one health check name or self_link. Only legacy google_compute_http_health_check is supported.
        :param instances: List of instances in the pool. They can be given as URLs, or in the form of "zone/name". Note that the instances need not exist at the time of target pool creation, so there is no need to use the Terraform interpolators to create a dependency on the instances from the target pool.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param region: Where the target pool resides. Defaults to project region.
        :param session_affinity: How to distribute load. Options are "NONE" (no affinity). "CLIENT_IP" (hash of the source/dest addresses / ports), and "CLIENT_IP_PROTO" also includes the protocol (default "NONE").
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeTargetPoolConfig(name=name, backup_pool=backup_pool, description=description, failover_ratio=failover_ratio, health_checks=health_checks, instances=instances, project=project, region=region, session_affinity=session_affinity, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeTargetPool, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="backupPool")
    def backup_pool(self) -> typing.Optional[str]:
        return jsii.get(self, "backupPool")

    @backup_pool.setter
    def backup_pool(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "backupPool", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="failoverRatio")
    def failover_ratio(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "failoverRatio")

    @failover_ratio.setter
    def failover_ratio(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "failoverRatio", value)

    @builtins.property
    @jsii.member(jsii_name="healthChecks")
    def health_checks(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "healthChecks")

    @health_checks.setter
    def health_checks(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "healthChecks", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="instances")
    def instances(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "instances")

    @instances.setter
    def instances(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "instances", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="sessionAffinity")
    def session_affinity(self) -> typing.Optional[str]:
        return jsii.get(self, "sessionAffinity")

    @session_affinity.setter
    def session_affinity(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sessionAffinity", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeTargetPoolTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeTargetPoolTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeTargetPoolConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'backup_pool': 'backupPool', 'description': 'description', 'failover_ratio': 'failoverRatio', 'health_checks': 'healthChecks', 'instances': 'instances', 'project': 'project', 'region': 'region', 'session_affinity': 'sessionAffinity', 'timeouts': 'timeouts'})
class ComputeTargetPoolConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, backup_pool: typing.Optional[str]=None, description: typing.Optional[str]=None, failover_ratio: typing.Optional[jsii.Number]=None, health_checks: typing.Optional[typing.List[str]]=None, instances: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, session_affinity: typing.Optional[str]=None, timeouts: typing.Optional["ComputeTargetPoolTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: A unique name for the resource, required by GCE. Changing this forces a new resource to be created.
        :param backup_pool: URL to the backup target pool. Must also set failover_ratio.
        :param description: Textual description field.
        :param failover_ratio: Ratio (0 to 1) of failed nodes before using the backup pool (which must also be set).
        :param health_checks: List of zero or one health check name or self_link. Only legacy google_compute_http_health_check is supported.
        :param instances: List of instances in the pool. They can be given as URLs, or in the form of "zone/name". Note that the instances need not exist at the time of target pool creation, so there is no need to use the Terraform interpolators to create a dependency on the instances from the target pool.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param region: Where the target pool resides. Defaults to project region.
        :param session_affinity: How to distribute load. Options are "NONE" (no affinity). "CLIENT_IP" (hash of the source/dest addresses / ports), and "CLIENT_IP_PROTO" also includes the protocol (default "NONE").
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeTargetPoolTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if backup_pool is not None: self._values["backup_pool"] = backup_pool
        if description is not None: self._values["description"] = description
        if failover_ratio is not None: self._values["failover_ratio"] = failover_ratio
        if health_checks is not None: self._values["health_checks"] = health_checks
        if instances is not None: self._values["instances"] = instances
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if session_affinity is not None: self._values["session_affinity"] = session_affinity
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """A unique name for the resource, required by GCE.

        Changing this forces a new resource to be created.
        """
        return self._values.get('name')

    @builtins.property
    def backup_pool(self) -> typing.Optional[str]:
        """URL to the backup target pool.

        Must also set failover_ratio.
        """
        return self._values.get('backup_pool')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Textual description field."""
        return self._values.get('description')

    @builtins.property
    def failover_ratio(self) -> typing.Optional[jsii.Number]:
        """Ratio (0 to 1) of failed nodes before using the backup pool (which must also be set)."""
        return self._values.get('failover_ratio')

    @builtins.property
    def health_checks(self) -> typing.Optional[typing.List[str]]:
        """List of zero or one health check name or self_link.

        Only legacy google_compute_http_health_check is supported.
        """
        return self._values.get('health_checks')

    @builtins.property
    def instances(self) -> typing.Optional[typing.List[str]]:
        """List of instances in the pool.

        They can be given as URLs, or in the form of "zone/name". Note that the instances need not exist at the time of target pool creation, so there is no need to use the Terraform interpolators to create a dependency on the instances from the target pool.
        """
        return self._values.get('instances')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """Where the target pool resides.

        Defaults to project region.
        """
        return self._values.get('region')

    @builtins.property
    def session_affinity(self) -> typing.Optional[str]:
        """How to distribute load.

        Options are "NONE" (no affinity). "CLIENT_IP" (hash of the source/dest addresses / ports), and "CLIENT_IP_PROTO" also includes the protocol (default "NONE").
        """
        return self._values.get('session_affinity')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeTargetPoolTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeTargetPoolConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeTargetPoolTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeTargetPoolTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeTargetPoolTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeTargetSslProxy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeTargetSslProxy"):
    def __init__(self, scope: constructs.Construct, id: str, *, backend_service: str, name: str, ssl_certificates: typing.List[str], description: typing.Optional[str]=None, project: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, ssl_policy: typing.Optional[str]=None, timeouts: typing.Optional["ComputeTargetSslProxyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param backend_service: A reference to the BackendService resource.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param ssl_certificates: A list of SslCertificate resources that are used to authenticate connections between users and the load balancer. Currently, exactly one SSL certificate must be specified.
        :param description: An optional description of this resource.
        :param project: 
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param ssl_policy: A reference to the SslPolicy resource that will be associated with the TargetSslProxy resource. If not set, the TargetSslProxy resource will not have any SSL policy configured.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeTargetSslProxyConfig(backend_service=backend_service, name=name, ssl_certificates=ssl_certificates, description=description, project=project, proxy_header=proxy_header, ssl_policy=ssl_policy, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeTargetSslProxy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="proxyId")
    def proxy_id(self) -> jsii.Number:
        return jsii.get(self, "proxyId")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="backendService")
    def backend_service(self) -> str:
        return jsii.get(self, "backendService")

    @backend_service.setter
    def backend_service(self, value: str) -> None:
        jsii.set(self, "backendService", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="sslCertificates")
    def ssl_certificates(self) -> typing.List[str]:
        return jsii.get(self, "sslCertificates")

    @ssl_certificates.setter
    def ssl_certificates(self, value: typing.List[str]) -> None:
        jsii.set(self, "sslCertificates", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="proxyHeader")
    def proxy_header(self) -> typing.Optional[str]:
        return jsii.get(self, "proxyHeader")

    @proxy_header.setter
    def proxy_header(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "proxyHeader", value)

    @builtins.property
    @jsii.member(jsii_name="sslPolicy")
    def ssl_policy(self) -> typing.Optional[str]:
        return jsii.get(self, "sslPolicy")

    @ssl_policy.setter
    def ssl_policy(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sslPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeTargetSslProxyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeTargetSslProxyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeTargetSslProxyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'backend_service': 'backendService', 'name': 'name', 'ssl_certificates': 'sslCertificates', 'description': 'description', 'project': 'project', 'proxy_header': 'proxyHeader', 'ssl_policy': 'sslPolicy', 'timeouts': 'timeouts'})
class ComputeTargetSslProxyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, backend_service: str, name: str, ssl_certificates: typing.List[str], description: typing.Optional[str]=None, project: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, ssl_policy: typing.Optional[str]=None, timeouts: typing.Optional["ComputeTargetSslProxyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backend_service: A reference to the BackendService resource.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param ssl_certificates: A list of SslCertificate resources that are used to authenticate connections between users and the load balancer. Currently, exactly one SSL certificate must be specified.
        :param description: An optional description of this resource.
        :param project: 
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param ssl_policy: A reference to the SslPolicy resource that will be associated with the TargetSslProxy resource. If not set, the TargetSslProxy resource will not have any SSL policy configured.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeTargetSslProxyTimeouts(**timeouts)
        self._values = {
            'backend_service': backend_service,
            'name': name,
            'ssl_certificates': ssl_certificates,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if proxy_header is not None: self._values["proxy_header"] = proxy_header
        if ssl_policy is not None: self._values["ssl_policy"] = ssl_policy
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def backend_service(self) -> str:
        """A reference to the BackendService resource."""
        return self._values.get('backend_service')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def ssl_certificates(self) -> typing.List[str]:
        """A list of SslCertificate resources that are used to authenticate connections between users and the load balancer.

        Currently, exactly
        one SSL certificate must be specified.
        """
        return self._values.get('ssl_certificates')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def proxy_header(self) -> typing.Optional[str]:
        """Specifies the type of proxy header to append before sending data to the backend.

        Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        """
        return self._values.get('proxy_header')

    @builtins.property
    def ssl_policy(self) -> typing.Optional[str]:
        """A reference to the SslPolicy resource that will be associated with the TargetSslProxy resource.

        If not set, the TargetSslProxy
        resource will not have any SSL policy configured.
        """
        return self._values.get('ssl_policy')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeTargetSslProxyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeTargetSslProxyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeTargetSslProxyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeTargetSslProxyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeTargetSslProxyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeTargetTcpProxy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeTargetTcpProxy"):
    def __init__(self, scope: constructs.Construct, id: str, *, backend_service: str, name: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, timeouts: typing.Optional["ComputeTargetTcpProxyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param backend_service: A reference to the BackendService resource.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param description: An optional description of this resource.
        :param project: 
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeTargetTcpProxyConfig(backend_service=backend_service, name=name, description=description, project=project, proxy_header=proxy_header, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeTargetTcpProxy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="proxyId")
    def proxy_id(self) -> jsii.Number:
        return jsii.get(self, "proxyId")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="backendService")
    def backend_service(self) -> str:
        return jsii.get(self, "backendService")

    @backend_service.setter
    def backend_service(self, value: str) -> None:
        jsii.set(self, "backendService", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="proxyHeader")
    def proxy_header(self) -> typing.Optional[str]:
        return jsii.get(self, "proxyHeader")

    @proxy_header.setter
    def proxy_header(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "proxyHeader", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeTargetTcpProxyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeTargetTcpProxyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeTargetTcpProxyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'backend_service': 'backendService', 'name': 'name', 'description': 'description', 'project': 'project', 'proxy_header': 'proxyHeader', 'timeouts': 'timeouts'})
class ComputeTargetTcpProxyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, backend_service: str, name: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, proxy_header: typing.Optional[str]=None, timeouts: typing.Optional["ComputeTargetTcpProxyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param backend_service: A reference to the BackendService resource.
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param description: An optional description of this resource.
        :param project: 
        :param proxy_header: Specifies the type of proxy header to append before sending data to the backend. Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeTargetTcpProxyTimeouts(**timeouts)
        self._values = {
            'backend_service': backend_service,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if proxy_header is not None: self._values["proxy_header"] = proxy_header
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def backend_service(self) -> str:
        """A reference to the BackendService resource."""
        return self._values.get('backend_service')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def proxy_header(self) -> typing.Optional[str]:
        """Specifies the type of proxy header to append before sending data to the backend.

        Default value: "NONE" Possible values: ["NONE", "PROXY_V1"]
        """
        return self._values.get('proxy_header')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeTargetTcpProxyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeTargetTcpProxyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeTargetTcpProxyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeTargetTcpProxyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeTargetTcpProxyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeUrlMap(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeUrlMap"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, default_route_action: typing.Optional[typing.List["ComputeUrlMapDefaultRouteAction"]]=None, default_service: typing.Optional[str]=None, default_url_redirect: typing.Optional[typing.List["ComputeUrlMapDefaultUrlRedirect"]]=None, description: typing.Optional[str]=None, header_action: typing.Optional[typing.List["ComputeUrlMapHeaderAction"]]=None, host_rule: typing.Optional[typing.List["ComputeUrlMapHostRule"]]=None, path_matcher: typing.Optional[typing.List["ComputeUrlMapPathMatcher"]]=None, project: typing.Optional[str]=None, test: typing.Optional[typing.List["ComputeUrlMapTest"]]=None, timeouts: typing.Optional["ComputeUrlMapTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param default_route_action: default_route_action block.
        :param default_service: The backend service or backend bucket to use when none of the given rules match.
        :param default_url_redirect: default_url_redirect block.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param header_action: header_action block.
        :param host_rule: host_rule block.
        :param path_matcher: path_matcher block.
        :param project: 
        :param test: test block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeUrlMapConfig(name=name, default_route_action=default_route_action, default_service=default_service, default_url_redirect=default_url_redirect, description=description, header_action=header_action, host_rule=host_rule, path_matcher=path_matcher, project=project, test=test, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeUrlMap, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="fingerprint")
    def fingerprint(self) -> str:
        return jsii.get(self, "fingerprint")

    @builtins.property
    @jsii.member(jsii_name="mapId")
    def map_id(self) -> jsii.Number:
        return jsii.get(self, "mapId")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="defaultRouteAction")
    def default_route_action(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteAction"]]:
        return jsii.get(self, "defaultRouteAction")

    @default_route_action.setter
    def default_route_action(self, value: typing.Optional[typing.List["ComputeUrlMapDefaultRouteAction"]]) -> None:
        jsii.set(self, "defaultRouteAction", value)

    @builtins.property
    @jsii.member(jsii_name="defaultService")
    def default_service(self) -> typing.Optional[str]:
        return jsii.get(self, "defaultService")

    @default_service.setter
    def default_service(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "defaultService", value)

    @builtins.property
    @jsii.member(jsii_name="defaultUrlRedirect")
    def default_url_redirect(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultUrlRedirect"]]:
        return jsii.get(self, "defaultUrlRedirect")

    @default_url_redirect.setter
    def default_url_redirect(self, value: typing.Optional[typing.List["ComputeUrlMapDefaultUrlRedirect"]]) -> None:
        jsii.set(self, "defaultUrlRedirect", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="headerAction")
    def header_action(self) -> typing.Optional[typing.List["ComputeUrlMapHeaderAction"]]:
        return jsii.get(self, "headerAction")

    @header_action.setter
    def header_action(self, value: typing.Optional[typing.List["ComputeUrlMapHeaderAction"]]) -> None:
        jsii.set(self, "headerAction", value)

    @builtins.property
    @jsii.member(jsii_name="hostRule")
    def host_rule(self) -> typing.Optional[typing.List["ComputeUrlMapHostRule"]]:
        return jsii.get(self, "hostRule")

    @host_rule.setter
    def host_rule(self, value: typing.Optional[typing.List["ComputeUrlMapHostRule"]]) -> None:
        jsii.set(self, "hostRule", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="pathMatcher")
    def path_matcher(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcher"]]:
        return jsii.get(self, "pathMatcher")

    @path_matcher.setter
    def path_matcher(self, value: typing.Optional[typing.List["ComputeUrlMapPathMatcher"]]) -> None:
        jsii.set(self, "pathMatcher", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="test")
    def test(self) -> typing.Optional[typing.List["ComputeUrlMapTest"]]:
        return jsii.get(self, "test")

    @test.setter
    def test(self, value: typing.Optional[typing.List["ComputeUrlMapTest"]]) -> None:
        jsii.set(self, "test", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeUrlMapTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeUrlMapTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'default_route_action': 'defaultRouteAction', 'default_service': 'defaultService', 'default_url_redirect': 'defaultUrlRedirect', 'description': 'description', 'header_action': 'headerAction', 'host_rule': 'hostRule', 'path_matcher': 'pathMatcher', 'project': 'project', 'test': 'test', 'timeouts': 'timeouts'})
class ComputeUrlMapConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, default_route_action: typing.Optional[typing.List["ComputeUrlMapDefaultRouteAction"]]=None, default_service: typing.Optional[str]=None, default_url_redirect: typing.Optional[typing.List["ComputeUrlMapDefaultUrlRedirect"]]=None, description: typing.Optional[str]=None, header_action: typing.Optional[typing.List["ComputeUrlMapHeaderAction"]]=None, host_rule: typing.Optional[typing.List["ComputeUrlMapHostRule"]]=None, path_matcher: typing.Optional[typing.List["ComputeUrlMapPathMatcher"]]=None, project: typing.Optional[str]=None, test: typing.Optional[typing.List["ComputeUrlMapTest"]]=None, timeouts: typing.Optional["ComputeUrlMapTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param default_route_action: default_route_action block.
        :param default_service: The backend service or backend bucket to use when none of the given rules match.
        :param default_url_redirect: default_url_redirect block.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param header_action: header_action block.
        :param host_rule: host_rule block.
        :param path_matcher: path_matcher block.
        :param project: 
        :param test: test block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeUrlMapTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if default_route_action is not None: self._values["default_route_action"] = default_route_action
        if default_service is not None: self._values["default_service"] = default_service
        if default_url_redirect is not None: self._values["default_url_redirect"] = default_url_redirect
        if description is not None: self._values["description"] = description
        if header_action is not None: self._values["header_action"] = header_action
        if host_rule is not None: self._values["host_rule"] = host_rule
        if path_matcher is not None: self._values["path_matcher"] = path_matcher
        if project is not None: self._values["project"] = project
        if test is not None: self._values["test"] = test
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is created. The
        name must be 1-63 characters long, and comply with RFC1035. Specifically, the
        name must be 1-63 characters long and match the regular expression
        '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase
        letter, and all following characters must be a dash, lowercase letter, or digit,
        except the last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def default_route_action(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteAction"]]:
        """default_route_action block."""
        return self._values.get('default_route_action')

    @builtins.property
    def default_service(self) -> typing.Optional[str]:
        """The backend service or backend bucket to use when none of the given rules match."""
        return self._values.get('default_service')

    @builtins.property
    def default_url_redirect(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultUrlRedirect"]]:
        """default_url_redirect block."""
        return self._values.get('default_url_redirect')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when you create
        the resource.
        """
        return self._values.get('description')

    @builtins.property
    def header_action(self) -> typing.Optional[typing.List["ComputeUrlMapHeaderAction"]]:
        """header_action block."""
        return self._values.get('header_action')

    @builtins.property
    def host_rule(self) -> typing.Optional[typing.List["ComputeUrlMapHostRule"]]:
        """host_rule block."""
        return self._values.get('host_rule')

    @builtins.property
    def path_matcher(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcher"]]:
        """path_matcher block."""
        return self._values.get('path_matcher')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def test(self) -> typing.Optional[typing.List["ComputeUrlMapTest"]]:
        """test block."""
        return self._values.get('test')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeUrlMapTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteAction", jsii_struct_bases=[], name_mapping={'cors_policy': 'corsPolicy', 'fault_injection_policy': 'faultInjectionPolicy', 'request_mirror_policy': 'requestMirrorPolicy', 'retry_policy': 'retryPolicy', 'timeout': 'timeout', 'url_rewrite': 'urlRewrite', 'weighted_backend_services': 'weightedBackendServices'})
class ComputeUrlMapDefaultRouteAction():
    def __init__(self, *, cors_policy: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionCorsPolicy"]]=None, fault_injection_policy: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionFaultInjectionPolicy"]]=None, request_mirror_policy: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionRequestMirrorPolicy"]]=None, retry_policy: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionRetryPolicy"]]=None, timeout: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionTimeout"]]=None, url_rewrite: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionUrlRewrite"]]=None, weighted_backend_services: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionWeightedBackendServices"]]=None) -> None:
        """
        :param cors_policy: cors_policy block.
        :param fault_injection_policy: fault_injection_policy block.
        :param request_mirror_policy: request_mirror_policy block.
        :param retry_policy: retry_policy block.
        :param timeout: timeout block.
        :param url_rewrite: url_rewrite block.
        :param weighted_backend_services: weighted_backend_services block.
        """
        self._values = {
        }
        if cors_policy is not None: self._values["cors_policy"] = cors_policy
        if fault_injection_policy is not None: self._values["fault_injection_policy"] = fault_injection_policy
        if request_mirror_policy is not None: self._values["request_mirror_policy"] = request_mirror_policy
        if retry_policy is not None: self._values["retry_policy"] = retry_policy
        if timeout is not None: self._values["timeout"] = timeout
        if url_rewrite is not None: self._values["url_rewrite"] = url_rewrite
        if weighted_backend_services is not None: self._values["weighted_backend_services"] = weighted_backend_services

    @builtins.property
    def cors_policy(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionCorsPolicy"]]:
        """cors_policy block."""
        return self._values.get('cors_policy')

    @builtins.property
    def fault_injection_policy(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionFaultInjectionPolicy"]]:
        """fault_injection_policy block."""
        return self._values.get('fault_injection_policy')

    @builtins.property
    def request_mirror_policy(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionRequestMirrorPolicy"]]:
        """request_mirror_policy block."""
        return self._values.get('request_mirror_policy')

    @builtins.property
    def retry_policy(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionRetryPolicy"]]:
        """retry_policy block."""
        return self._values.get('retry_policy')

    @builtins.property
    def timeout(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionTimeout"]]:
        """timeout block."""
        return self._values.get('timeout')

    @builtins.property
    def url_rewrite(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionUrlRewrite"]]:
        """url_rewrite block."""
        return self._values.get('url_rewrite')

    @builtins.property
    def weighted_backend_services(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionWeightedBackendServices"]]:
        """weighted_backend_services block."""
        return self._values.get('weighted_backend_services')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionCorsPolicy", jsii_struct_bases=[], name_mapping={'allow_credentials': 'allowCredentials', 'allow_headers': 'allowHeaders', 'allow_methods': 'allowMethods', 'allow_origin_regexes': 'allowOriginRegexes', 'allow_origins': 'allowOrigins', 'disabled': 'disabled', 'expose_headers': 'exposeHeaders', 'max_age': 'maxAge'})
class ComputeUrlMapDefaultRouteActionCorsPolicy():
    def __init__(self, *, allow_credentials: typing.Optional[bool]=None, allow_headers: typing.Optional[typing.List[str]]=None, allow_methods: typing.Optional[typing.List[str]]=None, allow_origin_regexes: typing.Optional[typing.List[str]]=None, allow_origins: typing.Optional[typing.List[str]]=None, disabled: typing.Optional[bool]=None, expose_headers: typing.Optional[typing.List[str]]=None, max_age: typing.Optional[jsii.Number]=None) -> None:
        """
        :param allow_credentials: In response to a preflight request, setting this to true indicates that the actual request can include user credentials. This translates to the Access-Control-Allow-Credentials header.
        :param allow_headers: Specifies the content for the Access-Control-Allow-Headers header.
        :param allow_methods: Specifies the content for the Access-Control-Allow-Methods header.
        :param allow_origin_regexes: Specifies the regualar expression patterns that match allowed origins. For regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript An origin is allowed if it matches either an item in allowOrigins or an item in allowOriginRegexes.
        :param allow_origins: Specifies the list of origins that will be allowed to do CORS requests. An origin is allowed if it matches either an item in allowOrigins or an item in allowOriginRegexes.
        :param disabled: If true, specifies the CORS policy is disabled. The default value is false, which indicates that the CORS policy is in effect.
        :param expose_headers: Specifies the content for the Access-Control-Expose-Headers header.
        :param max_age: Specifies how long results of a preflight request can be cached in seconds. This translates to the Access-Control-Max-Age header.
        """
        self._values = {
        }
        if allow_credentials is not None: self._values["allow_credentials"] = allow_credentials
        if allow_headers is not None: self._values["allow_headers"] = allow_headers
        if allow_methods is not None: self._values["allow_methods"] = allow_methods
        if allow_origin_regexes is not None: self._values["allow_origin_regexes"] = allow_origin_regexes
        if allow_origins is not None: self._values["allow_origins"] = allow_origins
        if disabled is not None: self._values["disabled"] = disabled
        if expose_headers is not None: self._values["expose_headers"] = expose_headers
        if max_age is not None: self._values["max_age"] = max_age

    @builtins.property
    def allow_credentials(self) -> typing.Optional[bool]:
        """In response to a preflight request, setting this to true indicates that the actual request can include user credentials.

        This translates to the Access-Control-Allow-Credentials header.
        """
        return self._values.get('allow_credentials')

    @builtins.property
    def allow_headers(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Allow-Headers header."""
        return self._values.get('allow_headers')

    @builtins.property
    def allow_methods(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Allow-Methods header."""
        return self._values.get('allow_methods')

    @builtins.property
    def allow_origin_regexes(self) -> typing.Optional[typing.List[str]]:
        """Specifies the regualar expression patterns that match allowed origins.

        For regular expression grammar
        please see en.cppreference.com/w/cpp/regex/ecmascript
        An origin is allowed if it matches either an item in allowOrigins or an item in allowOriginRegexes.
        """
        return self._values.get('allow_origin_regexes')

    @builtins.property
    def allow_origins(self) -> typing.Optional[typing.List[str]]:
        """Specifies the list of origins that will be allowed to do CORS requests.

        An origin is allowed if it matches either an item in allowOrigins or an item in allowOriginRegexes.
        """
        return self._values.get('allow_origins')

    @builtins.property
    def disabled(self) -> typing.Optional[bool]:
        """If true, specifies the CORS policy is disabled.

        The default value is false, which indicates that the CORS policy is in effect.
        """
        return self._values.get('disabled')

    @builtins.property
    def expose_headers(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Expose-Headers header."""
        return self._values.get('expose_headers')

    @builtins.property
    def max_age(self) -> typing.Optional[jsii.Number]:
        """Specifies how long results of a preflight request can be cached in seconds.

        This translates to the Access-Control-Max-Age header.
        """
        return self._values.get('max_age')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionCorsPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionFaultInjectionPolicy", jsii_struct_bases=[], name_mapping={'abort': 'abort', 'delay': 'delay'})
class ComputeUrlMapDefaultRouteActionFaultInjectionPolicy():
    def __init__(self, *, abort: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionFaultInjectionPolicyAbort"]]=None, delay: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionFaultInjectionPolicyDelay"]]=None) -> None:
        """
        :param abort: abort block.
        :param delay: delay block.
        """
        self._values = {
        }
        if abort is not None: self._values["abort"] = abort
        if delay is not None: self._values["delay"] = delay

    @builtins.property
    def abort(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionFaultInjectionPolicyAbort"]]:
        """abort block."""
        return self._values.get('abort')

    @builtins.property
    def delay(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionFaultInjectionPolicyDelay"]]:
        """delay block."""
        return self._values.get('delay')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionFaultInjectionPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionFaultInjectionPolicyAbort", jsii_struct_bases=[], name_mapping={'http_status': 'httpStatus', 'percentage': 'percentage'})
class ComputeUrlMapDefaultRouteActionFaultInjectionPolicyAbort():
    def __init__(self, *, http_status: typing.Optional[jsii.Number]=None, percentage: typing.Optional[jsii.Number]=None) -> None:
        """
        :param http_status: The HTTP status code used to abort the request. The value must be between 200 and 599 inclusive.
        :param percentage: The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection. The value must be between 0.0 and 100.0 inclusive.
        """
        self._values = {
        }
        if http_status is not None: self._values["http_status"] = http_status
        if percentage is not None: self._values["percentage"] = percentage

    @builtins.property
    def http_status(self) -> typing.Optional[jsii.Number]:
        """The HTTP status code used to abort the request.

        The value must be between 200 and 599 inclusive.
        """
        return self._values.get('http_status')

    @builtins.property
    def percentage(self) -> typing.Optional[jsii.Number]:
        """The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection.

        The value must be between 0.0 and 100.0 inclusive.
        """
        return self._values.get('percentage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionFaultInjectionPolicyAbort(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionFaultInjectionPolicyDelay", jsii_struct_bases=[], name_mapping={'fixed_delay': 'fixedDelay', 'percentage': 'percentage'})
class ComputeUrlMapDefaultRouteActionFaultInjectionPolicyDelay():
    def __init__(self, *, fixed_delay: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionFaultInjectionPolicyDelayFixedDelay"]]=None, percentage: typing.Optional[jsii.Number]=None) -> None:
        """
        :param fixed_delay: fixed_delay block.
        :param percentage: The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection. The value must be between 0.0 and 100.0 inclusive.
        """
        self._values = {
        }
        if fixed_delay is not None: self._values["fixed_delay"] = fixed_delay
        if percentage is not None: self._values["percentage"] = percentage

    @builtins.property
    def fixed_delay(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionFaultInjectionPolicyDelayFixedDelay"]]:
        """fixed_delay block."""
        return self._values.get('fixed_delay')

    @builtins.property
    def percentage(self) -> typing.Optional[jsii.Number]:
        """The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection.

        The value must be between 0.0 and 100.0 inclusive.
        """
        return self._values.get('percentage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionFaultInjectionPolicyDelay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionFaultInjectionPolicyDelayFixedDelay", jsii_struct_bases=[], name_mapping={'nanos': 'nanos', 'seconds': 'seconds'})
class ComputeUrlMapDefaultRouteActionFaultInjectionPolicyDelayFixedDelay():
    def __init__(self, *, nanos: typing.Optional[jsii.Number]=None, seconds: typing.Optional[str]=None) -> None:
        """
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive. Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
        """
        self._values = {
        }
        if nanos is not None: self._values["nanos"] = nanos
        if seconds is not None: self._values["seconds"] = seconds

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations less than one second are
        represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    @builtins.property
    def seconds(self) -> typing.Optional[str]:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000 inclusive.
        Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
        """
        return self._values.get('seconds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionFaultInjectionPolicyDelayFixedDelay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionRequestMirrorPolicy", jsii_struct_bases=[], name_mapping={'backend_service': 'backendService'})
class ComputeUrlMapDefaultRouteActionRequestMirrorPolicy():
    def __init__(self, *, backend_service: str) -> None:
        """
        :param backend_service: The full or partial URL to the BackendService resource being mirrored to.
        """
        self._values = {
            'backend_service': backend_service,
        }

    @builtins.property
    def backend_service(self) -> str:
        """The full or partial URL to the BackendService resource being mirrored to."""
        return self._values.get('backend_service')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionRequestMirrorPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionRetryPolicy", jsii_struct_bases=[], name_mapping={'num_retries': 'numRetries', 'per_try_timeout': 'perTryTimeout', 'retry_conditions': 'retryConditions'})
class ComputeUrlMapDefaultRouteActionRetryPolicy():
    def __init__(self, *, num_retries: typing.Optional[jsii.Number]=None, per_try_timeout: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionRetryPolicyPerTryTimeout"]]=None, retry_conditions: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param num_retries: Specifies the allowed number retries. This number must be > 0. If not specified, defaults to 1.
        :param per_try_timeout: per_try_timeout block.
        :param retry_conditions: Specfies one or more conditions when this retry rule applies. Valid values are:. 5xx: Loadbalancer will attempt a retry if the backend service responds with any 5xx response code, or if the backend service does not respond at all, example: disconnects, reset, read timeout, connection failure, and refused streams. gateway-error: Similar to 5xx, but only applies to response codes 502, 503 or 504. connect-failure: Loadbalancer will retry on failures connecting to backend services, for example due to connection timeouts. retriable-4xx: Loadbalancer will retry for retriable 4xx response codes. Currently the only retriable error supported is 409. refused-stream:Loadbalancer will retry if the backend service resets the stream with a REFUSED_STREAM error code. This reset type indicates that it is safe to retry. cancelled: Loadbalancer will retry if the gRPC status code in the response header is set to cancelled deadline-exceeded: Loadbalancer will retry if the gRPC status code in the response header is set to deadline-exceeded resource-exhausted: Loadbalancer will retry if the gRPC status code in the response header is set to resource-exhausted unavailable: Loadbalancer will retry if the gRPC status code in the response header is set to unavailable
        """
        self._values = {
        }
        if num_retries is not None: self._values["num_retries"] = num_retries
        if per_try_timeout is not None: self._values["per_try_timeout"] = per_try_timeout
        if retry_conditions is not None: self._values["retry_conditions"] = retry_conditions

    @builtins.property
    def num_retries(self) -> typing.Optional[jsii.Number]:
        """Specifies the allowed number retries.

        This number must be > 0. If not specified, defaults to 1.
        """
        return self._values.get('num_retries')

    @builtins.property
    def per_try_timeout(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionRetryPolicyPerTryTimeout"]]:
        """per_try_timeout block."""
        return self._values.get('per_try_timeout')

    @builtins.property
    def retry_conditions(self) -> typing.Optional[typing.List[str]]:
        """Specfies one or more conditions when this retry rule applies. Valid values are:.

        5xx: Loadbalancer will attempt a retry if the backend service responds with any 5xx response code,
        or if the backend service does not respond at all, example: disconnects, reset, read timeout,
        connection failure, and refused streams.
        gateway-error: Similar to 5xx, but only applies to response codes 502, 503 or 504.
        connect-failure: Loadbalancer will retry on failures connecting to backend services,
        for example due to connection timeouts.
        retriable-4xx: Loadbalancer will retry for retriable 4xx response codes.
        Currently the only retriable error supported is 409.
        refused-stream:Loadbalancer will retry if the backend service resets the stream with a REFUSED_STREAM error code.
        This reset type indicates that it is safe to retry.
        cancelled: Loadbalancer will retry if the gRPC status code in the response header is set to cancelled
        deadline-exceeded: Loadbalancer will retry if the gRPC status code in the response header is set to deadline-exceeded
        resource-exhausted: Loadbalancer will retry if the gRPC status code in the response header is set to resource-exhausted
        unavailable: Loadbalancer will retry if the gRPC status code in the response header is set to unavailable
        """
        return self._values.get('retry_conditions')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionRetryPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionRetryPolicyPerTryTimeout", jsii_struct_bases=[], name_mapping={'nanos': 'nanos', 'seconds': 'seconds'})
class ComputeUrlMapDefaultRouteActionRetryPolicyPerTryTimeout():
    def __init__(self, *, nanos: typing.Optional[jsii.Number]=None, seconds: typing.Optional[str]=None) -> None:
        """
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive. Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
        """
        self._values = {
        }
        if nanos is not None: self._values["nanos"] = nanos
        if seconds is not None: self._values["seconds"] = seconds

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations less than one second are
        represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    @builtins.property
    def seconds(self) -> typing.Optional[str]:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000 inclusive.
        Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
        """
        return self._values.get('seconds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionRetryPolicyPerTryTimeout(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionTimeout", jsii_struct_bases=[], name_mapping={'nanos': 'nanos', 'seconds': 'seconds'})
class ComputeUrlMapDefaultRouteActionTimeout():
    def __init__(self, *, nanos: typing.Optional[jsii.Number]=None, seconds: typing.Optional[str]=None) -> None:
        """
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive. Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
        """
        self._values = {
        }
        if nanos is not None: self._values["nanos"] = nanos
        if seconds is not None: self._values["seconds"] = seconds

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations less than one second are represented
        with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    @builtins.property
    def seconds(self) -> typing.Optional[str]:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000 inclusive.
        Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
        """
        return self._values.get('seconds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionTimeout(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionUrlRewrite", jsii_struct_bases=[], name_mapping={'host_rewrite': 'hostRewrite', 'path_prefix_rewrite': 'pathPrefixRewrite'})
class ComputeUrlMapDefaultRouteActionUrlRewrite():
    def __init__(self, *, host_rewrite: typing.Optional[str]=None, path_prefix_rewrite: typing.Optional[str]=None) -> None:
        """
        :param host_rewrite: Prior to forwarding the request to the selected service, the request's host header is replaced with contents of hostRewrite. The value must be between 1 and 255 characters.
        :param path_prefix_rewrite: Prior to forwarding the request to the selected backend service, the matching portion of the request's path is replaced by pathPrefixRewrite. The value must be between 1 and 1024 characters.
        """
        self._values = {
        }
        if host_rewrite is not None: self._values["host_rewrite"] = host_rewrite
        if path_prefix_rewrite is not None: self._values["path_prefix_rewrite"] = path_prefix_rewrite

    @builtins.property
    def host_rewrite(self) -> typing.Optional[str]:
        """Prior to forwarding the request to the selected service, the request's host header is replaced with contents of hostRewrite.

        The value must be between 1 and 255 characters.
        """
        return self._values.get('host_rewrite')

    @builtins.property
    def path_prefix_rewrite(self) -> typing.Optional[str]:
        """Prior to forwarding the request to the selected backend service, the matching portion of the request's path is replaced by pathPrefixRewrite.

        The value must be between 1 and 1024 characters.
        """
        return self._values.get('path_prefix_rewrite')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionUrlRewrite(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionWeightedBackendServices", jsii_struct_bases=[], name_mapping={'backend_service': 'backendService', 'header_action': 'headerAction', 'weight': 'weight'})
class ComputeUrlMapDefaultRouteActionWeightedBackendServices():
    def __init__(self, *, backend_service: typing.Optional[str]=None, header_action: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderAction"]]=None, weight: typing.Optional[jsii.Number]=None) -> None:
        """
        :param backend_service: The full or partial URL to the default BackendService resource. Before forwarding the request to backendService, the loadbalancer applies any relevant headerActions specified as part of this backendServiceWeight.
        :param header_action: header_action block.
        :param weight: Specifies the fraction of traffic sent to backendService, computed as weight / (sum of all weightedBackendService weights in routeAction) . The selection of a backend service is determined only for new traffic. Once a user's request has been directed to a backendService, subsequent requests will be sent to the same backendService as determined by the BackendService's session affinity policy. The value must be between 0 and 1000
        """
        self._values = {
        }
        if backend_service is not None: self._values["backend_service"] = backend_service
        if header_action is not None: self._values["header_action"] = header_action
        if weight is not None: self._values["weight"] = weight

    @builtins.property
    def backend_service(self) -> typing.Optional[str]:
        """The full or partial URL to the default BackendService resource.

        Before forwarding the
        request to backendService, the loadbalancer applies any relevant headerActions
        specified as part of this backendServiceWeight.
        """
        return self._values.get('backend_service')

    @builtins.property
    def header_action(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderAction"]]:
        """header_action block."""
        return self._values.get('header_action')

    @builtins.property
    def weight(self) -> typing.Optional[jsii.Number]:
        """Specifies the fraction of traffic sent to backendService, computed as weight / (sum of all weightedBackendService weights in routeAction) .

        The selection of a backend service is determined only for new traffic. Once a user's request
        has been directed to a backendService, subsequent requests will be sent to the same backendService
        as determined by the BackendService's session affinity policy.

        The value must be between 0 and 1000
        """
        return self._values.get('weight')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionWeightedBackendServices(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderAction", jsii_struct_bases=[], name_mapping={'request_headers_to_add': 'requestHeadersToAdd', 'request_headers_to_remove': 'requestHeadersToRemove', 'response_headers_to_add': 'responseHeadersToAdd', 'response_headers_to_remove': 'responseHeadersToRemove'})
class ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderAction():
    def __init__(self, *, request_headers_to_add: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd"]]=None, request_headers_to_remove: typing.Optional[typing.List[str]]=None, response_headers_to_add: typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd"]]=None, response_headers_to_remove: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param request_headers_to_add: request_headers_to_add block.
        :param request_headers_to_remove: A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService.
        :param response_headers_to_add: response_headers_to_add block.
        :param response_headers_to_remove: A list of header names for headers that need to be removed from the response prior to sending the response back to the client.
        """
        self._values = {
        }
        if request_headers_to_add is not None: self._values["request_headers_to_add"] = request_headers_to_add
        if request_headers_to_remove is not None: self._values["request_headers_to_remove"] = request_headers_to_remove
        if response_headers_to_add is not None: self._values["response_headers_to_add"] = response_headers_to_add
        if response_headers_to_remove is not None: self._values["response_headers_to_remove"] = response_headers_to_remove

    @builtins.property
    def request_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd"]]:
        """request_headers_to_add block."""
        return self._values.get('request_headers_to_add')

    @builtins.property
    def request_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService."""
        return self._values.get('request_headers_to_remove')

    @builtins.property
    def response_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd"]]:
        """response_headers_to_add block."""
        return self._values.get('response_headers_to_add')

    @builtins.property
    def response_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the response prior to sending the response back to the client."""
        return self._values.get('response_headers_to_remove')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd():
    def __init__(self, *, header_name: typing.Optional[str]=None, header_value: typing.Optional[str]=None, replace: typing.Optional[bool]=None) -> None:
        """
        :param header_name: The name of the header to add.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
        }
        if header_name is not None: self._values["header_name"] = header_name
        if header_value is not None: self._values["header_value"] = header_value
        if replace is not None: self._values["replace"] = replace

    @builtins.property
    def header_name(self) -> typing.Optional[str]:
        """The name of the header to add."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> typing.Optional[str]:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> typing.Optional[bool]:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd():
    def __init__(self, *, header_name: typing.Optional[str]=None, header_value: typing.Optional[str]=None, replace: typing.Optional[bool]=None) -> None:
        """
        :param header_name: The name of the header to add.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
        }
        if header_name is not None: self._values["header_name"] = header_name
        if header_value is not None: self._values["header_value"] = header_value
        if replace is not None: self._values["replace"] = replace

    @builtins.property
    def header_name(self) -> typing.Optional[str]:
        """The name of the header to add."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> typing.Optional[str]:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> typing.Optional[bool]:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapDefaultUrlRedirect", jsii_struct_bases=[], name_mapping={'strip_query': 'stripQuery', 'host_redirect': 'hostRedirect', 'https_redirect': 'httpsRedirect', 'path_redirect': 'pathRedirect', 'prefix_redirect': 'prefixRedirect', 'redirect_response_code': 'redirectResponseCode'})
class ComputeUrlMapDefaultUrlRedirect():
    def __init__(self, *, strip_query: bool, host_redirect: typing.Optional[str]=None, https_redirect: typing.Optional[bool]=None, path_redirect: typing.Optional[str]=None, prefix_redirect: typing.Optional[str]=None, redirect_response_code: typing.Optional[str]=None) -> None:
        """
        :param strip_query: If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request. If set to false, the query portion of the original URL is retained. The default is set to false. This field is required to ensure an empty block is not set. The normal default value is false.
        :param host_redirect: The host that will be used in the redirect response instead of the one that was supplied in the request. The value must be between 1 and 255 characters.
        :param https_redirect: If set to true, the URL scheme in the redirected request is set to https. If set to false, the URL scheme of the redirected request will remain the same as that of the request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this true for TargetHttpsProxy is not permitted. The default is set to false.
        :param path_redirect: The path that will be used in the redirect response instead of the one that was supplied in the request. pathRedirect cannot be supplied together with prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param prefix_redirect: The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request. prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param redirect_response_code: The HTTP Status code to use for this RedirectAction. Supported values are:. MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301. FOUND, which corresponds to 302. SEE_OTHER which corresponds to 303. TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method will be retained. PERMANENT_REDIRECT, which corresponds to 308. In this case, the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        self._values = {
            'strip_query': strip_query,
        }
        if host_redirect is not None: self._values["host_redirect"] = host_redirect
        if https_redirect is not None: self._values["https_redirect"] = https_redirect
        if path_redirect is not None: self._values["path_redirect"] = path_redirect
        if prefix_redirect is not None: self._values["prefix_redirect"] = prefix_redirect
        if redirect_response_code is not None: self._values["redirect_response_code"] = redirect_response_code

    @builtins.property
    def strip_query(self) -> bool:
        """If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request.

        If set to false, the query portion of the original URL is
        retained. The default is set to false.
        This field is required to ensure an empty block is not set. The normal default value is false.
        """
        return self._values.get('strip_query')

    @builtins.property
    def host_redirect(self) -> typing.Optional[str]:
        """The host that will be used in the redirect response instead of the one that was supplied in the request.

        The value must be between 1 and 255 characters.
        """
        return self._values.get('host_redirect')

    @builtins.property
    def https_redirect(self) -> typing.Optional[bool]:
        """If set to true, the URL scheme in the redirected request is set to https.

        If set to
        false, the URL scheme of the redirected request will remain the same as that of the
        request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this
        true for TargetHttpsProxy is not permitted. The default is set to false.
        """
        return self._values.get('https_redirect')

    @builtins.property
    def path_redirect(self) -> typing.Optional[str]:
        """The path that will be used in the redirect response instead of the one that was supplied in the request.

        pathRedirect cannot be supplied together with
        prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the
        original request will be used for the redirect. The value must be between 1 and 1024
        characters.
        """
        return self._values.get('path_redirect')

    @builtins.property
    def prefix_redirect(self) -> typing.Optional[str]:
        """The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request.

        prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or
        neither. If neither is supplied, the path of the original request will be used for
        the redirect. The value must be between 1 and 1024 characters.
        """
        return self._values.get('prefix_redirect')

    @builtins.property
    def redirect_response_code(self) -> typing.Optional[str]:
        """The HTTP Status code to use for this RedirectAction. Supported values are:.

        MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301.

        FOUND, which corresponds to 302.

        SEE_OTHER which corresponds to 303.

        TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method
        will be retained.

        PERMANENT_REDIRECT, which corresponds to 308. In this case,
        the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        return self._values.get('redirect_response_code')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapDefaultUrlRedirect(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapHeaderAction", jsii_struct_bases=[], name_mapping={'request_headers_to_add': 'requestHeadersToAdd', 'request_headers_to_remove': 'requestHeadersToRemove', 'response_headers_to_add': 'responseHeadersToAdd', 'response_headers_to_remove': 'responseHeadersToRemove'})
class ComputeUrlMapHeaderAction():
    def __init__(self, *, request_headers_to_add: typing.Optional[typing.List["ComputeUrlMapHeaderActionRequestHeadersToAdd"]]=None, request_headers_to_remove: typing.Optional[typing.List[str]]=None, response_headers_to_add: typing.Optional[typing.List["ComputeUrlMapHeaderActionResponseHeadersToAdd"]]=None, response_headers_to_remove: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param request_headers_to_add: request_headers_to_add block.
        :param request_headers_to_remove: A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService.
        :param response_headers_to_add: response_headers_to_add block.
        :param response_headers_to_remove: A list of header names for headers that need to be removed from the response prior to sending the response back to the client.
        """
        self._values = {
        }
        if request_headers_to_add is not None: self._values["request_headers_to_add"] = request_headers_to_add
        if request_headers_to_remove is not None: self._values["request_headers_to_remove"] = request_headers_to_remove
        if response_headers_to_add is not None: self._values["response_headers_to_add"] = response_headers_to_add
        if response_headers_to_remove is not None: self._values["response_headers_to_remove"] = response_headers_to_remove

    @builtins.property
    def request_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapHeaderActionRequestHeadersToAdd"]]:
        """request_headers_to_add block."""
        return self._values.get('request_headers_to_add')

    @builtins.property
    def request_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService."""
        return self._values.get('request_headers_to_remove')

    @builtins.property
    def response_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapHeaderActionResponseHeadersToAdd"]]:
        """response_headers_to_add block."""
        return self._values.get('response_headers_to_add')

    @builtins.property
    def response_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the response prior to sending the response back to the client."""
        return self._values.get('response_headers_to_remove')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapHeaderAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapHeaderActionRequestHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapHeaderActionRequestHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapHeaderActionRequestHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapHeaderActionResponseHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapHeaderActionResponseHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapHeaderActionResponseHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapHostRule", jsii_struct_bases=[], name_mapping={'hosts': 'hosts', 'path_matcher': 'pathMatcher', 'description': 'description'})
class ComputeUrlMapHostRule():
    def __init__(self, *, hosts: typing.List[str], path_matcher: str, description: typing.Optional[str]=None) -> None:
        """
        :param hosts: The list of host patterns to match. They must be valid hostnames, except * will match any string of ([a-z0-9-.]*). In that case, * must be the first character and must be followed in the pattern by either - or ..
        :param path_matcher: The name of the PathMatcher to use to match the path portion of the URL if the hostRule matches the URL's host portion.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        """
        self._values = {
            'hosts': hosts,
            'path_matcher': path_matcher,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def hosts(self) -> typing.List[str]:
        """The list of host patterns to match.

        They must be valid hostnames, except * will
        match any string of ([a-z0-9-.]*). In that case, * must be the first character
        and must be followed in the pattern by either - or ..
        """
        return self._values.get('hosts')

    @builtins.property
    def path_matcher(self) -> str:
        """The name of the PathMatcher to use to match the path portion of the URL if the hostRule matches the URL's host portion."""
        return self._values.get('path_matcher')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when you create
        the resource.
        """
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapHostRule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcher", jsii_struct_bases=[], name_mapping={'name': 'name', 'default_route_action': 'defaultRouteAction', 'default_service': 'defaultService', 'default_url_redirect': 'defaultUrlRedirect', 'description': 'description', 'header_action': 'headerAction', 'path_rule': 'pathRule', 'route_rules': 'routeRules'})
class ComputeUrlMapPathMatcher():
    def __init__(self, *, name: str, default_route_action: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteAction"]]=None, default_service: typing.Optional[str]=None, default_url_redirect: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultUrlRedirect"]]=None, description: typing.Optional[str]=None, header_action: typing.Optional[typing.List["ComputeUrlMapPathMatcherHeaderAction"]]=None, path_rule: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRule"]]=None, route_rules: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRules"]]=None) -> None:
        """
        :param name: The name to which this PathMatcher is referred by the HostRule.
        :param default_route_action: default_route_action block.
        :param default_service: The backend service or backend bucket to use when none of the given paths match.
        :param default_url_redirect: default_url_redirect block.
        :param description: An optional description of this resource. Provide this property when you create the resource.
        :param header_action: header_action block.
        :param path_rule: path_rule block.
        :param route_rules: route_rules block.
        """
        self._values = {
            'name': name,
        }
        if default_route_action is not None: self._values["default_route_action"] = default_route_action
        if default_service is not None: self._values["default_service"] = default_service
        if default_url_redirect is not None: self._values["default_url_redirect"] = default_url_redirect
        if description is not None: self._values["description"] = description
        if header_action is not None: self._values["header_action"] = header_action
        if path_rule is not None: self._values["path_rule"] = path_rule
        if route_rules is not None: self._values["route_rules"] = route_rules

    @builtins.property
    def name(self) -> str:
        """The name to which this PathMatcher is referred by the HostRule."""
        return self._values.get('name')

    @builtins.property
    def default_route_action(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteAction"]]:
        """default_route_action block."""
        return self._values.get('default_route_action')

    @builtins.property
    def default_service(self) -> typing.Optional[str]:
        """The backend service or backend bucket to use when none of the given paths match."""
        return self._values.get('default_service')

    @builtins.property
    def default_url_redirect(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultUrlRedirect"]]:
        """default_url_redirect block."""
        return self._values.get('default_url_redirect')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource.

        Provide this property when you create
        the resource.
        """
        return self._values.get('description')

    @builtins.property
    def header_action(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherHeaderAction"]]:
        """header_action block."""
        return self._values.get('header_action')

    @builtins.property
    def path_rule(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRule"]]:
        """path_rule block."""
        return self._values.get('path_rule')

    @builtins.property
    def route_rules(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRules"]]:
        """route_rules block."""
        return self._values.get('route_rules')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcher(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteAction", jsii_struct_bases=[], name_mapping={'cors_policy': 'corsPolicy', 'fault_injection_policy': 'faultInjectionPolicy', 'request_mirror_policy': 'requestMirrorPolicy', 'retry_policy': 'retryPolicy', 'timeout': 'timeout', 'url_rewrite': 'urlRewrite', 'weighted_backend_services': 'weightedBackendServices'})
class ComputeUrlMapPathMatcherDefaultRouteAction():
    def __init__(self, *, cors_policy: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionCorsPolicy"]]=None, fault_injection_policy: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicy"]]=None, request_mirror_policy: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionRequestMirrorPolicy"]]=None, retry_policy: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionRetryPolicy"]]=None, timeout: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionTimeout"]]=None, url_rewrite: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionUrlRewrite"]]=None, weighted_backend_services: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServices"]]=None) -> None:
        """
        :param cors_policy: cors_policy block.
        :param fault_injection_policy: fault_injection_policy block.
        :param request_mirror_policy: request_mirror_policy block.
        :param retry_policy: retry_policy block.
        :param timeout: timeout block.
        :param url_rewrite: url_rewrite block.
        :param weighted_backend_services: weighted_backend_services block.
        """
        self._values = {
        }
        if cors_policy is not None: self._values["cors_policy"] = cors_policy
        if fault_injection_policy is not None: self._values["fault_injection_policy"] = fault_injection_policy
        if request_mirror_policy is not None: self._values["request_mirror_policy"] = request_mirror_policy
        if retry_policy is not None: self._values["retry_policy"] = retry_policy
        if timeout is not None: self._values["timeout"] = timeout
        if url_rewrite is not None: self._values["url_rewrite"] = url_rewrite
        if weighted_backend_services is not None: self._values["weighted_backend_services"] = weighted_backend_services

    @builtins.property
    def cors_policy(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionCorsPolicy"]]:
        """cors_policy block."""
        return self._values.get('cors_policy')

    @builtins.property
    def fault_injection_policy(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicy"]]:
        """fault_injection_policy block."""
        return self._values.get('fault_injection_policy')

    @builtins.property
    def request_mirror_policy(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionRequestMirrorPolicy"]]:
        """request_mirror_policy block."""
        return self._values.get('request_mirror_policy')

    @builtins.property
    def retry_policy(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionRetryPolicy"]]:
        """retry_policy block."""
        return self._values.get('retry_policy')

    @builtins.property
    def timeout(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionTimeout"]]:
        """timeout block."""
        return self._values.get('timeout')

    @builtins.property
    def url_rewrite(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionUrlRewrite"]]:
        """url_rewrite block."""
        return self._values.get('url_rewrite')

    @builtins.property
    def weighted_backend_services(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServices"]]:
        """weighted_backend_services block."""
        return self._values.get('weighted_backend_services')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionCorsPolicy", jsii_struct_bases=[], name_mapping={'allow_credentials': 'allowCredentials', 'allow_headers': 'allowHeaders', 'allow_methods': 'allowMethods', 'allow_origin_regexes': 'allowOriginRegexes', 'allow_origins': 'allowOrigins', 'disabled': 'disabled', 'expose_headers': 'exposeHeaders', 'max_age': 'maxAge'})
class ComputeUrlMapPathMatcherDefaultRouteActionCorsPolicy():
    def __init__(self, *, allow_credentials: typing.Optional[bool]=None, allow_headers: typing.Optional[typing.List[str]]=None, allow_methods: typing.Optional[typing.List[str]]=None, allow_origin_regexes: typing.Optional[typing.List[str]]=None, allow_origins: typing.Optional[typing.List[str]]=None, disabled: typing.Optional[bool]=None, expose_headers: typing.Optional[typing.List[str]]=None, max_age: typing.Optional[jsii.Number]=None) -> None:
        """
        :param allow_credentials: In response to a preflight request, setting this to true indicates that the actual request can include user credentials. This translates to the Access-Control-Allow-Credentials header.
        :param allow_headers: Specifies the content for the Access-Control-Allow-Headers header.
        :param allow_methods: Specifies the content for the Access-Control-Allow-Methods header.
        :param allow_origin_regexes: Specifies the regualar expression patterns that match allowed origins. For regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript An origin is allowed if it matches either an item in allowOrigins or an item in allowOriginRegexes.
        :param allow_origins: Specifies the list of origins that will be allowed to do CORS requests. An origin is allowed if it matches either an item in allowOrigins or an item in allowOriginRegexes.
        :param disabled: If true, specifies the CORS policy is disabled. The default value is false, which indicates that the CORS policy is in effect.
        :param expose_headers: Specifies the content for the Access-Control-Expose-Headers header.
        :param max_age: Specifies how long results of a preflight request can be cached in seconds. This translates to the Access-Control-Max-Age header.
        """
        self._values = {
        }
        if allow_credentials is not None: self._values["allow_credentials"] = allow_credentials
        if allow_headers is not None: self._values["allow_headers"] = allow_headers
        if allow_methods is not None: self._values["allow_methods"] = allow_methods
        if allow_origin_regexes is not None: self._values["allow_origin_regexes"] = allow_origin_regexes
        if allow_origins is not None: self._values["allow_origins"] = allow_origins
        if disabled is not None: self._values["disabled"] = disabled
        if expose_headers is not None: self._values["expose_headers"] = expose_headers
        if max_age is not None: self._values["max_age"] = max_age

    @builtins.property
    def allow_credentials(self) -> typing.Optional[bool]:
        """In response to a preflight request, setting this to true indicates that the actual request can include user credentials.

        This translates to the Access-Control-Allow-Credentials header.
        """
        return self._values.get('allow_credentials')

    @builtins.property
    def allow_headers(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Allow-Headers header."""
        return self._values.get('allow_headers')

    @builtins.property
    def allow_methods(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Allow-Methods header."""
        return self._values.get('allow_methods')

    @builtins.property
    def allow_origin_regexes(self) -> typing.Optional[typing.List[str]]:
        """Specifies the regualar expression patterns that match allowed origins.

        For regular expression grammar
        please see en.cppreference.com/w/cpp/regex/ecmascript
        An origin is allowed if it matches either an item in allowOrigins or an item in allowOriginRegexes.
        """
        return self._values.get('allow_origin_regexes')

    @builtins.property
    def allow_origins(self) -> typing.Optional[typing.List[str]]:
        """Specifies the list of origins that will be allowed to do CORS requests.

        An origin is allowed if it matches either an item in allowOrigins or an item in allowOriginRegexes.
        """
        return self._values.get('allow_origins')

    @builtins.property
    def disabled(self) -> typing.Optional[bool]:
        """If true, specifies the CORS policy is disabled.

        The default value is false, which indicates that the CORS policy is in effect.
        """
        return self._values.get('disabled')

    @builtins.property
    def expose_headers(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Expose-Headers header."""
        return self._values.get('expose_headers')

    @builtins.property
    def max_age(self) -> typing.Optional[jsii.Number]:
        """Specifies how long results of a preflight request can be cached in seconds.

        This translates to the Access-Control-Max-Age header.
        """
        return self._values.get('max_age')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionCorsPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicy", jsii_struct_bases=[], name_mapping={'abort': 'abort', 'delay': 'delay'})
class ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicy():
    def __init__(self, *, abort: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyAbort"]]=None, delay: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyDelay"]]=None) -> None:
        """
        :param abort: abort block.
        :param delay: delay block.
        """
        self._values = {
        }
        if abort is not None: self._values["abort"] = abort
        if delay is not None: self._values["delay"] = delay

    @builtins.property
    def abort(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyAbort"]]:
        """abort block."""
        return self._values.get('abort')

    @builtins.property
    def delay(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyDelay"]]:
        """delay block."""
        return self._values.get('delay')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyAbort", jsii_struct_bases=[], name_mapping={'http_status': 'httpStatus', 'percentage': 'percentage'})
class ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyAbort():
    def __init__(self, *, http_status: typing.Optional[jsii.Number]=None, percentage: typing.Optional[jsii.Number]=None) -> None:
        """
        :param http_status: The HTTP status code used to abort the request. The value must be between 200 and 599 inclusive.
        :param percentage: The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection. The value must be between 0.0 and 100.0 inclusive.
        """
        self._values = {
        }
        if http_status is not None: self._values["http_status"] = http_status
        if percentage is not None: self._values["percentage"] = percentage

    @builtins.property
    def http_status(self) -> typing.Optional[jsii.Number]:
        """The HTTP status code used to abort the request.

        The value must be between 200 and 599 inclusive.
        """
        return self._values.get('http_status')

    @builtins.property
    def percentage(self) -> typing.Optional[jsii.Number]:
        """The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection.

        The value must be between 0.0 and 100.0 inclusive.
        """
        return self._values.get('percentage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyAbort(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyDelay", jsii_struct_bases=[], name_mapping={'fixed_delay': 'fixedDelay', 'percentage': 'percentage'})
class ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyDelay():
    def __init__(self, *, fixed_delay: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyDelayFixedDelay"]]=None, percentage: typing.Optional[jsii.Number]=None) -> None:
        """
        :param fixed_delay: fixed_delay block.
        :param percentage: The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection. The value must be between 0.0 and 100.0 inclusive.
        """
        self._values = {
        }
        if fixed_delay is not None: self._values["fixed_delay"] = fixed_delay
        if percentage is not None: self._values["percentage"] = percentage

    @builtins.property
    def fixed_delay(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyDelayFixedDelay"]]:
        """fixed_delay block."""
        return self._values.get('fixed_delay')

    @builtins.property
    def percentage(self) -> typing.Optional[jsii.Number]:
        """The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection.

        The value must be between 0.0 and 100.0 inclusive.
        """
        return self._values.get('percentage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyDelay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyDelayFixedDelay", jsii_struct_bases=[], name_mapping={'nanos': 'nanos', 'seconds': 'seconds'})
class ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyDelayFixedDelay():
    def __init__(self, *, nanos: typing.Optional[jsii.Number]=None, seconds: typing.Optional[str]=None) -> None:
        """
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive. Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
        """
        self._values = {
        }
        if nanos is not None: self._values["nanos"] = nanos
        if seconds is not None: self._values["seconds"] = seconds

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations less than one second are
        represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    @builtins.property
    def seconds(self) -> typing.Optional[str]:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000 inclusive.
        Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
        """
        return self._values.get('seconds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyDelayFixedDelay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionRequestMirrorPolicy", jsii_struct_bases=[], name_mapping={'backend_service': 'backendService'})
class ComputeUrlMapPathMatcherDefaultRouteActionRequestMirrorPolicy():
    def __init__(self, *, backend_service: str) -> None:
        """
        :param backend_service: The full or partial URL to the BackendService resource being mirrored to.
        """
        self._values = {
            'backend_service': backend_service,
        }

    @builtins.property
    def backend_service(self) -> str:
        """The full or partial URL to the BackendService resource being mirrored to."""
        return self._values.get('backend_service')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionRequestMirrorPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionRetryPolicy", jsii_struct_bases=[], name_mapping={'num_retries': 'numRetries', 'per_try_timeout': 'perTryTimeout', 'retry_conditions': 'retryConditions'})
class ComputeUrlMapPathMatcherDefaultRouteActionRetryPolicy():
    def __init__(self, *, num_retries: typing.Optional[jsii.Number]=None, per_try_timeout: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionRetryPolicyPerTryTimeout"]]=None, retry_conditions: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param num_retries: Specifies the allowed number retries. This number must be > 0. If not specified, defaults to 1.
        :param per_try_timeout: per_try_timeout block.
        :param retry_conditions: Specfies one or more conditions when this retry rule applies. Valid values are:. 5xx: Loadbalancer will attempt a retry if the backend service responds with any 5xx response code, or if the backend service does not respond at all, example: disconnects, reset, read timeout, connection failure, and refused streams. gateway-error: Similar to 5xx, but only applies to response codes 502, 503 or 504. connect-failure: Loadbalancer will retry on failures connecting to backend services, for example due to connection timeouts. retriable-4xx: Loadbalancer will retry for retriable 4xx response codes. Currently the only retriable error supported is 409. refused-stream:Loadbalancer will retry if the backend service resets the stream with a REFUSED_STREAM error code. This reset type indicates that it is safe to retry. cancelled: Loadbalancer will retry if the gRPC status code in the response header is set to cancelled deadline-exceeded: Loadbalancer will retry if the gRPC status code in the response header is set to deadline-exceeded resource-exhausted: Loadbalancer will retry if the gRPC status code in the response header is set to resource-exhausted unavailable: Loadbalancer will retry if the gRPC status code in the response header is set to unavailable
        """
        self._values = {
        }
        if num_retries is not None: self._values["num_retries"] = num_retries
        if per_try_timeout is not None: self._values["per_try_timeout"] = per_try_timeout
        if retry_conditions is not None: self._values["retry_conditions"] = retry_conditions

    @builtins.property
    def num_retries(self) -> typing.Optional[jsii.Number]:
        """Specifies the allowed number retries.

        This number must be > 0. If not specified, defaults to 1.
        """
        return self._values.get('num_retries')

    @builtins.property
    def per_try_timeout(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionRetryPolicyPerTryTimeout"]]:
        """per_try_timeout block."""
        return self._values.get('per_try_timeout')

    @builtins.property
    def retry_conditions(self) -> typing.Optional[typing.List[str]]:
        """Specfies one or more conditions when this retry rule applies. Valid values are:.

        5xx: Loadbalancer will attempt a retry if the backend service responds with any 5xx response code,
        or if the backend service does not respond at all, example: disconnects, reset, read timeout,
        connection failure, and refused streams.
        gateway-error: Similar to 5xx, but only applies to response codes 502, 503 or 504.
        connect-failure: Loadbalancer will retry on failures connecting to backend services,
        for example due to connection timeouts.
        retriable-4xx: Loadbalancer will retry for retriable 4xx response codes.
        Currently the only retriable error supported is 409.
        refused-stream:Loadbalancer will retry if the backend service resets the stream with a REFUSED_STREAM error code.
        This reset type indicates that it is safe to retry.
        cancelled: Loadbalancer will retry if the gRPC status code in the response header is set to cancelled
        deadline-exceeded: Loadbalancer will retry if the gRPC status code in the response header is set to deadline-exceeded
        resource-exhausted: Loadbalancer will retry if the gRPC status code in the response header is set to resource-exhausted
        unavailable: Loadbalancer will retry if the gRPC status code in the response header is set to unavailable
        """
        return self._values.get('retry_conditions')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionRetryPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionRetryPolicyPerTryTimeout", jsii_struct_bases=[], name_mapping={'nanos': 'nanos', 'seconds': 'seconds'})
class ComputeUrlMapPathMatcherDefaultRouteActionRetryPolicyPerTryTimeout():
    def __init__(self, *, nanos: typing.Optional[jsii.Number]=None, seconds: typing.Optional[str]=None) -> None:
        """
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive. Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
        """
        self._values = {
        }
        if nanos is not None: self._values["nanos"] = nanos
        if seconds is not None: self._values["seconds"] = seconds

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations less than one second are
        represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    @builtins.property
    def seconds(self) -> typing.Optional[str]:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000 inclusive.
        Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
        """
        return self._values.get('seconds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionRetryPolicyPerTryTimeout(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionTimeout", jsii_struct_bases=[], name_mapping={'nanos': 'nanos', 'seconds': 'seconds'})
class ComputeUrlMapPathMatcherDefaultRouteActionTimeout():
    def __init__(self, *, nanos: typing.Optional[jsii.Number]=None, seconds: typing.Optional[str]=None) -> None:
        """
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive. Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
        """
        self._values = {
        }
        if nanos is not None: self._values["nanos"] = nanos
        if seconds is not None: self._values["seconds"] = seconds

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations less than one second are represented
        with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    @builtins.property
    def seconds(self) -> typing.Optional[str]:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000 inclusive.
        Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
        """
        return self._values.get('seconds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionTimeout(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionUrlRewrite", jsii_struct_bases=[], name_mapping={'host_rewrite': 'hostRewrite', 'path_prefix_rewrite': 'pathPrefixRewrite'})
class ComputeUrlMapPathMatcherDefaultRouteActionUrlRewrite():
    def __init__(self, *, host_rewrite: typing.Optional[str]=None, path_prefix_rewrite: typing.Optional[str]=None) -> None:
        """
        :param host_rewrite: Prior to forwarding the request to the selected service, the request's host header is replaced with contents of hostRewrite. The value must be between 1 and 255 characters.
        :param path_prefix_rewrite: Prior to forwarding the request to the selected backend service, the matching portion of the request's path is replaced by pathPrefixRewrite. The value must be between 1 and 1024 characters.
        """
        self._values = {
        }
        if host_rewrite is not None: self._values["host_rewrite"] = host_rewrite
        if path_prefix_rewrite is not None: self._values["path_prefix_rewrite"] = path_prefix_rewrite

    @builtins.property
    def host_rewrite(self) -> typing.Optional[str]:
        """Prior to forwarding the request to the selected service, the request's host header is replaced with contents of hostRewrite.

        The value must be between 1 and 255 characters.
        """
        return self._values.get('host_rewrite')

    @builtins.property
    def path_prefix_rewrite(self) -> typing.Optional[str]:
        """Prior to forwarding the request to the selected backend service, the matching portion of the request's path is replaced by pathPrefixRewrite.

        The value must be between 1 and 1024 characters.
        """
        return self._values.get('path_prefix_rewrite')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionUrlRewrite(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServices", jsii_struct_bases=[], name_mapping={'backend_service': 'backendService', 'header_action': 'headerAction', 'weight': 'weight'})
class ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServices():
    def __init__(self, *, backend_service: typing.Optional[str]=None, header_action: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderAction"]]=None, weight: typing.Optional[jsii.Number]=None) -> None:
        """
        :param backend_service: The full or partial URL to the default BackendService resource. Before forwarding the request to backendService, the loadbalancer applies any relevant headerActions specified as part of this backendServiceWeight.
        :param header_action: header_action block.
        :param weight: Specifies the fraction of traffic sent to backendService, computed as weight / (sum of all weightedBackendService weights in routeAction) . The selection of a backend service is determined only for new traffic. Once a user's request has been directed to a backendService, subsequent requests will be sent to the same backendService as determined by the BackendService's session affinity policy. The value must be between 0 and 1000
        """
        self._values = {
        }
        if backend_service is not None: self._values["backend_service"] = backend_service
        if header_action is not None: self._values["header_action"] = header_action
        if weight is not None: self._values["weight"] = weight

    @builtins.property
    def backend_service(self) -> typing.Optional[str]:
        """The full or partial URL to the default BackendService resource.

        Before forwarding the
        request to backendService, the loadbalancer applies any relevant headerActions
        specified as part of this backendServiceWeight.
        """
        return self._values.get('backend_service')

    @builtins.property
    def header_action(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderAction"]]:
        """header_action block."""
        return self._values.get('header_action')

    @builtins.property
    def weight(self) -> typing.Optional[jsii.Number]:
        """Specifies the fraction of traffic sent to backendService, computed as weight / (sum of all weightedBackendService weights in routeAction) .

        The selection of a backend service is determined only for new traffic. Once a user's request
        has been directed to a backendService, subsequent requests will be sent to the same backendService
        as determined by the BackendService's session affinity policy.

        The value must be between 0 and 1000
        """
        return self._values.get('weight')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServices(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderAction", jsii_struct_bases=[], name_mapping={'request_headers_to_add': 'requestHeadersToAdd', 'request_headers_to_remove': 'requestHeadersToRemove', 'response_headers_to_add': 'responseHeadersToAdd', 'response_headers_to_remove': 'responseHeadersToRemove'})
class ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderAction():
    def __init__(self, *, request_headers_to_add: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd"]]=None, request_headers_to_remove: typing.Optional[typing.List[str]]=None, response_headers_to_add: typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd"]]=None, response_headers_to_remove: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param request_headers_to_add: request_headers_to_add block.
        :param request_headers_to_remove: A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService.
        :param response_headers_to_add: response_headers_to_add block.
        :param response_headers_to_remove: A list of header names for headers that need to be removed from the response prior to sending the response back to the client.
        """
        self._values = {
        }
        if request_headers_to_add is not None: self._values["request_headers_to_add"] = request_headers_to_add
        if request_headers_to_remove is not None: self._values["request_headers_to_remove"] = request_headers_to_remove
        if response_headers_to_add is not None: self._values["response_headers_to_add"] = response_headers_to_add
        if response_headers_to_remove is not None: self._values["response_headers_to_remove"] = response_headers_to_remove

    @builtins.property
    def request_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd"]]:
        """request_headers_to_add block."""
        return self._values.get('request_headers_to_add')

    @builtins.property
    def request_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService."""
        return self._values.get('request_headers_to_remove')

    @builtins.property
    def response_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd"]]:
        """response_headers_to_add block."""
        return self._values.get('response_headers_to_add')

    @builtins.property
    def response_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the response prior to sending the response back to the client."""
        return self._values.get('response_headers_to_remove')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd():
    def __init__(self, *, header_name: typing.Optional[str]=None, header_value: typing.Optional[str]=None, replace: typing.Optional[bool]=None) -> None:
        """
        :param header_name: The name of the header to add.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
        }
        if header_name is not None: self._values["header_name"] = header_name
        if header_value is not None: self._values["header_value"] = header_value
        if replace is not None: self._values["replace"] = replace

    @builtins.property
    def header_name(self) -> typing.Optional[str]:
        """The name of the header to add."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> typing.Optional[str]:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> typing.Optional[bool]:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd():
    def __init__(self, *, header_name: typing.Optional[str]=None, header_value: typing.Optional[str]=None, replace: typing.Optional[bool]=None) -> None:
        """
        :param header_name: The name of the header to add.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
        }
        if header_name is not None: self._values["header_name"] = header_name
        if header_value is not None: self._values["header_value"] = header_value
        if replace is not None: self._values["replace"] = replace

    @builtins.property
    def header_name(self) -> typing.Optional[str]:
        """The name of the header to add."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> typing.Optional[str]:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> typing.Optional[bool]:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherDefaultUrlRedirect", jsii_struct_bases=[], name_mapping={'strip_query': 'stripQuery', 'host_redirect': 'hostRedirect', 'https_redirect': 'httpsRedirect', 'path_redirect': 'pathRedirect', 'prefix_redirect': 'prefixRedirect', 'redirect_response_code': 'redirectResponseCode'})
class ComputeUrlMapPathMatcherDefaultUrlRedirect():
    def __init__(self, *, strip_query: bool, host_redirect: typing.Optional[str]=None, https_redirect: typing.Optional[bool]=None, path_redirect: typing.Optional[str]=None, prefix_redirect: typing.Optional[str]=None, redirect_response_code: typing.Optional[str]=None) -> None:
        """
        :param strip_query: If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request. If set to false, the query portion of the original URL is retained. This field is required to ensure an empty block is not set. The normal default value is false.
        :param host_redirect: The host that will be used in the redirect response instead of the one that was supplied in the request. The value must be between 1 and 255 characters.
        :param https_redirect: If set to true, the URL scheme in the redirected request is set to https. If set to false, the URL scheme of the redirected request will remain the same as that of the request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this true for TargetHttpsProxy is not permitted. The default is set to false.
        :param path_redirect: The path that will be used in the redirect response instead of the one that was supplied in the request. pathRedirect cannot be supplied together with prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param prefix_redirect: The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request. prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param redirect_response_code: The HTTP Status code to use for this RedirectAction. Supported values are:. MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301. FOUND, which corresponds to 302. SEE_OTHER which corresponds to 303. TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method will be retained. PERMANENT_REDIRECT, which corresponds to 308. In this case, the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        self._values = {
            'strip_query': strip_query,
        }
        if host_redirect is not None: self._values["host_redirect"] = host_redirect
        if https_redirect is not None: self._values["https_redirect"] = https_redirect
        if path_redirect is not None: self._values["path_redirect"] = path_redirect
        if prefix_redirect is not None: self._values["prefix_redirect"] = prefix_redirect
        if redirect_response_code is not None: self._values["redirect_response_code"] = redirect_response_code

    @builtins.property
    def strip_query(self) -> bool:
        """If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request.

        If set to false, the query portion of the original URL is
        retained.
        This field is required to ensure an empty block is not set. The normal default value is false.
        """
        return self._values.get('strip_query')

    @builtins.property
    def host_redirect(self) -> typing.Optional[str]:
        """The host that will be used in the redirect response instead of the one that was supplied in the request.

        The value must be between 1 and 255 characters.
        """
        return self._values.get('host_redirect')

    @builtins.property
    def https_redirect(self) -> typing.Optional[bool]:
        """If set to true, the URL scheme in the redirected request is set to https.

        If set to
        false, the URL scheme of the redirected request will remain the same as that of the
        request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this
        true for TargetHttpsProxy is not permitted. The default is set to false.
        """
        return self._values.get('https_redirect')

    @builtins.property
    def path_redirect(self) -> typing.Optional[str]:
        """The path that will be used in the redirect response instead of the one that was supplied in the request.

        pathRedirect cannot be supplied together with
        prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the
        original request will be used for the redirect. The value must be between 1 and 1024
        characters.
        """
        return self._values.get('path_redirect')

    @builtins.property
    def prefix_redirect(self) -> typing.Optional[str]:
        """The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request.

        prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or
        neither. If neither is supplied, the path of the original request will be used for
        the redirect. The value must be between 1 and 1024 characters.
        """
        return self._values.get('prefix_redirect')

    @builtins.property
    def redirect_response_code(self) -> typing.Optional[str]:
        """The HTTP Status code to use for this RedirectAction. Supported values are:.

        MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301.

        FOUND, which corresponds to 302.

        SEE_OTHER which corresponds to 303.

        TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method
        will be retained.

        PERMANENT_REDIRECT, which corresponds to 308. In this case,
        the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        return self._values.get('redirect_response_code')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherDefaultUrlRedirect(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherHeaderAction", jsii_struct_bases=[], name_mapping={'request_headers_to_add': 'requestHeadersToAdd', 'request_headers_to_remove': 'requestHeadersToRemove', 'response_headers_to_add': 'responseHeadersToAdd', 'response_headers_to_remove': 'responseHeadersToRemove'})
class ComputeUrlMapPathMatcherHeaderAction():
    def __init__(self, *, request_headers_to_add: typing.Optional[typing.List["ComputeUrlMapPathMatcherHeaderActionRequestHeadersToAdd"]]=None, request_headers_to_remove: typing.Optional[typing.List[str]]=None, response_headers_to_add: typing.Optional[typing.List["ComputeUrlMapPathMatcherHeaderActionResponseHeadersToAdd"]]=None, response_headers_to_remove: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param request_headers_to_add: request_headers_to_add block.
        :param request_headers_to_remove: A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService.
        :param response_headers_to_add: response_headers_to_add block.
        :param response_headers_to_remove: A list of header names for headers that need to be removed from the response prior to sending the response back to the client.
        """
        self._values = {
        }
        if request_headers_to_add is not None: self._values["request_headers_to_add"] = request_headers_to_add
        if request_headers_to_remove is not None: self._values["request_headers_to_remove"] = request_headers_to_remove
        if response_headers_to_add is not None: self._values["response_headers_to_add"] = response_headers_to_add
        if response_headers_to_remove is not None: self._values["response_headers_to_remove"] = response_headers_to_remove

    @builtins.property
    def request_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherHeaderActionRequestHeadersToAdd"]]:
        """request_headers_to_add block."""
        return self._values.get('request_headers_to_add')

    @builtins.property
    def request_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService."""
        return self._values.get('request_headers_to_remove')

    @builtins.property
    def response_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherHeaderActionResponseHeadersToAdd"]]:
        """response_headers_to_add block."""
        return self._values.get('response_headers_to_add')

    @builtins.property
    def response_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the response prior to sending the response back to the client."""
        return self._values.get('response_headers_to_remove')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherHeaderAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherHeaderActionRequestHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapPathMatcherHeaderActionRequestHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherHeaderActionRequestHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherHeaderActionResponseHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapPathMatcherHeaderActionResponseHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherHeaderActionResponseHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRule", jsii_struct_bases=[], name_mapping={'paths': 'paths', 'route_action': 'routeAction', 'service': 'service', 'url_redirect': 'urlRedirect'})
class ComputeUrlMapPathMatcherPathRule():
    def __init__(self, *, paths: typing.List[str], route_action: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteAction"]]=None, service: typing.Optional[str]=None, url_redirect: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleUrlRedirect"]]=None) -> None:
        """
        :param paths: The list of path patterns to match. Each must start with / and the only place a is allowed is at the end following a /. The string fed to the path matcher does not include any text after the first ? or #, and those chars are not allowed here.
        :param route_action: route_action block.
        :param service: The backend service or backend bucket to use if any of the given paths match.
        :param url_redirect: url_redirect block.
        """
        self._values = {
            'paths': paths,
        }
        if route_action is not None: self._values["route_action"] = route_action
        if service is not None: self._values["service"] = service
        if url_redirect is not None: self._values["url_redirect"] = url_redirect

    @builtins.property
    def paths(self) -> typing.List[str]:
        """The list of path patterns to match.

        Each must start with / and the only place a
        is allowed is at the end following a /. The string fed to the path matcher
        does not include any text after the first ? or #, and those chars are not
        allowed here.
        """
        return self._values.get('paths')

    @builtins.property
    def route_action(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteAction"]]:
        """route_action block."""
        return self._values.get('route_action')

    @builtins.property
    def service(self) -> typing.Optional[str]:
        """The backend service or backend bucket to use if any of the given paths match."""
        return self._values.get('service')

    @builtins.property
    def url_redirect(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleUrlRedirect"]]:
        """url_redirect block."""
        return self._values.get('url_redirect')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteAction", jsii_struct_bases=[], name_mapping={'cors_policy': 'corsPolicy', 'fault_injection_policy': 'faultInjectionPolicy', 'request_mirror_policy': 'requestMirrorPolicy', 'retry_policy': 'retryPolicy', 'timeout': 'timeout', 'url_rewrite': 'urlRewrite', 'weighted_backend_services': 'weightedBackendServices'})
class ComputeUrlMapPathMatcherPathRuleRouteAction():
    def __init__(self, *, cors_policy: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionCorsPolicy"]]=None, fault_injection_policy: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicy"]]=None, request_mirror_policy: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicy"]]=None, retry_policy: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionRetryPolicy"]]=None, timeout: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionTimeout"]]=None, url_rewrite: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionUrlRewrite"]]=None, weighted_backend_services: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServices"]]=None) -> None:
        """
        :param cors_policy: cors_policy block.
        :param fault_injection_policy: fault_injection_policy block.
        :param request_mirror_policy: request_mirror_policy block.
        :param retry_policy: retry_policy block.
        :param timeout: timeout block.
        :param url_rewrite: url_rewrite block.
        :param weighted_backend_services: weighted_backend_services block.
        """
        self._values = {
        }
        if cors_policy is not None: self._values["cors_policy"] = cors_policy
        if fault_injection_policy is not None: self._values["fault_injection_policy"] = fault_injection_policy
        if request_mirror_policy is not None: self._values["request_mirror_policy"] = request_mirror_policy
        if retry_policy is not None: self._values["retry_policy"] = retry_policy
        if timeout is not None: self._values["timeout"] = timeout
        if url_rewrite is not None: self._values["url_rewrite"] = url_rewrite
        if weighted_backend_services is not None: self._values["weighted_backend_services"] = weighted_backend_services

    @builtins.property
    def cors_policy(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionCorsPolicy"]]:
        """cors_policy block."""
        return self._values.get('cors_policy')

    @builtins.property
    def fault_injection_policy(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicy"]]:
        """fault_injection_policy block."""
        return self._values.get('fault_injection_policy')

    @builtins.property
    def request_mirror_policy(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicy"]]:
        """request_mirror_policy block."""
        return self._values.get('request_mirror_policy')

    @builtins.property
    def retry_policy(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionRetryPolicy"]]:
        """retry_policy block."""
        return self._values.get('retry_policy')

    @builtins.property
    def timeout(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionTimeout"]]:
        """timeout block."""
        return self._values.get('timeout')

    @builtins.property
    def url_rewrite(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionUrlRewrite"]]:
        """url_rewrite block."""
        return self._values.get('url_rewrite')

    @builtins.property
    def weighted_backend_services(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServices"]]:
        """weighted_backend_services block."""
        return self._values.get('weighted_backend_services')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionCorsPolicy", jsii_struct_bases=[], name_mapping={'disabled': 'disabled', 'allow_credentials': 'allowCredentials', 'allow_headers': 'allowHeaders', 'allow_methods': 'allowMethods', 'allow_origin_regexes': 'allowOriginRegexes', 'allow_origins': 'allowOrigins', 'expose_headers': 'exposeHeaders', 'max_age': 'maxAge'})
class ComputeUrlMapPathMatcherPathRuleRouteActionCorsPolicy():
    def __init__(self, *, disabled: bool, allow_credentials: typing.Optional[bool]=None, allow_headers: typing.Optional[typing.List[str]]=None, allow_methods: typing.Optional[typing.List[str]]=None, allow_origin_regexes: typing.Optional[typing.List[str]]=None, allow_origins: typing.Optional[typing.List[str]]=None, expose_headers: typing.Optional[typing.List[str]]=None, max_age: typing.Optional[jsii.Number]=None) -> None:
        """
        :param disabled: If true, specifies the CORS policy is disabled.
        :param allow_credentials: In response to a preflight request, setting this to true indicates that the actual request can include user credentials. This translates to the Access- Control-Allow-Credentials header. Defaults to false.
        :param allow_headers: Specifies the content for the Access-Control-Allow-Headers header.
        :param allow_methods: Specifies the content for the Access-Control-Allow-Methods header.
        :param allow_origin_regexes: Specifies the regualar expression patterns that match allowed origins. For regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript An origin is allowed if it matches either allow_origins or allow_origin_regex.
        :param allow_origins: Specifies the list of origins that will be allowed to do CORS requests. An origin is allowed if it matches either allow_origins or allow_origin_regex.
        :param expose_headers: Specifies the content for the Access-Control-Expose-Headers header.
        :param max_age: Specifies how long the results of a preflight request can be cached. This translates to the content for the Access-Control-Max-Age header.
        """
        self._values = {
            'disabled': disabled,
        }
        if allow_credentials is not None: self._values["allow_credentials"] = allow_credentials
        if allow_headers is not None: self._values["allow_headers"] = allow_headers
        if allow_methods is not None: self._values["allow_methods"] = allow_methods
        if allow_origin_regexes is not None: self._values["allow_origin_regexes"] = allow_origin_regexes
        if allow_origins is not None: self._values["allow_origins"] = allow_origins
        if expose_headers is not None: self._values["expose_headers"] = expose_headers
        if max_age is not None: self._values["max_age"] = max_age

    @builtins.property
    def disabled(self) -> bool:
        """If true, specifies the CORS policy is disabled."""
        return self._values.get('disabled')

    @builtins.property
    def allow_credentials(self) -> typing.Optional[bool]:
        """In response to a preflight request, setting this to true indicates that the actual request can include user credentials.

        This translates to the Access-
        Control-Allow-Credentials header. Defaults to false.
        """
        return self._values.get('allow_credentials')

    @builtins.property
    def allow_headers(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Allow-Headers header."""
        return self._values.get('allow_headers')

    @builtins.property
    def allow_methods(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Allow-Methods header."""
        return self._values.get('allow_methods')

    @builtins.property
    def allow_origin_regexes(self) -> typing.Optional[typing.List[str]]:
        """Specifies the regualar expression patterns that match allowed origins.

        For
        regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript
        An origin is allowed if it matches either allow_origins or allow_origin_regex.
        """
        return self._values.get('allow_origin_regexes')

    @builtins.property
    def allow_origins(self) -> typing.Optional[typing.List[str]]:
        """Specifies the list of origins that will be allowed to do CORS requests.

        An
        origin is allowed if it matches either allow_origins or allow_origin_regex.
        """
        return self._values.get('allow_origins')

    @builtins.property
    def expose_headers(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Expose-Headers header."""
        return self._values.get('expose_headers')

    @builtins.property
    def max_age(self) -> typing.Optional[jsii.Number]:
        """Specifies how long the results of a preflight request can be cached.

        This
        translates to the content for the Access-Control-Max-Age header.
        """
        return self._values.get('max_age')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionCorsPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicy", jsii_struct_bases=[], name_mapping={'abort': 'abort', 'delay': 'delay'})
class ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicy():
    def __init__(self, *, abort: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbort"]]=None, delay: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelay"]]=None) -> None:
        """
        :param abort: abort block.
        :param delay: delay block.
        """
        self._values = {
        }
        if abort is not None: self._values["abort"] = abort
        if delay is not None: self._values["delay"] = delay

    @builtins.property
    def abort(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbort"]]:
        """abort block."""
        return self._values.get('abort')

    @builtins.property
    def delay(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelay"]]:
        """delay block."""
        return self._values.get('delay')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbort", jsii_struct_bases=[], name_mapping={'http_status': 'httpStatus', 'percentage': 'percentage'})
class ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbort():
    def __init__(self, *, http_status: jsii.Number, percentage: jsii.Number) -> None:
        """
        :param http_status: The HTTP status code used to abort the request. The value must be between 200 and 599 inclusive.
        :param percentage: The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection. The value must be between 0.0 and 100.0 inclusive.
        """
        self._values = {
            'http_status': http_status,
            'percentage': percentage,
        }

    @builtins.property
    def http_status(self) -> jsii.Number:
        """The HTTP status code used to abort the request.

        The value must be between 200
        and 599 inclusive.
        """
        return self._values.get('http_status')

    @builtins.property
    def percentage(self) -> jsii.Number:
        """The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection.

        The value must be between 0.0 and 100.0
        inclusive.
        """
        return self._values.get('percentage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbort(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelay", jsii_struct_bases=[], name_mapping={'fixed_delay': 'fixedDelay', 'percentage': 'percentage'})
class ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelay():
    def __init__(self, *, fixed_delay: typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelay"], percentage: jsii.Number) -> None:
        """
        :param fixed_delay: fixed_delay block.
        :param percentage: The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection. The value must be between 0.0 and 100.0 inclusive.
        """
        self._values = {
            'fixed_delay': fixed_delay,
            'percentage': percentage,
        }

    @builtins.property
    def fixed_delay(self) -> typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelay"]:
        """fixed_delay block."""
        return self._values.get('fixed_delay')

    @builtins.property
    def percentage(self) -> jsii.Number:
        """The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection.

        The value must be between 0.0 and
        100.0 inclusive.
        """
        return self._values.get('percentage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelay", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelay():
    def __init__(self, *, seconds: str, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> str:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicy", jsii_struct_bases=[], name_mapping={'backend_service': 'backendService'})
class ComputeUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicy():
    def __init__(self, *, backend_service: str) -> None:
        """
        :param backend_service: The BackendService resource being mirrored to.
        """
        self._values = {
            'backend_service': backend_service,
        }

    @builtins.property
    def backend_service(self) -> str:
        """The BackendService resource being mirrored to."""
        return self._values.get('backend_service')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionRetryPolicy", jsii_struct_bases=[], name_mapping={'num_retries': 'numRetries', 'per_try_timeout': 'perTryTimeout', 'retry_conditions': 'retryConditions'})
class ComputeUrlMapPathMatcherPathRuleRouteActionRetryPolicy():
    def __init__(self, *, num_retries: typing.Optional[jsii.Number]=None, per_try_timeout: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeout"]]=None, retry_conditions: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param num_retries: Specifies the allowed number retries. This number must be > 0.
        :param per_try_timeout: per_try_timeout block.
        :param retry_conditions: Specifies one or more conditions when this retry rule applies. Valid values are: - 5xx: Loadbalancer will attempt a retry if the backend service responds with any 5xx response code, or if the backend service does not respond at all, example: disconnects, reset, read timeout, connection failure, and refused streams. - gateway-error: Similar to 5xx, but only applies to response codes 502, 503 or 504. - connect-failure: Loadbalancer will retry on failures connecting to backend services, for example due to connection timeouts. - retriable-4xx: Loadbalancer will retry for retriable 4xx response codes. Currently the only retriable error supported is 409. - refused-stream: Loadbalancer will retry if the backend service resets the stream with a REFUSED_STREAM error code. This reset type indicates that it is safe to retry. - cancelled: Loadbalancer will retry if the gRPC status code in the response header is set to cancelled - deadline-exceeded: Loadbalancer will retry if the gRPC status code in the response header is set to deadline-exceeded - resource-exhausted: Loadbalancer will retry if the gRPC status code in the response header is set to resource-exhausted - unavailable: Loadbalancer will retry if the gRPC status code in the response header is set to unavailable
        """
        self._values = {
        }
        if num_retries is not None: self._values["num_retries"] = num_retries
        if per_try_timeout is not None: self._values["per_try_timeout"] = per_try_timeout
        if retry_conditions is not None: self._values["retry_conditions"] = retry_conditions

    @builtins.property
    def num_retries(self) -> typing.Optional[jsii.Number]:
        """Specifies the allowed number retries.

        This number must be > 0.
        """
        return self._values.get('num_retries')

    @builtins.property
    def per_try_timeout(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeout"]]:
        """per_try_timeout block."""
        return self._values.get('per_try_timeout')

    @builtins.property
    def retry_conditions(self) -> typing.Optional[typing.List[str]]:
        """Specifies one or more conditions when this retry rule applies.

        Valid values are:

        - 5xx: Loadbalancer will attempt a retry if the backend service responds with
          any 5xx response code, or if the backend service does not respond at all,
          example: disconnects, reset, read timeout, connection failure, and refused
          streams.
        - gateway-error: Similar to 5xx, but only applies to response codes
          502, 503 or 504.
        - connect-failure: Loadbalancer will retry on failures
          connecting to backend services, for example due to connection timeouts.
        - retriable-4xx: Loadbalancer will retry for retriable 4xx response codes.
          Currently the only retriable error supported is 409.
        - refused-stream: Loadbalancer will retry if the backend service resets the stream with a
          REFUSED_STREAM error code. This reset type indicates that it is safe to retry.
        - cancelled: Loadbalancer will retry if the gRPC status code in the response
          header is set to cancelled
        - deadline-exceeded: Loadbalancer will retry if the
          gRPC status code in the response header is set to deadline-exceeded
        - resource-exhausted: Loadbalancer will retry if the gRPC status code in the response
          header is set to resource-exhausted
        - unavailable: Loadbalancer will retry if
          the gRPC status code in the response header is set to unavailable
        """
        return self._values.get('retry_conditions')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionRetryPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeout", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeout():
    def __init__(self, *, seconds: str, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> str:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeout(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionTimeout", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeUrlMapPathMatcherPathRuleRouteActionTimeout():
    def __init__(self, *, seconds: str, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> str:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionTimeout(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionUrlRewrite", jsii_struct_bases=[], name_mapping={'host_rewrite': 'hostRewrite', 'path_prefix_rewrite': 'pathPrefixRewrite'})
class ComputeUrlMapPathMatcherPathRuleRouteActionUrlRewrite():
    def __init__(self, *, host_rewrite: typing.Optional[str]=None, path_prefix_rewrite: typing.Optional[str]=None) -> None:
        """
        :param host_rewrite: Prior to forwarding the request to the selected service, the request's host header is replaced with contents of hostRewrite. The value must be between 1 and 255 characters.
        :param path_prefix_rewrite: Prior to forwarding the request to the selected backend service, the matching portion of the request's path is replaced by pathPrefixRewrite. The value must be between 1 and 1024 characters.
        """
        self._values = {
        }
        if host_rewrite is not None: self._values["host_rewrite"] = host_rewrite
        if path_prefix_rewrite is not None: self._values["path_prefix_rewrite"] = path_prefix_rewrite

    @builtins.property
    def host_rewrite(self) -> typing.Optional[str]:
        """Prior to forwarding the request to the selected service, the request's host header is replaced with contents of hostRewrite.

        The value must be between 1 and
        255 characters.
        """
        return self._values.get('host_rewrite')

    @builtins.property
    def path_prefix_rewrite(self) -> typing.Optional[str]:
        """Prior to forwarding the request to the selected backend service, the matching portion of the request's path is replaced by pathPrefixRewrite.

        The value must
        be between 1 and 1024 characters.
        """
        return self._values.get('path_prefix_rewrite')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionUrlRewrite(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServices", jsii_struct_bases=[], name_mapping={'backend_service': 'backendService', 'weight': 'weight', 'header_action': 'headerAction'})
class ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServices():
    def __init__(self, *, backend_service: str, weight: jsii.Number, header_action: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderAction"]]=None) -> None:
        """
        :param backend_service: The default BackendService resource. Before forwarding the request to backendService, the loadbalancer applies any relevant headerActions specified as part of this backendServiceWeight.
        :param weight: Specifies the fraction of traffic sent to backendService, computed as weight / (sum of all weightedBackendService weights in routeAction) . The selection of a backend service is determined only for new traffic. Once a user's request has been directed to a backendService, subsequent requests will be sent to the same backendService as determined by the BackendService's session affinity policy. The value must be between 0 and 1000
        :param header_action: header_action block.
        """
        self._values = {
            'backend_service': backend_service,
            'weight': weight,
        }
        if header_action is not None: self._values["header_action"] = header_action

    @builtins.property
    def backend_service(self) -> str:
        """The default BackendService resource.

        Before
        forwarding the request to backendService, the loadbalancer applies any relevant
        headerActions specified as part of this backendServiceWeight.
        """
        return self._values.get('backend_service')

    @builtins.property
    def weight(self) -> jsii.Number:
        """Specifies the fraction of traffic sent to backendService, computed as weight / (sum of all weightedBackendService weights in routeAction) .

        The selection of a
        backend service is determined only for new traffic. Once a user's request has
        been directed to a backendService, subsequent requests will be sent to the same
        backendService as determined by the BackendService's session affinity policy.
        The value must be between 0 and 1000
        """
        return self._values.get('weight')

    @builtins.property
    def header_action(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderAction"]]:
        """header_action block."""
        return self._values.get('header_action')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServices(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderAction", jsii_struct_bases=[], name_mapping={'request_headers_to_add': 'requestHeadersToAdd', 'request_headers_to_remove': 'requestHeadersToRemove', 'response_headers_to_add': 'responseHeadersToAdd', 'response_headers_to_remove': 'responseHeadersToRemove'})
class ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderAction():
    def __init__(self, *, request_headers_to_add: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd"]]=None, request_headers_to_remove: typing.Optional[typing.List[str]]=None, response_headers_to_add: typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd"]]=None, response_headers_to_remove: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param request_headers_to_add: request_headers_to_add block.
        :param request_headers_to_remove: A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService.
        :param response_headers_to_add: response_headers_to_add block.
        :param response_headers_to_remove: A list of header names for headers that need to be removed from the response prior to sending the response back to the client.
        """
        self._values = {
        }
        if request_headers_to_add is not None: self._values["request_headers_to_add"] = request_headers_to_add
        if request_headers_to_remove is not None: self._values["request_headers_to_remove"] = request_headers_to_remove
        if response_headers_to_add is not None: self._values["response_headers_to_add"] = response_headers_to_add
        if response_headers_to_remove is not None: self._values["response_headers_to_remove"] = response_headers_to_remove

    @builtins.property
    def request_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd"]]:
        """request_headers_to_add block."""
        return self._values.get('request_headers_to_add')

    @builtins.property
    def request_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService."""
        return self._values.get('request_headers_to_remove')

    @builtins.property
    def response_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd"]]:
        """response_headers_to_add block."""
        return self._values.get('response_headers_to_add')

    @builtins.property
    def response_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the response prior to sending the response back to the client."""
        return self._values.get('response_headers_to_remove')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherPathRuleUrlRedirect", jsii_struct_bases=[], name_mapping={'strip_query': 'stripQuery', 'host_redirect': 'hostRedirect', 'https_redirect': 'httpsRedirect', 'path_redirect': 'pathRedirect', 'prefix_redirect': 'prefixRedirect', 'redirect_response_code': 'redirectResponseCode'})
class ComputeUrlMapPathMatcherPathRuleUrlRedirect():
    def __init__(self, *, strip_query: bool, host_redirect: typing.Optional[str]=None, https_redirect: typing.Optional[bool]=None, path_redirect: typing.Optional[str]=None, prefix_redirect: typing.Optional[str]=None, redirect_response_code: typing.Optional[str]=None) -> None:
        """
        :param strip_query: If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request. If set to false, the query portion of the original URL is retained. This field is required to ensure an empty block is not set. The normal default value is false.
        :param host_redirect: The host that will be used in the redirect response instead of the one that was supplied in the request. The value must be between 1 and 255 characters.
        :param https_redirect: If set to true, the URL scheme in the redirected request is set to https. If set to false, the URL scheme of the redirected request will remain the same as that of the request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this true for TargetHttpsProxy is not permitted. The default is set to false.
        :param path_redirect: The path that will be used in the redirect response instead of the one that was supplied in the request. pathRedirect cannot be supplied together with prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param prefix_redirect: The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request. prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or neither. If neither is supplied, the path of the original request will be used for the redirect. The value must be between 1 and 1024 characters.
        :param redirect_response_code: The HTTP Status code to use for this RedirectAction. Supported values are:. MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301. FOUND, which corresponds to 302. SEE_OTHER which corresponds to 303. TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method will be retained. PERMANENT_REDIRECT, which corresponds to 308. In this case, the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        self._values = {
            'strip_query': strip_query,
        }
        if host_redirect is not None: self._values["host_redirect"] = host_redirect
        if https_redirect is not None: self._values["https_redirect"] = https_redirect
        if path_redirect is not None: self._values["path_redirect"] = path_redirect
        if prefix_redirect is not None: self._values["prefix_redirect"] = prefix_redirect
        if redirect_response_code is not None: self._values["redirect_response_code"] = redirect_response_code

    @builtins.property
    def strip_query(self) -> bool:
        """If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request.

        If set to false, the query
        portion of the original URL is retained.
        This field is required to ensure an empty block is not set. The normal default value is false.
        """
        return self._values.get('strip_query')

    @builtins.property
    def host_redirect(self) -> typing.Optional[str]:
        """The host that will be used in the redirect response instead of the one that was supplied in the request.

        The value must be between 1 and 255
        characters.
        """
        return self._values.get('host_redirect')

    @builtins.property
    def https_redirect(self) -> typing.Optional[bool]:
        """If set to true, the URL scheme in the redirected request is set to https.

        If set to false, the URL scheme of the redirected request will remain the
        same as that of the request. This must only be set for UrlMaps used in
        TargetHttpProxys. Setting this true for TargetHttpsProxy is not
        permitted. The default is set to false.
        """
        return self._values.get('https_redirect')

    @builtins.property
    def path_redirect(self) -> typing.Optional[str]:
        """The path that will be used in the redirect response instead of the one that was supplied in the request.

        pathRedirect cannot be supplied
        together with prefixRedirect. Supply one alone or neither. If neither is
        supplied, the path of the original request will be used for the redirect.
        The value must be between 1 and 1024 characters.
        """
        return self._values.get('path_redirect')

    @builtins.property
    def prefix_redirect(self) -> typing.Optional[str]:
        """The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request.

        prefixRedirect cannot be supplied together with
        pathRedirect. Supply one alone or neither. If neither is supplied, the
        path of the original request will be used for the redirect. The value
        must be between 1 and 1024 characters.
        """
        return self._values.get('prefix_redirect')

    @builtins.property
    def redirect_response_code(self) -> typing.Optional[str]:
        """The HTTP Status code to use for this RedirectAction. Supported values are:.

        MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301.

        FOUND, which corresponds to 302.

        SEE_OTHER which corresponds to 303.

        TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method
        will be retained.

        PERMANENT_REDIRECT, which corresponds to 308. In this case,
        the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        return self._values.get('redirect_response_code')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherPathRuleUrlRedirect(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRules", jsii_struct_bases=[], name_mapping={'priority': 'priority', 'header_action': 'headerAction', 'match_rules': 'matchRules', 'route_action': 'routeAction', 'service': 'service', 'url_redirect': 'urlRedirect'})
class ComputeUrlMapPathMatcherRouteRules():
    def __init__(self, *, priority: jsii.Number, header_action: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesHeaderAction"]]=None, match_rules: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesMatchRules"]]=None, route_action: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteAction"]]=None, service: typing.Optional[str]=None, url_redirect: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesUrlRedirect"]]=None) -> None:
        """
        :param priority: For routeRules within a given pathMatcher, priority determines the order in which load balancer will interpret routeRules. RouteRules are evaluated in order of priority, from the lowest to highest number. The priority of a rule decreases as its number increases (1, 2, 3, N+1). The first rule that matches the request is applied. You cannot configure two or more routeRules with the same priority. Priority for each rule must be set to a number between 0 and 2147483647 inclusive. Priority numbers can have gaps, which enable you to add or remove rules in the future without affecting the rest of the rules. For example, 1, 2, 3, 4, 5, 9, 12, 16 is a valid series of priority numbers to which you could add rules numbered from 6 to 8, 10 to 11, and 13 to 15 in the future without any impact on existing rules.
        :param header_action: header_action block.
        :param match_rules: match_rules block.
        :param route_action: route_action block.
        :param service: The backend service resource to which traffic is directed if this rule is matched. If routeAction is additionally specified, advanced routing actions like URL Rewrites, etc. take effect prior to sending the request to the backend. However, if service is specified, routeAction cannot contain any weightedBackendService s. Conversely, if routeAction specifies any weightedBackendServices, service must not be specified. Only one of urlRedirect, service or routeAction.weightedBackendService must be set.
        :param url_redirect: url_redirect block.
        """
        self._values = {
            'priority': priority,
        }
        if header_action is not None: self._values["header_action"] = header_action
        if match_rules is not None: self._values["match_rules"] = match_rules
        if route_action is not None: self._values["route_action"] = route_action
        if service is not None: self._values["service"] = service
        if url_redirect is not None: self._values["url_redirect"] = url_redirect

    @builtins.property
    def priority(self) -> jsii.Number:
        """For routeRules within a given pathMatcher, priority determines the order in which load balancer will interpret routeRules.

        RouteRules are evaluated
        in order of priority, from the lowest to highest number. The priority of
        a rule decreases as its number increases (1, 2, 3, N+1). The first rule
        that matches the request is applied.

        You cannot configure two or more routeRules with the same priority.
        Priority for each rule must be set to a number between 0 and
        2147483647 inclusive.

        Priority numbers can have gaps, which enable you to add or remove rules
        in the future without affecting the rest of the rules. For example,
        1, 2, 3, 4, 5, 9, 12, 16 is a valid series of priority numbers to which
        you could add rules numbered from 6 to 8, 10 to 11, and 13 to 15 in the
        future without any impact on existing rules.
        """
        return self._values.get('priority')

    @builtins.property
    def header_action(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesHeaderAction"]]:
        """header_action block."""
        return self._values.get('header_action')

    @builtins.property
    def match_rules(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesMatchRules"]]:
        """match_rules block."""
        return self._values.get('match_rules')

    @builtins.property
    def route_action(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteAction"]]:
        """route_action block."""
        return self._values.get('route_action')

    @builtins.property
    def service(self) -> typing.Optional[str]:
        """The backend service resource to which traffic is directed if this rule is matched.

        If routeAction is additionally specified,
        advanced routing actions like URL Rewrites, etc. take effect prior to sending
        the request to the backend. However, if service is specified, routeAction cannot
        contain any weightedBackendService s. Conversely, if routeAction specifies any
        weightedBackendServices, service must not be specified. Only one of urlRedirect,
        service or routeAction.weightedBackendService must be set.
        """
        return self._values.get('service')

    @builtins.property
    def url_redirect(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesUrlRedirect"]]:
        """url_redirect block."""
        return self._values.get('url_redirect')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRules(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesHeaderAction", jsii_struct_bases=[], name_mapping={'request_headers_to_add': 'requestHeadersToAdd', 'request_headers_to_remove': 'requestHeadersToRemove', 'response_headers_to_add': 'responseHeadersToAdd', 'response_headers_to_remove': 'responseHeadersToRemove'})
class ComputeUrlMapPathMatcherRouteRulesHeaderAction():
    def __init__(self, *, request_headers_to_add: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesHeaderActionRequestHeadersToAdd"]]=None, request_headers_to_remove: typing.Optional[typing.List[str]]=None, response_headers_to_add: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesHeaderActionResponseHeadersToAdd"]]=None, response_headers_to_remove: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param request_headers_to_add: request_headers_to_add block.
        :param request_headers_to_remove: A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService.
        :param response_headers_to_add: response_headers_to_add block.
        :param response_headers_to_remove: A list of header names for headers that need to be removed from the response prior to sending the response back to the client.
        """
        self._values = {
        }
        if request_headers_to_add is not None: self._values["request_headers_to_add"] = request_headers_to_add
        if request_headers_to_remove is not None: self._values["request_headers_to_remove"] = request_headers_to_remove
        if response_headers_to_add is not None: self._values["response_headers_to_add"] = response_headers_to_add
        if response_headers_to_remove is not None: self._values["response_headers_to_remove"] = response_headers_to_remove

    @builtins.property
    def request_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesHeaderActionRequestHeadersToAdd"]]:
        """request_headers_to_add block."""
        return self._values.get('request_headers_to_add')

    @builtins.property
    def request_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService."""
        return self._values.get('request_headers_to_remove')

    @builtins.property
    def response_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesHeaderActionResponseHeadersToAdd"]]:
        """response_headers_to_add block."""
        return self._values.get('response_headers_to_add')

    @builtins.property
    def response_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the response prior to sending the response back to the client."""
        return self._values.get('response_headers_to_remove')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesHeaderAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesHeaderActionRequestHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapPathMatcherRouteRulesHeaderActionRequestHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesHeaderActionRequestHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesHeaderActionResponseHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapPathMatcherRouteRulesHeaderActionResponseHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesHeaderActionResponseHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesMatchRules", jsii_struct_bases=[], name_mapping={'full_path_match': 'fullPathMatch', 'header_matches': 'headerMatches', 'ignore_case': 'ignoreCase', 'metadata_filters': 'metadataFilters', 'prefix_match': 'prefixMatch', 'query_parameter_matches': 'queryParameterMatches', 'regex_match': 'regexMatch'})
class ComputeUrlMapPathMatcherRouteRulesMatchRules():
    def __init__(self, *, full_path_match: typing.Optional[str]=None, header_matches: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesMatchRulesHeaderMatches"]]=None, ignore_case: typing.Optional[bool]=None, metadata_filters: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesMatchRulesMetadataFilters"]]=None, prefix_match: typing.Optional[str]=None, query_parameter_matches: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesMatchRulesQueryParameterMatches"]]=None, regex_match: typing.Optional[str]=None) -> None:
        """
        :param full_path_match: For satifying the matchRule condition, the path of the request must exactly match the value specified in fullPathMatch after removing any query parameters and anchor that may be part of the original URL. FullPathMatch must be between 1 and 1024 characters. Only one of prefixMatch, fullPathMatch or regexMatch must be specified.
        :param header_matches: header_matches block.
        :param ignore_case: Specifies that prefixMatch and fullPathMatch matches are case sensitive. Defaults to false.
        :param metadata_filters: metadata_filters block.
        :param prefix_match: For satifying the matchRule condition, the request's path must begin with the specified prefixMatch. prefixMatch must begin with a /. The value must be between 1 and 1024 characters. Only one of prefixMatch, fullPathMatch or regexMatch must be specified.
        :param query_parameter_matches: query_parameter_matches block.
        :param regex_match: For satifying the matchRule condition, the path of the request must satisfy the regular expression specified in regexMatch after removing any query parameters and anchor supplied with the original URL. For regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript Only one of prefixMatch, fullPathMatch or regexMatch must be specified.
        """
        self._values = {
        }
        if full_path_match is not None: self._values["full_path_match"] = full_path_match
        if header_matches is not None: self._values["header_matches"] = header_matches
        if ignore_case is not None: self._values["ignore_case"] = ignore_case
        if metadata_filters is not None: self._values["metadata_filters"] = metadata_filters
        if prefix_match is not None: self._values["prefix_match"] = prefix_match
        if query_parameter_matches is not None: self._values["query_parameter_matches"] = query_parameter_matches
        if regex_match is not None: self._values["regex_match"] = regex_match

    @builtins.property
    def full_path_match(self) -> typing.Optional[str]:
        """For satifying the matchRule condition, the path of the request must exactly match the value specified in fullPathMatch after removing any query parameters and anchor that may be part of the original URL.

        FullPathMatch must be between 1
        and 1024 characters. Only one of prefixMatch, fullPathMatch or regexMatch must
        be specified.
        """
        return self._values.get('full_path_match')

    @builtins.property
    def header_matches(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesMatchRulesHeaderMatches"]]:
        """header_matches block."""
        return self._values.get('header_matches')

    @builtins.property
    def ignore_case(self) -> typing.Optional[bool]:
        """Specifies that prefixMatch and fullPathMatch matches are case sensitive.

        Defaults to false.
        """
        return self._values.get('ignore_case')

    @builtins.property
    def metadata_filters(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesMatchRulesMetadataFilters"]]:
        """metadata_filters block."""
        return self._values.get('metadata_filters')

    @builtins.property
    def prefix_match(self) -> typing.Optional[str]:
        """For satifying the matchRule condition, the request's path must begin with the specified prefixMatch.

        prefixMatch must begin with a /. The value must be
        between 1 and 1024 characters. Only one of prefixMatch, fullPathMatch or
        regexMatch must be specified.
        """
        return self._values.get('prefix_match')

    @builtins.property
    def query_parameter_matches(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesMatchRulesQueryParameterMatches"]]:
        """query_parameter_matches block."""
        return self._values.get('query_parameter_matches')

    @builtins.property
    def regex_match(self) -> typing.Optional[str]:
        """For satifying the matchRule condition, the path of the request must satisfy the regular expression specified in regexMatch after removing any query parameters and anchor supplied with the original URL.

        For regular expression grammar please
        see en.cppreference.com/w/cpp/regex/ecmascript  Only one of prefixMatch,
        fullPathMatch or regexMatch must be specified.
        """
        return self._values.get('regex_match')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesMatchRules(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesMatchRulesHeaderMatches", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'exact_match': 'exactMatch', 'invert_match': 'invertMatch', 'prefix_match': 'prefixMatch', 'present_match': 'presentMatch', 'range_match': 'rangeMatch', 'regex_match': 'regexMatch', 'suffix_match': 'suffixMatch'})
class ComputeUrlMapPathMatcherRouteRulesMatchRulesHeaderMatches():
    def __init__(self, *, header_name: str, exact_match: typing.Optional[str]=None, invert_match: typing.Optional[bool]=None, prefix_match: typing.Optional[str]=None, present_match: typing.Optional[bool]=None, range_match: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesMatchRulesHeaderMatchesRangeMatch"]]=None, regex_match: typing.Optional[str]=None, suffix_match: typing.Optional[str]=None) -> None:
        """
        :param header_name: The name of the HTTP header to match. For matching against the HTTP request's authority, use a headerMatch with the header name ":authority". For matching a request's method, use the headerName ":method".
        :param exact_match: The value should exactly match contents of exactMatch. Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        :param invert_match: If set to false, the headerMatch is considered a match if the match criteria above are met. If set to true, the headerMatch is considered a match if the match criteria above are NOT met. Defaults to false.
        :param prefix_match: The value of the header must start with the contents of prefixMatch. Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        :param present_match: A header with the contents of headerName must exist. The match takes place whether or not the request's header has a value or not. Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        :param range_match: range_match block.
        :param regex_match: The value of the header must match the regualar expression specified in regexMatch. For regular expression grammar, please see: en.cppreference.com/w/cpp/regex/ecmascript For matching against a port specified in the HTTP request, use a headerMatch with headerName set to PORT and a regular expression that satisfies the RFC2616 Host header's port specifier. Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        :param suffix_match: The value of the header must end with the contents of suffixMatch. Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        """
        self._values = {
            'header_name': header_name,
        }
        if exact_match is not None: self._values["exact_match"] = exact_match
        if invert_match is not None: self._values["invert_match"] = invert_match
        if prefix_match is not None: self._values["prefix_match"] = prefix_match
        if present_match is not None: self._values["present_match"] = present_match
        if range_match is not None: self._values["range_match"] = range_match
        if regex_match is not None: self._values["regex_match"] = regex_match
        if suffix_match is not None: self._values["suffix_match"] = suffix_match

    @builtins.property
    def header_name(self) -> str:
        """The name of the HTTP header to match.

        For matching against the HTTP request's
        authority, use a headerMatch with the header name ":authority". For matching a
        request's method, use the headerName ":method".
        """
        return self._values.get('header_name')

    @builtins.property
    def exact_match(self) -> typing.Optional[str]:
        """The value should exactly match contents of exactMatch.

        Only one of exactMatch,
        prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        """
        return self._values.get('exact_match')

    @builtins.property
    def invert_match(self) -> typing.Optional[bool]:
        """If set to false, the headerMatch is considered a match if the match criteria above are met.

        If set to true, the headerMatch is considered a match if the
        match criteria above are NOT met. Defaults to false.
        """
        return self._values.get('invert_match')

    @builtins.property
    def prefix_match(self) -> typing.Optional[str]:
        """The value of the header must start with the contents of prefixMatch.

        Only one of
        exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch
        must be set.
        """
        return self._values.get('prefix_match')

    @builtins.property
    def present_match(self) -> typing.Optional[bool]:
        """A header with the contents of headerName must exist.

        The match takes place
        whether or not the request's header has a value or not. Only one of exactMatch,
        prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.
        """
        return self._values.get('present_match')

    @builtins.property
    def range_match(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesMatchRulesHeaderMatchesRangeMatch"]]:
        """range_match block."""
        return self._values.get('range_match')

    @builtins.property
    def regex_match(self) -> typing.Optional[str]:
        """The value of the header must match the regualar expression specified in regexMatch.

        For regular expression grammar, please see:
        en.cppreference.com/w/cpp/regex/ecmascript  For matching against a port
        specified in the HTTP request, use a headerMatch with headerName set to PORT and
        a regular expression that satisfies the RFC2616 Host header's port specifier.
        Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or
        rangeMatch must be set.
        """
        return self._values.get('regex_match')

    @builtins.property
    def suffix_match(self) -> typing.Optional[str]:
        """The value of the header must end with the contents of suffixMatch.

        Only one of
        exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch
        must be set.
        """
        return self._values.get('suffix_match')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesMatchRulesHeaderMatches(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesMatchRulesHeaderMatchesRangeMatch", jsii_struct_bases=[], name_mapping={'range_end': 'rangeEnd', 'range_start': 'rangeStart'})
class ComputeUrlMapPathMatcherRouteRulesMatchRulesHeaderMatchesRangeMatch():
    def __init__(self, *, range_end: jsii.Number, range_start: jsii.Number) -> None:
        """
        :param range_end: The end of the range (exclusive).
        :param range_start: The start of the range (inclusive).
        """
        self._values = {
            'range_end': range_end,
            'range_start': range_start,
        }

    @builtins.property
    def range_end(self) -> jsii.Number:
        """The end of the range (exclusive)."""
        return self._values.get('range_end')

    @builtins.property
    def range_start(self) -> jsii.Number:
        """The start of the range (inclusive)."""
        return self._values.get('range_start')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesMatchRulesHeaderMatchesRangeMatch(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesMatchRulesMetadataFilters", jsii_struct_bases=[], name_mapping={'filter_labels': 'filterLabels', 'filter_match_criteria': 'filterMatchCriteria'})
class ComputeUrlMapPathMatcherRouteRulesMatchRulesMetadataFilters():
    def __init__(self, *, filter_labels: typing.List["ComputeUrlMapPathMatcherRouteRulesMatchRulesMetadataFiltersFilterLabels"], filter_match_criteria: str) -> None:
        """
        :param filter_labels: filter_labels block.
        :param filter_match_criteria: Specifies how individual filterLabel matches within the list of filterLabels contribute towards the overall metadataFilter match. Supported values are: - MATCH_ANY: At least one of the filterLabels must have a matching label in the provided metadata. - MATCH_ALL: All filterLabels must have matching labels in the provided metadata. Possible values: ["MATCH_ALL", "MATCH_ANY"]
        """
        self._values = {
            'filter_labels': filter_labels,
            'filter_match_criteria': filter_match_criteria,
        }

    @builtins.property
    def filter_labels(self) -> typing.List["ComputeUrlMapPathMatcherRouteRulesMatchRulesMetadataFiltersFilterLabels"]:
        """filter_labels block."""
        return self._values.get('filter_labels')

    @builtins.property
    def filter_match_criteria(self) -> str:
        """Specifies how individual filterLabel matches within the list of filterLabels contribute towards the overall metadataFilter match.

        Supported values are:

        - MATCH_ANY: At least one of the filterLabels must have a matching label in the
          provided metadata.
        - MATCH_ALL: All filterLabels must have matching labels in
          the provided metadata. Possible values: ["MATCH_ALL", "MATCH_ANY"]
        """
        return self._values.get('filter_match_criteria')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesMatchRulesMetadataFilters(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesMatchRulesMetadataFiltersFilterLabels", jsii_struct_bases=[], name_mapping={'name': 'name', 'value': 'value'})
class ComputeUrlMapPathMatcherRouteRulesMatchRulesMetadataFiltersFilterLabels():
    def __init__(self, *, name: str, value: str) -> None:
        """
        :param name: Name of metadata label. The name can have a maximum length of 1024 characters and must be at least 1 character long.
        :param value: The value of the label must match the specified value. value can have a maximum length of 1024 characters.
        """
        self._values = {
            'name': name,
            'value': value,
        }

    @builtins.property
    def name(self) -> str:
        """Name of metadata label.

        The name can have a maximum length of 1024 characters
        and must be at least 1 character long.
        """
        return self._values.get('name')

    @builtins.property
    def value(self) -> str:
        """The value of the label must match the specified value.

        value can have a maximum
        length of 1024 characters.
        """
        return self._values.get('value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesMatchRulesMetadataFiltersFilterLabels(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesMatchRulesQueryParameterMatches", jsii_struct_bases=[], name_mapping={'name': 'name', 'exact_match': 'exactMatch', 'present_match': 'presentMatch', 'regex_match': 'regexMatch'})
class ComputeUrlMapPathMatcherRouteRulesMatchRulesQueryParameterMatches():
    def __init__(self, *, name: str, exact_match: typing.Optional[str]=None, present_match: typing.Optional[bool]=None, regex_match: typing.Optional[str]=None) -> None:
        """
        :param name: The name of the query parameter to match. The query parameter must exist in the request, in the absence of which the request match fails.
        :param exact_match: The queryParameterMatch matches if the value of the parameter exactly matches the contents of exactMatch. Only one of presentMatch, exactMatch and regexMatch must be set.
        :param present_match: Specifies that the queryParameterMatch matches if the request contains the query parameter, irrespective of whether the parameter has a value or not. Only one of presentMatch, exactMatch and regexMatch must be set.
        :param regex_match: The queryParameterMatch matches if the value of the parameter matches the regular expression specified by regexMatch. For the regular expression grammar, please see en.cppreference.com/w/cpp/regex/ecmascript Only one of presentMatch, exactMatch and regexMatch must be set.
        """
        self._values = {
            'name': name,
        }
        if exact_match is not None: self._values["exact_match"] = exact_match
        if present_match is not None: self._values["present_match"] = present_match
        if regex_match is not None: self._values["regex_match"] = regex_match

    @builtins.property
    def name(self) -> str:
        """The name of the query parameter to match.

        The query parameter must exist in the
        request, in the absence of which the request match fails.
        """
        return self._values.get('name')

    @builtins.property
    def exact_match(self) -> typing.Optional[str]:
        """The queryParameterMatch matches if the value of the parameter exactly matches the contents of exactMatch.

        Only one of presentMatch, exactMatch and regexMatch
        must be set.
        """
        return self._values.get('exact_match')

    @builtins.property
    def present_match(self) -> typing.Optional[bool]:
        """Specifies that the queryParameterMatch matches if the request contains the query parameter, irrespective of whether the parameter has a value or not.

        Only one of
        presentMatch, exactMatch and regexMatch must be set.
        """
        return self._values.get('present_match')

    @builtins.property
    def regex_match(self) -> typing.Optional[str]:
        """The queryParameterMatch matches if the value of the parameter matches the regular expression specified by regexMatch.

        For the regular expression grammar,
        please see en.cppreference.com/w/cpp/regex/ecmascript  Only one of presentMatch,
        exactMatch and regexMatch must be set.
        """
        return self._values.get('regex_match')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesMatchRulesQueryParameterMatches(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteAction", jsii_struct_bases=[], name_mapping={'cors_policy': 'corsPolicy', 'fault_injection_policy': 'faultInjectionPolicy', 'request_mirror_policy': 'requestMirrorPolicy', 'retry_policy': 'retryPolicy', 'timeout': 'timeout', 'url_rewrite': 'urlRewrite', 'weighted_backend_services': 'weightedBackendServices'})
class ComputeUrlMapPathMatcherRouteRulesRouteAction():
    def __init__(self, *, cors_policy: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionCorsPolicy"]]=None, fault_injection_policy: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicy"]]=None, request_mirror_policy: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionRequestMirrorPolicy"]]=None, retry_policy: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionRetryPolicy"]]=None, timeout: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionTimeout"]]=None, url_rewrite: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionUrlRewrite"]]=None, weighted_backend_services: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServices"]]=None) -> None:
        """
        :param cors_policy: cors_policy block.
        :param fault_injection_policy: fault_injection_policy block.
        :param request_mirror_policy: request_mirror_policy block.
        :param retry_policy: retry_policy block.
        :param timeout: timeout block.
        :param url_rewrite: url_rewrite block.
        :param weighted_backend_services: weighted_backend_services block.
        """
        self._values = {
        }
        if cors_policy is not None: self._values["cors_policy"] = cors_policy
        if fault_injection_policy is not None: self._values["fault_injection_policy"] = fault_injection_policy
        if request_mirror_policy is not None: self._values["request_mirror_policy"] = request_mirror_policy
        if retry_policy is not None: self._values["retry_policy"] = retry_policy
        if timeout is not None: self._values["timeout"] = timeout
        if url_rewrite is not None: self._values["url_rewrite"] = url_rewrite
        if weighted_backend_services is not None: self._values["weighted_backend_services"] = weighted_backend_services

    @builtins.property
    def cors_policy(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionCorsPolicy"]]:
        """cors_policy block."""
        return self._values.get('cors_policy')

    @builtins.property
    def fault_injection_policy(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicy"]]:
        """fault_injection_policy block."""
        return self._values.get('fault_injection_policy')

    @builtins.property
    def request_mirror_policy(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionRequestMirrorPolicy"]]:
        """request_mirror_policy block."""
        return self._values.get('request_mirror_policy')

    @builtins.property
    def retry_policy(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionRetryPolicy"]]:
        """retry_policy block."""
        return self._values.get('retry_policy')

    @builtins.property
    def timeout(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionTimeout"]]:
        """timeout block."""
        return self._values.get('timeout')

    @builtins.property
    def url_rewrite(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionUrlRewrite"]]:
        """url_rewrite block."""
        return self._values.get('url_rewrite')

    @builtins.property
    def weighted_backend_services(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServices"]]:
        """weighted_backend_services block."""
        return self._values.get('weighted_backend_services')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionCorsPolicy", jsii_struct_bases=[], name_mapping={'allow_credentials': 'allowCredentials', 'allow_headers': 'allowHeaders', 'allow_methods': 'allowMethods', 'allow_origin_regexes': 'allowOriginRegexes', 'allow_origins': 'allowOrigins', 'disabled': 'disabled', 'expose_headers': 'exposeHeaders', 'max_age': 'maxAge'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionCorsPolicy():
    def __init__(self, *, allow_credentials: typing.Optional[bool]=None, allow_headers: typing.Optional[typing.List[str]]=None, allow_methods: typing.Optional[typing.List[str]]=None, allow_origin_regexes: typing.Optional[typing.List[str]]=None, allow_origins: typing.Optional[typing.List[str]]=None, disabled: typing.Optional[bool]=None, expose_headers: typing.Optional[typing.List[str]]=None, max_age: typing.Optional[jsii.Number]=None) -> None:
        """
        :param allow_credentials: In response to a preflight request, setting this to true indicates that the actual request can include user credentials. This translates to the Access- Control-Allow-Credentials header. Defaults to false.
        :param allow_headers: Specifies the content for the Access-Control-Allow-Headers header.
        :param allow_methods: Specifies the content for the Access-Control-Allow-Methods header.
        :param allow_origin_regexes: Specifies the regualar expression patterns that match allowed origins. For regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript An origin is allowed if it matches either allow_origins or allow_origin_regex.
        :param allow_origins: Specifies the list of origins that will be allowed to do CORS requests. An origin is allowed if it matches either allow_origins or allow_origin_regex.
        :param disabled: If true, specifies the CORS policy is disabled. which indicates that the CORS policy is in effect. Defaults to false.
        :param expose_headers: Specifies the content for the Access-Control-Expose-Headers header.
        :param max_age: Specifies how long the results of a preflight request can be cached. This translates to the content for the Access-Control-Max-Age header.
        """
        self._values = {
        }
        if allow_credentials is not None: self._values["allow_credentials"] = allow_credentials
        if allow_headers is not None: self._values["allow_headers"] = allow_headers
        if allow_methods is not None: self._values["allow_methods"] = allow_methods
        if allow_origin_regexes is not None: self._values["allow_origin_regexes"] = allow_origin_regexes
        if allow_origins is not None: self._values["allow_origins"] = allow_origins
        if disabled is not None: self._values["disabled"] = disabled
        if expose_headers is not None: self._values["expose_headers"] = expose_headers
        if max_age is not None: self._values["max_age"] = max_age

    @builtins.property
    def allow_credentials(self) -> typing.Optional[bool]:
        """In response to a preflight request, setting this to true indicates that the actual request can include user credentials.

        This translates to the Access-
        Control-Allow-Credentials header. Defaults to false.
        """
        return self._values.get('allow_credentials')

    @builtins.property
    def allow_headers(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Allow-Headers header."""
        return self._values.get('allow_headers')

    @builtins.property
    def allow_methods(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Allow-Methods header."""
        return self._values.get('allow_methods')

    @builtins.property
    def allow_origin_regexes(self) -> typing.Optional[typing.List[str]]:
        """Specifies the regualar expression patterns that match allowed origins.

        For
        regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript
        An origin is allowed if it matches either allow_origins or allow_origin_regex.
        """
        return self._values.get('allow_origin_regexes')

    @builtins.property
    def allow_origins(self) -> typing.Optional[typing.List[str]]:
        """Specifies the list of origins that will be allowed to do CORS requests.

        An
        origin is allowed if it matches either allow_origins or allow_origin_regex.
        """
        return self._values.get('allow_origins')

    @builtins.property
    def disabled(self) -> typing.Optional[bool]:
        """If true, specifies the CORS policy is disabled.

        which indicates that the CORS policy is in effect. Defaults to false.
        """
        return self._values.get('disabled')

    @builtins.property
    def expose_headers(self) -> typing.Optional[typing.List[str]]:
        """Specifies the content for the Access-Control-Expose-Headers header."""
        return self._values.get('expose_headers')

    @builtins.property
    def max_age(self) -> typing.Optional[jsii.Number]:
        """Specifies how long the results of a preflight request can be cached.

        This
        translates to the content for the Access-Control-Max-Age header.
        """
        return self._values.get('max_age')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionCorsPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicy", jsii_struct_bases=[], name_mapping={'abort': 'abort', 'delay': 'delay'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicy():
    def __init__(self, *, abort: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyAbort"]]=None, delay: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelay"]]=None) -> None:
        """
        :param abort: abort block.
        :param delay: delay block.
        """
        self._values = {
        }
        if abort is not None: self._values["abort"] = abort
        if delay is not None: self._values["delay"] = delay

    @builtins.property
    def abort(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyAbort"]]:
        """abort block."""
        return self._values.get('abort')

    @builtins.property
    def delay(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelay"]]:
        """delay block."""
        return self._values.get('delay')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyAbort", jsii_struct_bases=[], name_mapping={'http_status': 'httpStatus', 'percentage': 'percentage'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyAbort():
    def __init__(self, *, http_status: typing.Optional[jsii.Number]=None, percentage: typing.Optional[jsii.Number]=None) -> None:
        """
        :param http_status: The HTTP status code used to abort the request. The value must be between 200 and 599 inclusive.
        :param percentage: The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection. The value must be between 0.0 and 100.0 inclusive.
        """
        self._values = {
        }
        if http_status is not None: self._values["http_status"] = http_status
        if percentage is not None: self._values["percentage"] = percentage

    @builtins.property
    def http_status(self) -> typing.Optional[jsii.Number]:
        """The HTTP status code used to abort the request.

        The value must be between 200
        and 599 inclusive.
        """
        return self._values.get('http_status')

    @builtins.property
    def percentage(self) -> typing.Optional[jsii.Number]:
        """The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection.

        The value must be between 0.0 and 100.0
        inclusive.
        """
        return self._values.get('percentage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyAbort(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelay", jsii_struct_bases=[], name_mapping={'fixed_delay': 'fixedDelay', 'percentage': 'percentage'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelay():
    def __init__(self, *, fixed_delay: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelayFixedDelay"]]=None, percentage: typing.Optional[jsii.Number]=None) -> None:
        """
        :param fixed_delay: fixed_delay block.
        :param percentage: The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection. The value must be between 0.0 and 100.0 inclusive.
        """
        self._values = {
        }
        if fixed_delay is not None: self._values["fixed_delay"] = fixed_delay
        if percentage is not None: self._values["percentage"] = percentage

    @builtins.property
    def fixed_delay(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelayFixedDelay"]]:
        """fixed_delay block."""
        return self._values.get('fixed_delay')

    @builtins.property
    def percentage(self) -> typing.Optional[jsii.Number]:
        """The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection.

        The value must be between 0.0 and
        100.0 inclusive.
        """
        return self._values.get('percentage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelayFixedDelay", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelayFixedDelay():
    def __init__(self, *, seconds: str, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> str:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelayFixedDelay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionRequestMirrorPolicy", jsii_struct_bases=[], name_mapping={'backend_service': 'backendService'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionRequestMirrorPolicy():
    def __init__(self, *, backend_service: str) -> None:
        """
        :param backend_service: The BackendService resource being mirrored to.
        """
        self._values = {
            'backend_service': backend_service,
        }

    @builtins.property
    def backend_service(self) -> str:
        """The BackendService resource being mirrored to."""
        return self._values.get('backend_service')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionRequestMirrorPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionRetryPolicy", jsii_struct_bases=[], name_mapping={'num_retries': 'numRetries', 'per_try_timeout': 'perTryTimeout', 'retry_conditions': 'retryConditions'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionRetryPolicy():
    def __init__(self, *, num_retries: jsii.Number, per_try_timeout: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionRetryPolicyPerTryTimeout"]]=None, retry_conditions: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param num_retries: Specifies the allowed number retries. This number must be > 0.
        :param per_try_timeout: per_try_timeout block.
        :param retry_conditions: Specfies one or more conditions when this retry rule applies. Valid values are: - 5xx: Loadbalancer will attempt a retry if the backend service responds with any 5xx response code, or if the backend service does not respond at all, example: disconnects, reset, read timeout, connection failure, and refused streams. - gateway-error: Similar to 5xx, but only applies to response codes 502, 503 or 504. - connect-failure: Loadbalancer will retry on failures connecting to backend services, for example due to connection timeouts. - retriable-4xx: Loadbalancer will retry for retriable 4xx response codes. Currently the only retriable error supported is 409. - refused-stream: Loadbalancer will retry if the backend service resets the stream with a REFUSED_STREAM error code. This reset type indicates that it is safe to retry. - cancelled: Loadbalancer will retry if the gRPC status code in the response header is set to cancelled - deadline-exceeded: Loadbalancer will retry if the gRPC status code in the response header is set to deadline-exceeded - resource-exhausted: Loadbalancer will retry if the gRPC status code in the response header is set to resource-exhausted - unavailable: Loadbalancer will retry if the gRPC status code in the response header is set to unavailable
        """
        self._values = {
            'num_retries': num_retries,
        }
        if per_try_timeout is not None: self._values["per_try_timeout"] = per_try_timeout
        if retry_conditions is not None: self._values["retry_conditions"] = retry_conditions

    @builtins.property
    def num_retries(self) -> jsii.Number:
        """Specifies the allowed number retries.

        This number must be > 0.
        """
        return self._values.get('num_retries')

    @builtins.property
    def per_try_timeout(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionRetryPolicyPerTryTimeout"]]:
        """per_try_timeout block."""
        return self._values.get('per_try_timeout')

    @builtins.property
    def retry_conditions(self) -> typing.Optional[typing.List[str]]:
        """Specfies one or more conditions when this retry rule applies.

        Valid values are:

        - 5xx: Loadbalancer will attempt a retry if the backend service responds with
          any 5xx response code, or if the backend service does not respond at all,
          example: disconnects, reset, read timeout, connection failure, and refused
          streams.
        - gateway-error: Similar to 5xx, but only applies to response codes
          502, 503 or 504.
        - connect-failure: Loadbalancer will retry on failures
          connecting to backend services, for example due to connection timeouts.
        - retriable-4xx: Loadbalancer will retry for retriable 4xx response codes.
          Currently the only retriable error supported is 409.
        - refused-stream: Loadbalancer will retry if the backend service resets the stream with a
          REFUSED_STREAM error code. This reset type indicates that it is safe to retry.
        - cancelled: Loadbalancer will retry if the gRPC status code in the response
          header is set to cancelled
        - deadline-exceeded: Loadbalancer will retry if the
          gRPC status code in the response header is set to deadline-exceeded
        - resource-exhausted: Loadbalancer will retry if the gRPC status code in the response
          header is set to resource-exhausted
        - unavailable: Loadbalancer will retry if the gRPC status code in
          the response header is set to unavailable
        """
        return self._values.get('retry_conditions')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionRetryPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionRetryPolicyPerTryTimeout", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionRetryPolicyPerTryTimeout():
    def __init__(self, *, seconds: str, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> str:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionRetryPolicyPerTryTimeout(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionTimeout", jsii_struct_bases=[], name_mapping={'seconds': 'seconds', 'nanos': 'nanos'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionTimeout():
    def __init__(self, *, seconds: str, nanos: typing.Optional[jsii.Number]=None) -> None:
        """
        :param seconds: Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
        :param nanos: Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented with a 0 'seconds' field and a positive 'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        self._values = {
            'seconds': seconds,
        }
        if nanos is not None: self._values["nanos"] = nanos

    @builtins.property
    def seconds(self) -> str:
        """Span of time at a resolution of a second.

        Must be from 0 to 315,576,000,000
        inclusive.
        """
        return self._values.get('seconds')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Span of time that's a fraction of a second at nanosecond resolution.

        Durations
        less than one second are represented with a 0 'seconds' field and a positive
        'nanos' field. Must be from 0 to 999,999,999 inclusive.
        """
        return self._values.get('nanos')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionTimeout(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionUrlRewrite", jsii_struct_bases=[], name_mapping={'host_rewrite': 'hostRewrite', 'path_prefix_rewrite': 'pathPrefixRewrite'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionUrlRewrite():
    def __init__(self, *, host_rewrite: typing.Optional[str]=None, path_prefix_rewrite: typing.Optional[str]=None) -> None:
        """
        :param host_rewrite: Prior to forwarding the request to the selected service, the request's host header is replaced with contents of hostRewrite. The value must be between 1 and 255 characters.
        :param path_prefix_rewrite: Prior to forwarding the request to the selected backend service, the matching portion of the request's path is replaced by pathPrefixRewrite. The value must be between 1 and 1024 characters.
        """
        self._values = {
        }
        if host_rewrite is not None: self._values["host_rewrite"] = host_rewrite
        if path_prefix_rewrite is not None: self._values["path_prefix_rewrite"] = path_prefix_rewrite

    @builtins.property
    def host_rewrite(self) -> typing.Optional[str]:
        """Prior to forwarding the request to the selected service, the request's host header is replaced with contents of hostRewrite.

        The value must be between 1 and
        255 characters.
        """
        return self._values.get('host_rewrite')

    @builtins.property
    def path_prefix_rewrite(self) -> typing.Optional[str]:
        """Prior to forwarding the request to the selected backend service, the matching portion of the request's path is replaced by pathPrefixRewrite.

        The value must
        be between 1 and 1024 characters.
        """
        return self._values.get('path_prefix_rewrite')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionUrlRewrite(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServices", jsii_struct_bases=[], name_mapping={'backend_service': 'backendService', 'weight': 'weight', 'header_action': 'headerAction'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServices():
    def __init__(self, *, backend_service: str, weight: jsii.Number, header_action: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderAction"]]=None) -> None:
        """
        :param backend_service: The default BackendService resource. Before forwarding the request to backendService, the loadbalancer applies any relevant headerActions specified as part of this backendServiceWeight.
        :param weight: Specifies the fraction of traffic sent to backendService, computed as weight / (sum of all weightedBackendService weights in routeAction) . The selection of a backend service is determined only for new traffic. Once a user's request has been directed to a backendService, subsequent requests will be sent to the same backendService as determined by the BackendService's session affinity policy. The value must be between 0 and 1000
        :param header_action: header_action block.
        """
        self._values = {
            'backend_service': backend_service,
            'weight': weight,
        }
        if header_action is not None: self._values["header_action"] = header_action

    @builtins.property
    def backend_service(self) -> str:
        """The default BackendService resource.

        Before
        forwarding the request to backendService, the loadbalancer applies any relevant
        headerActions specified as part of this backendServiceWeight.
        """
        return self._values.get('backend_service')

    @builtins.property
    def weight(self) -> jsii.Number:
        """Specifies the fraction of traffic sent to backendService, computed as weight / (sum of all weightedBackendService weights in routeAction) .

        The selection of a
        backend service is determined only for new traffic. Once a user's request has
        been directed to a backendService, subsequent requests will be sent to the same
        backendService as determined by the BackendService's session affinity policy.
        The value must be between 0 and 1000
        """
        return self._values.get('weight')

    @builtins.property
    def header_action(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderAction"]]:
        """header_action block."""
        return self._values.get('header_action')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServices(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderAction", jsii_struct_bases=[], name_mapping={'request_headers_to_add': 'requestHeadersToAdd', 'request_headers_to_remove': 'requestHeadersToRemove', 'response_headers_to_add': 'responseHeadersToAdd', 'response_headers_to_remove': 'responseHeadersToRemove'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderAction():
    def __init__(self, *, request_headers_to_add: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd"]]=None, request_headers_to_remove: typing.Optional[typing.List[str]]=None, response_headers_to_add: typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd"]]=None, response_headers_to_remove: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param request_headers_to_add: request_headers_to_add block.
        :param request_headers_to_remove: A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService.
        :param response_headers_to_add: response_headers_to_add block.
        :param response_headers_to_remove: A list of header names for headers that need to be removed from the response prior to sending the response back to the client.
        """
        self._values = {
        }
        if request_headers_to_add is not None: self._values["request_headers_to_add"] = request_headers_to_add
        if request_headers_to_remove is not None: self._values["request_headers_to_remove"] = request_headers_to_remove
        if response_headers_to_add is not None: self._values["response_headers_to_add"] = response_headers_to_add
        if response_headers_to_remove is not None: self._values["response_headers_to_remove"] = response_headers_to_remove

    @builtins.property
    def request_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd"]]:
        """request_headers_to_add block."""
        return self._values.get('request_headers_to_add')

    @builtins.property
    def request_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the request prior to forwarding the request to the backendService."""
        return self._values.get('request_headers_to_remove')

    @builtins.property
    def response_headers_to_add(self) -> typing.Optional[typing.List["ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd"]]:
        """response_headers_to_add block."""
        return self._values.get('response_headers_to_add')

    @builtins.property
    def response_headers_to_remove(self) -> typing.Optional[typing.List[str]]:
        """A list of header names for headers that need to be removed from the response prior to sending the response back to the client."""
        return self._values.get('response_headers_to_remove')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd", jsii_struct_bases=[], name_mapping={'header_name': 'headerName', 'header_value': 'headerValue', 'replace': 'replace'})
class ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd():
    def __init__(self, *, header_name: str, header_value: str, replace: bool) -> None:
        """
        :param header_name: The name of the header.
        :param header_value: The value of the header to add.
        :param replace: If false, headerValue is appended to any values that already exist for the header. If true, headerValue is set for the header, discarding any values that were set for that header.
        """
        self._values = {
            'header_name': header_name,
            'header_value': header_value,
            'replace': replace,
        }

    @builtins.property
    def header_name(self) -> str:
        """The name of the header."""
        return self._values.get('header_name')

    @builtins.property
    def header_value(self) -> str:
        """The value of the header to add."""
        return self._values.get('header_value')

    @builtins.property
    def replace(self) -> bool:
        """If false, headerValue is appended to any values that already exist for the header.

        If true, headerValue is set for the header, discarding any values that
        were set for that header.
        """
        return self._values.get('replace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapPathMatcherRouteRulesUrlRedirect", jsii_struct_bases=[], name_mapping={'host_redirect': 'hostRedirect', 'https_redirect': 'httpsRedirect', 'path_redirect': 'pathRedirect', 'prefix_redirect': 'prefixRedirect', 'redirect_response_code': 'redirectResponseCode', 'strip_query': 'stripQuery'})
class ComputeUrlMapPathMatcherRouteRulesUrlRedirect():
    def __init__(self, *, host_redirect: typing.Optional[str]=None, https_redirect: typing.Optional[bool]=None, path_redirect: typing.Optional[str]=None, prefix_redirect: typing.Optional[str]=None, redirect_response_code: typing.Optional[str]=None, strip_query: typing.Optional[bool]=None) -> None:
        """
        :param host_redirect: The host that will be used in the redirect response instead of the one that was supplied in the request. The value must be between 1 and 255 characters.
        :param https_redirect: If set to true, the URL scheme in the redirected request is set to https. If set to false, the URL scheme of the redirected request will remain the same as that of the request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this true for TargetHttpsProxy is not permitted. Defaults to false.
        :param path_redirect: The path that will be used in the redirect response instead of the one that was supplied in the request. Only one of pathRedirect or prefixRedirect must be specified. The value must be between 1 and 1024 characters.
        :param prefix_redirect: The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request.
        :param redirect_response_code: The HTTP Status code to use for this RedirectAction. Supported values are:. MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301. FOUND, which corresponds to 302. SEE_OTHER which corresponds to 303. TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method will be retained. PERMANENT_REDIRECT, which corresponds to 308. In this case, the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        :param strip_query: If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request. If set to false, the query portion of the original URL is retained. Defaults to false.
        """
        self._values = {
        }
        if host_redirect is not None: self._values["host_redirect"] = host_redirect
        if https_redirect is not None: self._values["https_redirect"] = https_redirect
        if path_redirect is not None: self._values["path_redirect"] = path_redirect
        if prefix_redirect is not None: self._values["prefix_redirect"] = prefix_redirect
        if redirect_response_code is not None: self._values["redirect_response_code"] = redirect_response_code
        if strip_query is not None: self._values["strip_query"] = strip_query

    @builtins.property
    def host_redirect(self) -> typing.Optional[str]:
        """The host that will be used in the redirect response instead of the one that was supplied in the request.

        The value must be between 1 and 255 characters.
        """
        return self._values.get('host_redirect')

    @builtins.property
    def https_redirect(self) -> typing.Optional[bool]:
        """If set to true, the URL scheme in the redirected request is set to https.

        If set
        to false, the URL scheme of the redirected request will remain the same as that
        of the request. This must only be set for UrlMaps used in TargetHttpProxys.
        Setting this true for TargetHttpsProxy is not permitted. Defaults to false.
        """
        return self._values.get('https_redirect')

    @builtins.property
    def path_redirect(self) -> typing.Optional[str]:
        """The path that will be used in the redirect response instead of the one that was supplied in the request.

        Only one of pathRedirect or prefixRedirect must be
        specified. The value must be between 1 and 1024 characters.
        """
        return self._values.get('path_redirect')

    @builtins.property
    def prefix_redirect(self) -> typing.Optional[str]:
        """The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, retaining the remaining portion of the URL before redirecting the request."""
        return self._values.get('prefix_redirect')

    @builtins.property
    def redirect_response_code(self) -> typing.Optional[str]:
        """The HTTP Status code to use for this RedirectAction. Supported values are:.

        MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301.

        FOUND, which corresponds to 302.

        SEE_OTHER which corresponds to 303.

        TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method will be retained.

        PERMANENT_REDIRECT, which corresponds to 308. In this case, the request method will be retained. Possible values: ["FOUND", "MOVED_PERMANENTLY_DEFAULT", "PERMANENT_REDIRECT", "SEE_OTHER", "TEMPORARY_REDIRECT"]
        """
        return self._values.get('redirect_response_code')

    @builtins.property
    def strip_query(self) -> typing.Optional[bool]:
        """If set to true, any accompanying query portion of the original URL is removed prior to redirecting the request.

        If set to false, the query portion of the
        original URL is retained. Defaults to false.
        """
        return self._values.get('strip_query')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapPathMatcherRouteRulesUrlRedirect(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapTest", jsii_struct_bases=[], name_mapping={'host': 'host', 'path': 'path', 'service': 'service', 'description': 'description'})
class ComputeUrlMapTest():
    def __init__(self, *, host: str, path: str, service: str, description: typing.Optional[str]=None) -> None:
        """
        :param host: Host portion of the URL.
        :param path: Path portion of the URL.
        :param service: The backend service or backend bucket link that should be matched by this test.
        :param description: Description of this test case.
        """
        self._values = {
            'host': host,
            'path': path,
            'service': service,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def host(self) -> str:
        """Host portion of the URL."""
        return self._values.get('host')

    @builtins.property
    def path(self) -> str:
        """Path portion of the URL."""
        return self._values.get('path')

    @builtins.property
    def service(self) -> str:
        """The backend service or backend bucket link that should be matched by this test."""
        return self._values.get('service')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Description of this test case."""
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapTest(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeUrlMapTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ComputeUrlMapTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeUrlMapTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeVpnGateway(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeVpnGateway"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, network: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeVpnGatewayTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: The network this VPN gateway is accepting traffic for.
        :param description: An optional description of this resource.
        :param project: 
        :param region: The region this gateway should sit in.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeVpnGatewayConfig(name=name, network=network, description=description, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeVpnGateway, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="gatewayId")
    def gateway_id(self) -> jsii.Number:
        return jsii.get(self, "gatewayId")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: str) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeVpnGatewayTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeVpnGatewayTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeVpnGatewayConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'network': 'network', 'description': 'description', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class ComputeVpnGatewayConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, network: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ComputeVpnGatewayTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: The network this VPN gateway is accepting traffic for.
        :param description: An optional description of this resource.
        :param project: 
        :param region: The region this gateway should sit in.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeVpnGatewayTimeouts(**timeouts)
        self._values = {
            'name': name,
            'network': network,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035.  Specifically, the name must be 1-63 characters long and
        match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means
        the first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def network(self) -> str:
        """The network this VPN gateway is accepting traffic for."""
        return self._values.get('network')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The region this gateway should sit in."""
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeVpnGatewayTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeVpnGatewayConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeVpnGatewayTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeVpnGatewayTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeVpnGatewayTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ComputeVpnTunnel(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ComputeVpnTunnel"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, shared_secret: str, description: typing.Optional[str]=None, ike_version: typing.Optional[jsii.Number]=None, local_traffic_selector: typing.Optional[typing.List[str]]=None, peer_ip: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, remote_traffic_selector: typing.Optional[typing.List[str]]=None, router: typing.Optional[str]=None, target_vpn_gateway: typing.Optional[str]=None, timeouts: typing.Optional["ComputeVpnTunnelTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param shared_secret: Shared secret used to set the secure session between the Cloud VPN gateway and the peer VPN gateway.
        :param description: An optional description of this resource.
        :param ike_version: IKE protocol version to use when establishing the VPN tunnel with peer VPN gateway. Acceptable IKE versions are 1 or 2. Default version is 2.
        :param local_traffic_selector: Local traffic selector to use when establishing the VPN tunnel with peer VPN gateway. The value should be a CIDR formatted string, for example '192.168.0.0/16'. The ranges should be disjoint. Only IPv4 is supported.
        :param peer_ip: IP address of the peer VPN gateway. Only IPv4 is supported.
        :param project: 
        :param region: The region where the tunnel is located. If unset, is set to the region of 'target_vpn_gateway'.
        :param remote_traffic_selector: Remote traffic selector to use when establishing the VPN tunnel with peer VPN gateway. The value should be a CIDR formatted string, for example '192.168.0.0/16'. The ranges should be disjoint. Only IPv4 is supported.
        :param router: URL of router resource to be used for dynamic routing.
        :param target_vpn_gateway: URL of the Target VPN gateway with which this VPN tunnel is associated.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ComputeVpnTunnelConfig(name=name, shared_secret=shared_secret, description=description, ike_version=ike_version, local_traffic_selector=local_traffic_selector, peer_ip=peer_ip, project=project, region=region, remote_traffic_selector=remote_traffic_selector, router=router, target_vpn_gateway=target_vpn_gateway, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ComputeVpnTunnel, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="detailedStatus")
    def detailed_status(self) -> str:
        return jsii.get(self, "detailedStatus")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="sharedSecretHash")
    def shared_secret_hash(self) -> str:
        return jsii.get(self, "sharedSecretHash")

    @builtins.property
    @jsii.member(jsii_name="tunnelId")
    def tunnel_id(self) -> str:
        return jsii.get(self, "tunnelId")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="sharedSecret")
    def shared_secret(self) -> str:
        return jsii.get(self, "sharedSecret")

    @shared_secret.setter
    def shared_secret(self, value: str) -> None:
        jsii.set(self, "sharedSecret", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="ikeVersion")
    def ike_version(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "ikeVersion")

    @ike_version.setter
    def ike_version(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "ikeVersion", value)

    @builtins.property
    @jsii.member(jsii_name="localTrafficSelector")
    def local_traffic_selector(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "localTrafficSelector")

    @local_traffic_selector.setter
    def local_traffic_selector(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "localTrafficSelector", value)

    @builtins.property
    @jsii.member(jsii_name="peerIp")
    def peer_ip(self) -> typing.Optional[str]:
        return jsii.get(self, "peerIp")

    @peer_ip.setter
    def peer_ip(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "peerIp", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="remoteTrafficSelector")
    def remote_traffic_selector(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "remoteTrafficSelector")

    @remote_traffic_selector.setter
    def remote_traffic_selector(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "remoteTrafficSelector", value)

    @builtins.property
    @jsii.member(jsii_name="router")
    def router(self) -> typing.Optional[str]:
        return jsii.get(self, "router")

    @router.setter
    def router(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "router", value)

    @builtins.property
    @jsii.member(jsii_name="targetVpnGateway")
    def target_vpn_gateway(self) -> typing.Optional[str]:
        return jsii.get(self, "targetVpnGateway")

    @target_vpn_gateway.setter
    def target_vpn_gateway(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "targetVpnGateway", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ComputeVpnTunnelTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ComputeVpnTunnelTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeVpnTunnelConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'shared_secret': 'sharedSecret', 'description': 'description', 'ike_version': 'ikeVersion', 'local_traffic_selector': 'localTrafficSelector', 'peer_ip': 'peerIp', 'project': 'project', 'region': 'region', 'remote_traffic_selector': 'remoteTrafficSelector', 'router': 'router', 'target_vpn_gateway': 'targetVpnGateway', 'timeouts': 'timeouts'})
class ComputeVpnTunnelConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, shared_secret: str, description: typing.Optional[str]=None, ike_version: typing.Optional[jsii.Number]=None, local_traffic_selector: typing.Optional[typing.List[str]]=None, peer_ip: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, remote_traffic_selector: typing.Optional[typing.List[str]]=None, router: typing.Optional[str]=None, target_vpn_gateway: typing.Optional[str]=None, timeouts: typing.Optional["ComputeVpnTunnelTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param shared_secret: Shared secret used to set the secure session between the Cloud VPN gateway and the peer VPN gateway.
        :param description: An optional description of this resource.
        :param ike_version: IKE protocol version to use when establishing the VPN tunnel with peer VPN gateway. Acceptable IKE versions are 1 or 2. Default version is 2.
        :param local_traffic_selector: Local traffic selector to use when establishing the VPN tunnel with peer VPN gateway. The value should be a CIDR formatted string, for example '192.168.0.0/16'. The ranges should be disjoint. Only IPv4 is supported.
        :param peer_ip: IP address of the peer VPN gateway. Only IPv4 is supported.
        :param project: 
        :param region: The region where the tunnel is located. If unset, is set to the region of 'target_vpn_gateway'.
        :param remote_traffic_selector: Remote traffic selector to use when establishing the VPN tunnel with peer VPN gateway. The value should be a CIDR formatted string, for example '192.168.0.0/16'. The ranges should be disjoint. Only IPv4 is supported.
        :param router: URL of router resource to be used for dynamic routing.
        :param target_vpn_gateway: URL of the Target VPN gateway with which this VPN tunnel is associated.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ComputeVpnTunnelTimeouts(**timeouts)
        self._values = {
            'name': name,
            'shared_secret': shared_secret,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if ike_version is not None: self._values["ike_version"] = ike_version
        if local_traffic_selector is not None: self._values["local_traffic_selector"] = local_traffic_selector
        if peer_ip is not None: self._values["peer_ip"] = peer_ip
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if remote_traffic_selector is not None: self._values["remote_traffic_selector"] = remote_traffic_selector
        if router is not None: self._values["router"] = router
        if target_vpn_gateway is not None: self._values["target_vpn_gateway"] = target_vpn_gateway
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        The name must be 1-63 characters long, and
        comply with RFC1035. Specifically, the name must be 1-63
        characters long and match the regular expression
        '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character
        must be a lowercase letter, and all following characters must
        be a dash, lowercase letter, or digit,
        except the last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def shared_secret(self) -> str:
        """Shared secret used to set the secure session between the Cloud VPN gateway and the peer VPN gateway."""
        return self._values.get('shared_secret')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description of this resource."""
        return self._values.get('description')

    @builtins.property
    def ike_version(self) -> typing.Optional[jsii.Number]:
        """IKE protocol version to use when establishing the VPN tunnel with peer VPN gateway.

        Acceptable IKE versions are 1 or 2. Default version is 2.
        """
        return self._values.get('ike_version')

    @builtins.property
    def local_traffic_selector(self) -> typing.Optional[typing.List[str]]:
        """Local traffic selector to use when establishing the VPN tunnel with peer VPN gateway.

        The value should be a CIDR formatted string,
        for example '192.168.0.0/16'. The ranges should be disjoint.
        Only IPv4 is supported.
        """
        return self._values.get('local_traffic_selector')

    @builtins.property
    def peer_ip(self) -> typing.Optional[str]:
        """IP address of the peer VPN gateway.

        Only IPv4 is supported.
        """
        return self._values.get('peer_ip')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The region where the tunnel is located.

        If unset, is set to the region of 'target_vpn_gateway'.
        """
        return self._values.get('region')

    @builtins.property
    def remote_traffic_selector(self) -> typing.Optional[typing.List[str]]:
        """Remote traffic selector to use when establishing the VPN tunnel with peer VPN gateway.

        The value should be a CIDR formatted string,
        for example '192.168.0.0/16'. The ranges should be disjoint.
        Only IPv4 is supported.
        """
        return self._values.get('remote_traffic_selector')

    @builtins.property
    def router(self) -> typing.Optional[str]:
        """URL of router resource to be used for dynamic routing."""
        return self._values.get('router')

    @builtins.property
    def target_vpn_gateway(self) -> typing.Optional[str]:
        """URL of the Target VPN gateway with which this VPN tunnel is associated."""
        return self._values.get('target_vpn_gateway')

    @builtins.property
    def timeouts(self) -> typing.Optional["ComputeVpnTunnelTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeVpnTunnelConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ComputeVpnTunnelTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ComputeVpnTunnelTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ComputeVpnTunnelTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ContainerAnalysisNote(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ContainerAnalysisNote"):
    def __init__(self, scope: constructs.Construct, id: str, *, attestation_authority: typing.List["ContainerAnalysisNoteAttestationAuthority"], name: str, expiration_time: typing.Optional[str]=None, long_description: typing.Optional[str]=None, project: typing.Optional[str]=None, related_note_names: typing.Optional[typing.List[str]]=None, related_url: typing.Optional[typing.List["ContainerAnalysisNoteRelatedUrl"]]=None, short_description: typing.Optional[str]=None, timeouts: typing.Optional["ContainerAnalysisNoteTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param attestation_authority: attestation_authority block.
        :param name: The name of the note.
        :param expiration_time: Time of expiration for this note. Leave empty if note does not expire.
        :param long_description: A detailed description of the note.
        :param project: 
        :param related_note_names: Names of other notes related to this note.
        :param related_url: related_url block.
        :param short_description: A one sentence description of the note.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ContainerAnalysisNoteConfig(attestation_authority=attestation_authority, name=name, expiration_time=expiration_time, long_description=long_description, project=project, related_note_names=related_note_names, related_url=related_url, short_description=short_description, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ContainerAnalysisNote, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="kind")
    def kind(self) -> str:
        return jsii.get(self, "kind")

    @builtins.property
    @jsii.member(jsii_name="updateTime")
    def update_time(self) -> str:
        return jsii.get(self, "updateTime")

    @builtins.property
    @jsii.member(jsii_name="attestationAuthority")
    def attestation_authority(self) -> typing.List["ContainerAnalysisNoteAttestationAuthority"]:
        return jsii.get(self, "attestationAuthority")

    @attestation_authority.setter
    def attestation_authority(self, value: typing.List["ContainerAnalysisNoteAttestationAuthority"]) -> None:
        jsii.set(self, "attestationAuthority", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="expirationTime")
    def expiration_time(self) -> typing.Optional[str]:
        return jsii.get(self, "expirationTime")

    @expiration_time.setter
    def expiration_time(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "expirationTime", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="longDescription")
    def long_description(self) -> typing.Optional[str]:
        return jsii.get(self, "longDescription")

    @long_description.setter
    def long_description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "longDescription", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="relatedNoteNames")
    def related_note_names(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "relatedNoteNames")

    @related_note_names.setter
    def related_note_names(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "relatedNoteNames", value)

    @builtins.property
    @jsii.member(jsii_name="relatedUrl")
    def related_url(self) -> typing.Optional[typing.List["ContainerAnalysisNoteRelatedUrl"]]:
        return jsii.get(self, "relatedUrl")

    @related_url.setter
    def related_url(self, value: typing.Optional[typing.List["ContainerAnalysisNoteRelatedUrl"]]) -> None:
        jsii.set(self, "relatedUrl", value)

    @builtins.property
    @jsii.member(jsii_name="shortDescription")
    def short_description(self) -> typing.Optional[str]:
        return jsii.get(self, "shortDescription")

    @short_description.setter
    def short_description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "shortDescription", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ContainerAnalysisNoteTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ContainerAnalysisNoteTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerAnalysisNoteAttestationAuthority", jsii_struct_bases=[], name_mapping={'hint': 'hint'})
class ContainerAnalysisNoteAttestationAuthority():
    def __init__(self, *, hint: typing.List["ContainerAnalysisNoteAttestationAuthorityHint"]) -> None:
        """
        :param hint: hint block.
        """
        self._values = {
            'hint': hint,
        }

    @builtins.property
    def hint(self) -> typing.List["ContainerAnalysisNoteAttestationAuthorityHint"]:
        """hint block."""
        return self._values.get('hint')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerAnalysisNoteAttestationAuthority(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerAnalysisNoteAttestationAuthorityHint", jsii_struct_bases=[], name_mapping={'human_readable_name': 'humanReadableName'})
class ContainerAnalysisNoteAttestationAuthorityHint():
    def __init__(self, *, human_readable_name: str) -> None:
        """
        :param human_readable_name: The human readable name of this Attestation Authority, for example "qa".
        """
        self._values = {
            'human_readable_name': human_readable_name,
        }

    @builtins.property
    def human_readable_name(self) -> str:
        """The human readable name of this Attestation Authority, for example "qa"."""
        return self._values.get('human_readable_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerAnalysisNoteAttestationAuthorityHint(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerAnalysisNoteConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'attestation_authority': 'attestationAuthority', 'name': 'name', 'expiration_time': 'expirationTime', 'long_description': 'longDescription', 'project': 'project', 'related_note_names': 'relatedNoteNames', 'related_url': 'relatedUrl', 'short_description': 'shortDescription', 'timeouts': 'timeouts'})
class ContainerAnalysisNoteConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, attestation_authority: typing.List["ContainerAnalysisNoteAttestationAuthority"], name: str, expiration_time: typing.Optional[str]=None, long_description: typing.Optional[str]=None, project: typing.Optional[str]=None, related_note_names: typing.Optional[typing.List[str]]=None, related_url: typing.Optional[typing.List["ContainerAnalysisNoteRelatedUrl"]]=None, short_description: typing.Optional[str]=None, timeouts: typing.Optional["ContainerAnalysisNoteTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param attestation_authority: attestation_authority block.
        :param name: The name of the note.
        :param expiration_time: Time of expiration for this note. Leave empty if note does not expire.
        :param long_description: A detailed description of the note.
        :param project: 
        :param related_note_names: Names of other notes related to this note.
        :param related_url: related_url block.
        :param short_description: A one sentence description of the note.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ContainerAnalysisNoteTimeouts(**timeouts)
        self._values = {
            'attestation_authority': attestation_authority,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if expiration_time is not None: self._values["expiration_time"] = expiration_time
        if long_description is not None: self._values["long_description"] = long_description
        if project is not None: self._values["project"] = project
        if related_note_names is not None: self._values["related_note_names"] = related_note_names
        if related_url is not None: self._values["related_url"] = related_url
        if short_description is not None: self._values["short_description"] = short_description
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def attestation_authority(self) -> typing.List["ContainerAnalysisNoteAttestationAuthority"]:
        """attestation_authority block."""
        return self._values.get('attestation_authority')

    @builtins.property
    def name(self) -> str:
        """The name of the note."""
        return self._values.get('name')

    @builtins.property
    def expiration_time(self) -> typing.Optional[str]:
        """Time of expiration for this note.

        Leave empty if note does not expire.
        """
        return self._values.get('expiration_time')

    @builtins.property
    def long_description(self) -> typing.Optional[str]:
        """A detailed description of the note."""
        return self._values.get('long_description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def related_note_names(self) -> typing.Optional[typing.List[str]]:
        """Names of other notes related to this note."""
        return self._values.get('related_note_names')

    @builtins.property
    def related_url(self) -> typing.Optional[typing.List["ContainerAnalysisNoteRelatedUrl"]]:
        """related_url block."""
        return self._values.get('related_url')

    @builtins.property
    def short_description(self) -> typing.Optional[str]:
        """A one sentence description of the note."""
        return self._values.get('short_description')

    @builtins.property
    def timeouts(self) -> typing.Optional["ContainerAnalysisNoteTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerAnalysisNoteConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerAnalysisNoteRelatedUrl", jsii_struct_bases=[], name_mapping={'url': 'url', 'label': 'label'})
class ContainerAnalysisNoteRelatedUrl():
    def __init__(self, *, url: str, label: typing.Optional[str]=None) -> None:
        """
        :param url: Specific URL associated with the resource.
        :param label: Label to describe usage of the URL.
        """
        self._values = {
            'url': url,
        }
        if label is not None: self._values["label"] = label

    @builtins.property
    def url(self) -> str:
        """Specific URL associated with the resource."""
        return self._values.get('url')

    @builtins.property
    def label(self) -> typing.Optional[str]:
        """Label to describe usage of the URL."""
        return self._values.get('label')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerAnalysisNoteRelatedUrl(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerAnalysisNoteTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ContainerAnalysisNoteTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerAnalysisNoteTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ContainerAnalysisOccurrence(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ContainerAnalysisOccurrence"):
    def __init__(self, scope: constructs.Construct, id: str, *, attestation: typing.List["ContainerAnalysisOccurrenceAttestation"], note_name: str, resource_uri: str, project: typing.Optional[str]=None, remediation: typing.Optional[str]=None, timeouts: typing.Optional["ContainerAnalysisOccurrenceTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param attestation: attestation block.
        :param note_name: The analysis note associated with this occurrence, in the form of projects/[PROJECT]/notes/[NOTE_ID]. This field can be used as a filter in list requests.
        :param resource_uri: Required. Immutable. A URI that represents the resource for which the occurrence applies. For example, https://gcr.io/project/image@sha256:123abc for a Docker image.
        :param project: 
        :param remediation: A description of actions that can be taken to remedy the note.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ContainerAnalysisOccurrenceConfig(attestation=attestation, note_name=note_name, resource_uri=resource_uri, project=project, remediation=remediation, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ContainerAnalysisOccurrence, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="kind")
    def kind(self) -> str:
        return jsii.get(self, "kind")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="updateTime")
    def update_time(self) -> str:
        return jsii.get(self, "updateTime")

    @builtins.property
    @jsii.member(jsii_name="attestation")
    def attestation(self) -> typing.List["ContainerAnalysisOccurrenceAttestation"]:
        return jsii.get(self, "attestation")

    @attestation.setter
    def attestation(self, value: typing.List["ContainerAnalysisOccurrenceAttestation"]) -> None:
        jsii.set(self, "attestation", value)

    @builtins.property
    @jsii.member(jsii_name="noteName")
    def note_name(self) -> str:
        return jsii.get(self, "noteName")

    @note_name.setter
    def note_name(self, value: str) -> None:
        jsii.set(self, "noteName", value)

    @builtins.property
    @jsii.member(jsii_name="resourceUri")
    def resource_uri(self) -> str:
        return jsii.get(self, "resourceUri")

    @resource_uri.setter
    def resource_uri(self, value: str) -> None:
        jsii.set(self, "resourceUri", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="remediation")
    def remediation(self) -> typing.Optional[str]:
        return jsii.get(self, "remediation")

    @remediation.setter
    def remediation(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "remediation", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ContainerAnalysisOccurrenceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ContainerAnalysisOccurrenceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerAnalysisOccurrenceAttestation", jsii_struct_bases=[], name_mapping={'serialized_payload': 'serializedPayload', 'signatures': 'signatures'})
class ContainerAnalysisOccurrenceAttestation():
    def __init__(self, *, serialized_payload: str, signatures: typing.List["ContainerAnalysisOccurrenceAttestationSignatures"]) -> None:
        """
        :param serialized_payload: The serialized payload that is verified by one or more signatures. A base64-encoded string.
        :param signatures: signatures block.
        """
        self._values = {
            'serialized_payload': serialized_payload,
            'signatures': signatures,
        }

    @builtins.property
    def serialized_payload(self) -> str:
        """The serialized payload that is verified by one or more signatures.

        A base64-encoded string.
        """
        return self._values.get('serialized_payload')

    @builtins.property
    def signatures(self) -> typing.List["ContainerAnalysisOccurrenceAttestationSignatures"]:
        """signatures block."""
        return self._values.get('signatures')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerAnalysisOccurrenceAttestation(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerAnalysisOccurrenceAttestationSignatures", jsii_struct_bases=[], name_mapping={'public_key_id': 'publicKeyId', 'signature': 'signature'})
class ContainerAnalysisOccurrenceAttestationSignatures():
    def __init__(self, *, public_key_id: str, signature: typing.Optional[str]=None) -> None:
        """
        :param public_key_id: The identifier for the public key that verifies this signature. MUST be an RFC3986 conformant URI. * When possible, the key id should be an immutable reference, such as a cryptographic digest. Examples of valid values: OpenPGP V4 public key fingerprint. See https://www.iana.org/assignments/uri-schemes/prov/openpgp4fpr for more details on this scheme. 'openpgp4fpr:74FAF3B861BDA0870C7B6DEF607E48D2A663AEEA' RFC6920 digest-named SubjectPublicKeyInfo (digest of the DER serialization): "ni:///sha-256;cD9o9Cq6LG3jD0iKXqEi_vdjJGecm_iXkbqVoScViaU"
        :param signature: The content of the signature, an opaque bytestring. The payload that this signature verifies MUST be unambiguously provided with the Signature during verification. A wrapper message might provide the payload explicitly. Alternatively, a message might have a canonical serialization that can always be unambiguously computed to derive the payload.
        """
        self._values = {
            'public_key_id': public_key_id,
        }
        if signature is not None: self._values["signature"] = signature

    @builtins.property
    def public_key_id(self) -> str:
        """The identifier for the public key that verifies this signature.

        MUST be an RFC3986 conformant
        URI. * When possible, the key id should be an
        immutable reference, such as a cryptographic digest.
        Examples of valid values:

        OpenPGP V4 public key fingerprint. See https://www.iana.org/assignments/uri-schemes/prov/openpgp4fpr
        for more details on this scheme.
        'openpgp4fpr:74FAF3B861BDA0870C7B6DEF607E48D2A663AEEA'
        RFC6920 digest-named SubjectPublicKeyInfo (digest of the DER serialization):
        "ni:///sha-256;cD9o9Cq6LG3jD0iKXqEi_vdjJGecm_iXkbqVoScViaU"
        """
        return self._values.get('public_key_id')

    @builtins.property
    def signature(self) -> typing.Optional[str]:
        """The content of the signature, an opaque bytestring.

        The payload that this signature verifies MUST be
        unambiguously provided with the Signature during
        verification. A wrapper message might provide the
        payload explicitly. Alternatively, a message might
        have a canonical serialization that can always be
        unambiguously computed to derive the payload.
        """
        return self._values.get('signature')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerAnalysisOccurrenceAttestationSignatures(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerAnalysisOccurrenceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'attestation': 'attestation', 'note_name': 'noteName', 'resource_uri': 'resourceUri', 'project': 'project', 'remediation': 'remediation', 'timeouts': 'timeouts'})
class ContainerAnalysisOccurrenceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, attestation: typing.List["ContainerAnalysisOccurrenceAttestation"], note_name: str, resource_uri: str, project: typing.Optional[str]=None, remediation: typing.Optional[str]=None, timeouts: typing.Optional["ContainerAnalysisOccurrenceTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param attestation: attestation block.
        :param note_name: The analysis note associated with this occurrence, in the form of projects/[PROJECT]/notes/[NOTE_ID]. This field can be used as a filter in list requests.
        :param resource_uri: Required. Immutable. A URI that represents the resource for which the occurrence applies. For example, https://gcr.io/project/image@sha256:123abc for a Docker image.
        :param project: 
        :param remediation: A description of actions that can be taken to remedy the note.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ContainerAnalysisOccurrenceTimeouts(**timeouts)
        self._values = {
            'attestation': attestation,
            'note_name': note_name,
            'resource_uri': resource_uri,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if remediation is not None: self._values["remediation"] = remediation
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def attestation(self) -> typing.List["ContainerAnalysisOccurrenceAttestation"]:
        """attestation block."""
        return self._values.get('attestation')

    @builtins.property
    def note_name(self) -> str:
        """The analysis note associated with this occurrence, in the form of projects/[PROJECT]/notes/[NOTE_ID].

        This field can be used as a
        filter in list requests.
        """
        return self._values.get('note_name')

    @builtins.property
    def resource_uri(self) -> str:
        """Required.

        Immutable. A URI that represents the resource for which
        the occurrence applies. For example,
        https://gcr.io/project/image@sha256:123abc for a Docker image.
        """
        return self._values.get('resource_uri')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def remediation(self) -> typing.Optional[str]:
        """A description of actions that can be taken to remedy the note."""
        return self._values.get('remediation')

    @builtins.property
    def timeouts(self) -> typing.Optional["ContainerAnalysisOccurrenceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerAnalysisOccurrenceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerAnalysisOccurrenceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ContainerAnalysisOccurrenceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerAnalysisOccurrenceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ContainerCluster(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ContainerCluster"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, additional_zones: typing.Optional[typing.List[str]]=None, addons_config: typing.Optional[typing.List["ContainerClusterAddonsConfig"]]=None, authenticator_groups_config: typing.Optional[typing.List["ContainerClusterAuthenticatorGroupsConfig"]]=None, cluster_autoscaling: typing.Optional[typing.List["ContainerClusterClusterAutoscaling"]]=None, cluster_ipv4_cidr: typing.Optional[str]=None, database_encryption: typing.Optional[typing.List["ContainerClusterDatabaseEncryption"]]=None, default_max_pods_per_node: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, enable_binary_authorization: typing.Optional[bool]=None, enable_intranode_visibility: typing.Optional[bool]=None, enable_kubernetes_alpha: typing.Optional[bool]=None, enable_legacy_abac: typing.Optional[bool]=None, enable_shielded_nodes: typing.Optional[bool]=None, enable_tpu: typing.Optional[bool]=None, initial_node_count: typing.Optional[jsii.Number]=None, ip_allocation_policy: typing.Optional[typing.List["ContainerClusterIpAllocationPolicy"]]=None, location: typing.Optional[str]=None, logging_service: typing.Optional[str]=None, maintenance_policy: typing.Optional[typing.List["ContainerClusterMaintenancePolicy"]]=None, master_auth: typing.Optional[typing.List["ContainerClusterMasterAuth"]]=None, master_authorized_networks_config: typing.Optional[typing.List["ContainerClusterMasterAuthorizedNetworksConfig"]]=None, min_master_version: typing.Optional[str]=None, monitoring_service: typing.Optional[str]=None, network: typing.Optional[str]=None, network_policy: typing.Optional[typing.List["ContainerClusterNetworkPolicy"]]=None, node_config: typing.Optional[typing.List["ContainerClusterNodeConfig"]]=None, node_locations: typing.Optional[typing.List[str]]=None, node_pool: typing.Optional[typing.List["ContainerClusterNodePool"]]=None, node_version: typing.Optional[str]=None, pod_security_policy_config: typing.Optional[typing.List["ContainerClusterPodSecurityPolicyConfig"]]=None, private_cluster_config: typing.Optional[typing.List["ContainerClusterPrivateClusterConfig"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, release_channel: typing.Optional[typing.List["ContainerClusterReleaseChannel"]]=None, remove_default_node_pool: typing.Optional[bool]=None, resource_labels: typing.Optional[typing.Mapping[str, str]]=None, resource_usage_export_config: typing.Optional[typing.List["ContainerClusterResourceUsageExportConfig"]]=None, subnetwork: typing.Optional[str]=None, timeouts: typing.Optional["ContainerClusterTimeouts"]=None, vertical_pod_autoscaling: typing.Optional[typing.List["ContainerClusterVerticalPodAutoscaling"]]=None, workload_identity_config: typing.Optional[typing.List["ContainerClusterWorkloadIdentityConfig"]]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the cluster, unique within the project and location.
        :param additional_zones: Additional_zones has been removed in favor of node_locations.
        :param addons_config: addons_config block.
        :param authenticator_groups_config: authenticator_groups_config block.
        :param cluster_autoscaling: cluster_autoscaling block.
        :param cluster_ipv4_cidr: The IP address range of the Kubernetes pods in this cluster in CIDR notation (e.g. 10.96.0.0/14). Leave blank to have one automatically chosen or specify a /14 block in 10.0.0.0/8. This field will only work for routes-based clusters, where ip_allocation_policy is not defined.
        :param database_encryption: database_encryption block.
        :param default_max_pods_per_node: The default maximum number of pods per node in this cluster. This doesn't work on "routes-based" clusters, clusters that don't have IP Aliasing enabled.
        :param description: Description of the cluster.
        :param enable_binary_authorization: Enable Binary Authorization for this cluster. If enabled, all container images will be validated by Google Binary Authorization.
        :param enable_intranode_visibility: Whether Intra-node visibility is enabled for this cluster. This makes same node pod to pod traffic visible for VPC network.
        :param enable_kubernetes_alpha: Whether to enable Kubernetes Alpha features for this cluster. Note that when this option is enabled, the cluster cannot be upgraded and will be automatically deleted after 30 days.
        :param enable_legacy_abac: Whether the ABAC authorizer is enabled for this cluster. When enabled, identities in the system, including service accounts, nodes, and controllers, will have statically granted permissions beyond those provided by the RBAC configuration or IAM. Defaults to false.
        :param enable_shielded_nodes: Enable Shielded Nodes features on all nodes in this cluster. Defaults to false.
        :param enable_tpu: Whether to enable Cloud TPU resources in this cluster.
        :param initial_node_count: The number of nodes to create in this cluster's default node pool. In regional or multi-zonal clusters, this is the number of nodes per zone. Must be set if node_pool is not set. If you're using google_container_node_pool objects with no default node pool, you'll need to set this to a value of at least 1, alongside setting remove_default_node_pool to true.
        :param ip_allocation_policy: ip_allocation_policy block.
        :param location: The location (region or zone) in which the cluster master will be created, as well as the default node location. If you specify a zone (such as us-central1-a), the cluster will be a zonal cluster with a single cluster master. If you specify a region (such as us-west1), the cluster will be a regional cluster with multiple masters spread across zones in the region, and with default node locations in those zones as well.
        :param logging_service: The logging service that the cluster should write logs to. Available options include logging.googleapis.com(Legacy Stackdriver), logging.googleapis.com/kubernetes(Stackdriver Kubernetes Engine Logging), and none. Defaults to logging.googleapis.com/kubernetes.
        :param maintenance_policy: maintenance_policy block.
        :param master_auth: master_auth block.
        :param master_authorized_networks_config: master_authorized_networks_config block.
        :param min_master_version: The minimum version of the master. GKE will auto-update the master to new versions, so this does not guarantee the current master version--use the read-only master_version field to obtain that. If unset, the cluster's version will be set by GKE to the version of the most recent official release (which is not necessarily the latest version).
        :param monitoring_service: The monitoring service that the cluster should write metrics to. Automatically send metrics from pods in the cluster to the Google Cloud Monitoring API. VM metrics will be collected by Google Compute Engine regardless of this setting Available options include monitoring.googleapis.com(Legacy Stackdriver), monitoring.googleapis.com/kubernetes(Stackdriver Kubernetes Engine Monitoring), and none. Defaults to monitoring.googleapis.com/kubernetes.
        :param network: The name or self_link of the Google Compute Engine network to which the cluster is connected. For Shared VPC, set this to the self link of the shared network.
        :param network_policy: network_policy block.
        :param node_config: node_config block.
        :param node_locations: The list of zones in which the cluster's nodes are located. Nodes must be in the region of their regional cluster or in the same region as their cluster's zone for zonal clusters. If this is specified for a zonal cluster, omit the cluster's zone.
        :param node_pool: node_pool block.
        :param node_version: The Kubernetes version on the nodes. Must either be unset or set to the same value as min_master_version on create. Defaults to the default version set by GKE which is not necessarily the latest version. This only affects nodes in the default node pool. While a fuzzy version can be specified, it's recommended that you specify explicit versions as Terraform will see spurious diffs when fuzzy versions are used. See the google_container_engine_versions data source's version_prefix field to approximate fuzzy versions in a Terraform-compatible way. To update nodes in other node pools, use the version attribute on the node pool.
        :param pod_security_policy_config: pod_security_policy_config block.
        :param private_cluster_config: private_cluster_config block.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param region: The region in which the cluster master will be created. Zone and region have been removed in favor of location.
        :param release_channel: release_channel block.
        :param remove_default_node_pool: If true, deletes the default node pool upon cluster creation. If you're using google_container_node_pool resources with no default node pool, this should be set to true, alongside setting initial_node_count to at least 1.
        :param resource_labels: The GCE resource labels (a map of key/value pairs) to be applied to the cluster.
        :param resource_usage_export_config: resource_usage_export_config block.
        :param subnetwork: The name or self_link of the Google Compute Engine subnetwork in which the cluster's instances are launched.
        :param timeouts: timeouts block.
        :param vertical_pod_autoscaling: vertical_pod_autoscaling block.
        :param workload_identity_config: workload_identity_config block.
        :param zone: The zone in which the cluster master will be created. Zone and region have been removed in favor of location.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ContainerClusterConfig(name=name, additional_zones=additional_zones, addons_config=addons_config, authenticator_groups_config=authenticator_groups_config, cluster_autoscaling=cluster_autoscaling, cluster_ipv4_cidr=cluster_ipv4_cidr, database_encryption=database_encryption, default_max_pods_per_node=default_max_pods_per_node, description=description, enable_binary_authorization=enable_binary_authorization, enable_intranode_visibility=enable_intranode_visibility, enable_kubernetes_alpha=enable_kubernetes_alpha, enable_legacy_abac=enable_legacy_abac, enable_shielded_nodes=enable_shielded_nodes, enable_tpu=enable_tpu, initial_node_count=initial_node_count, ip_allocation_policy=ip_allocation_policy, location=location, logging_service=logging_service, maintenance_policy=maintenance_policy, master_auth=master_auth, master_authorized_networks_config=master_authorized_networks_config, min_master_version=min_master_version, monitoring_service=monitoring_service, network=network, network_policy=network_policy, node_config=node_config, node_locations=node_locations, node_pool=node_pool, node_version=node_version, pod_security_policy_config=pod_security_policy_config, private_cluster_config=private_cluster_config, project=project, region=region, release_channel=release_channel, remove_default_node_pool=remove_default_node_pool, resource_labels=resource_labels, resource_usage_export_config=resource_usage_export_config, subnetwork=subnetwork, timeouts=timeouts, vertical_pod_autoscaling=vertical_pod_autoscaling, workload_identity_config=workload_identity_config, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ContainerCluster, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> str:
        return jsii.get(self, "endpoint")

    @builtins.property
    @jsii.member(jsii_name="instanceGroupUrls")
    def instance_group_urls(self) -> typing.List[str]:
        return jsii.get(self, "instanceGroupUrls")

    @builtins.property
    @jsii.member(jsii_name="labelFingerprint")
    def label_fingerprint(self) -> str:
        return jsii.get(self, "labelFingerprint")

    @builtins.property
    @jsii.member(jsii_name="masterVersion")
    def master_version(self) -> str:
        return jsii.get(self, "masterVersion")

    @builtins.property
    @jsii.member(jsii_name="operation")
    def operation(self) -> str:
        return jsii.get(self, "operation")

    @builtins.property
    @jsii.member(jsii_name="servicesIpv4Cidr")
    def services_ipv4_cidr(self) -> str:
        return jsii.get(self, "servicesIpv4Cidr")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="additionalZones")
    def additional_zones(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "additionalZones")

    @additional_zones.setter
    def additional_zones(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "additionalZones", value)

    @builtins.property
    @jsii.member(jsii_name="addonsConfig")
    def addons_config(self) -> typing.Optional[typing.List["ContainerClusterAddonsConfig"]]:
        return jsii.get(self, "addonsConfig")

    @addons_config.setter
    def addons_config(self, value: typing.Optional[typing.List["ContainerClusterAddonsConfig"]]) -> None:
        jsii.set(self, "addonsConfig", value)

    @builtins.property
    @jsii.member(jsii_name="authenticatorGroupsConfig")
    def authenticator_groups_config(self) -> typing.Optional[typing.List["ContainerClusterAuthenticatorGroupsConfig"]]:
        return jsii.get(self, "authenticatorGroupsConfig")

    @authenticator_groups_config.setter
    def authenticator_groups_config(self, value: typing.Optional[typing.List["ContainerClusterAuthenticatorGroupsConfig"]]) -> None:
        jsii.set(self, "authenticatorGroupsConfig", value)

    @builtins.property
    @jsii.member(jsii_name="clusterAutoscaling")
    def cluster_autoscaling(self) -> typing.Optional[typing.List["ContainerClusterClusterAutoscaling"]]:
        return jsii.get(self, "clusterAutoscaling")

    @cluster_autoscaling.setter
    def cluster_autoscaling(self, value: typing.Optional[typing.List["ContainerClusterClusterAutoscaling"]]) -> None:
        jsii.set(self, "clusterAutoscaling", value)

    @builtins.property
    @jsii.member(jsii_name="clusterIpv4Cidr")
    def cluster_ipv4_cidr(self) -> typing.Optional[str]:
        return jsii.get(self, "clusterIpv4Cidr")

    @cluster_ipv4_cidr.setter
    def cluster_ipv4_cidr(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "clusterIpv4Cidr", value)

    @builtins.property
    @jsii.member(jsii_name="databaseEncryption")
    def database_encryption(self) -> typing.Optional[typing.List["ContainerClusterDatabaseEncryption"]]:
        return jsii.get(self, "databaseEncryption")

    @database_encryption.setter
    def database_encryption(self, value: typing.Optional[typing.List["ContainerClusterDatabaseEncryption"]]) -> None:
        jsii.set(self, "databaseEncryption", value)

    @builtins.property
    @jsii.member(jsii_name="defaultMaxPodsPerNode")
    def default_max_pods_per_node(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "defaultMaxPodsPerNode")

    @default_max_pods_per_node.setter
    def default_max_pods_per_node(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "defaultMaxPodsPerNode", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="enableBinaryAuthorization")
    def enable_binary_authorization(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableBinaryAuthorization")

    @enable_binary_authorization.setter
    def enable_binary_authorization(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableBinaryAuthorization", value)

    @builtins.property
    @jsii.member(jsii_name="enableIntranodeVisibility")
    def enable_intranode_visibility(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableIntranodeVisibility")

    @enable_intranode_visibility.setter
    def enable_intranode_visibility(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableIntranodeVisibility", value)

    @builtins.property
    @jsii.member(jsii_name="enableKubernetesAlpha")
    def enable_kubernetes_alpha(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableKubernetesAlpha")

    @enable_kubernetes_alpha.setter
    def enable_kubernetes_alpha(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableKubernetesAlpha", value)

    @builtins.property
    @jsii.member(jsii_name="enableLegacyAbac")
    def enable_legacy_abac(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableLegacyAbac")

    @enable_legacy_abac.setter
    def enable_legacy_abac(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableLegacyAbac", value)

    @builtins.property
    @jsii.member(jsii_name="enableShieldedNodes")
    def enable_shielded_nodes(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableShieldedNodes")

    @enable_shielded_nodes.setter
    def enable_shielded_nodes(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableShieldedNodes", value)

    @builtins.property
    @jsii.member(jsii_name="enableTpu")
    def enable_tpu(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableTpu")

    @enable_tpu.setter
    def enable_tpu(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableTpu", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="initialNodeCount")
    def initial_node_count(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "initialNodeCount")

    @initial_node_count.setter
    def initial_node_count(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "initialNodeCount", value)

    @builtins.property
    @jsii.member(jsii_name="ipAllocationPolicy")
    def ip_allocation_policy(self) -> typing.Optional[typing.List["ContainerClusterIpAllocationPolicy"]]:
        return jsii.get(self, "ipAllocationPolicy")

    @ip_allocation_policy.setter
    def ip_allocation_policy(self, value: typing.Optional[typing.List["ContainerClusterIpAllocationPolicy"]]) -> None:
        jsii.set(self, "ipAllocationPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="loggingService")
    def logging_service(self) -> typing.Optional[str]:
        return jsii.get(self, "loggingService")

    @logging_service.setter
    def logging_service(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "loggingService", value)

    @builtins.property
    @jsii.member(jsii_name="maintenancePolicy")
    def maintenance_policy(self) -> typing.Optional[typing.List["ContainerClusterMaintenancePolicy"]]:
        return jsii.get(self, "maintenancePolicy")

    @maintenance_policy.setter
    def maintenance_policy(self, value: typing.Optional[typing.List["ContainerClusterMaintenancePolicy"]]) -> None:
        jsii.set(self, "maintenancePolicy", value)

    @builtins.property
    @jsii.member(jsii_name="masterAuth")
    def master_auth(self) -> typing.Optional[typing.List["ContainerClusterMasterAuth"]]:
        return jsii.get(self, "masterAuth")

    @master_auth.setter
    def master_auth(self, value: typing.Optional[typing.List["ContainerClusterMasterAuth"]]) -> None:
        jsii.set(self, "masterAuth", value)

    @builtins.property
    @jsii.member(jsii_name="masterAuthorizedNetworksConfig")
    def master_authorized_networks_config(self) -> typing.Optional[typing.List["ContainerClusterMasterAuthorizedNetworksConfig"]]:
        return jsii.get(self, "masterAuthorizedNetworksConfig")

    @master_authorized_networks_config.setter
    def master_authorized_networks_config(self, value: typing.Optional[typing.List["ContainerClusterMasterAuthorizedNetworksConfig"]]) -> None:
        jsii.set(self, "masterAuthorizedNetworksConfig", value)

    @builtins.property
    @jsii.member(jsii_name="minMasterVersion")
    def min_master_version(self) -> typing.Optional[str]:
        return jsii.get(self, "minMasterVersion")

    @min_master_version.setter
    def min_master_version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "minMasterVersion", value)

    @builtins.property
    @jsii.member(jsii_name="monitoringService")
    def monitoring_service(self) -> typing.Optional[str]:
        return jsii.get(self, "monitoringService")

    @monitoring_service.setter
    def monitoring_service(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "monitoringService", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> typing.Optional[str]:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="networkPolicy")
    def network_policy(self) -> typing.Optional[typing.List["ContainerClusterNetworkPolicy"]]:
        return jsii.get(self, "networkPolicy")

    @network_policy.setter
    def network_policy(self, value: typing.Optional[typing.List["ContainerClusterNetworkPolicy"]]) -> None:
        jsii.set(self, "networkPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="nodeConfig")
    def node_config(self) -> typing.Optional[typing.List["ContainerClusterNodeConfig"]]:
        return jsii.get(self, "nodeConfig")

    @node_config.setter
    def node_config(self, value: typing.Optional[typing.List["ContainerClusterNodeConfig"]]) -> None:
        jsii.set(self, "nodeConfig", value)

    @builtins.property
    @jsii.member(jsii_name="nodeLocations")
    def node_locations(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "nodeLocations")

    @node_locations.setter
    def node_locations(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "nodeLocations", value)

    @builtins.property
    @jsii.member(jsii_name="nodePool")
    def node_pool(self) -> typing.Optional[typing.List["ContainerClusterNodePool"]]:
        return jsii.get(self, "nodePool")

    @node_pool.setter
    def node_pool(self, value: typing.Optional[typing.List["ContainerClusterNodePool"]]) -> None:
        jsii.set(self, "nodePool", value)

    @builtins.property
    @jsii.member(jsii_name="nodeVersion")
    def node_version(self) -> typing.Optional[str]:
        return jsii.get(self, "nodeVersion")

    @node_version.setter
    def node_version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "nodeVersion", value)

    @builtins.property
    @jsii.member(jsii_name="podSecurityPolicyConfig")
    def pod_security_policy_config(self) -> typing.Optional[typing.List["ContainerClusterPodSecurityPolicyConfig"]]:
        return jsii.get(self, "podSecurityPolicyConfig")

    @pod_security_policy_config.setter
    def pod_security_policy_config(self, value: typing.Optional[typing.List["ContainerClusterPodSecurityPolicyConfig"]]) -> None:
        jsii.set(self, "podSecurityPolicyConfig", value)

    @builtins.property
    @jsii.member(jsii_name="privateClusterConfig")
    def private_cluster_config(self) -> typing.Optional[typing.List["ContainerClusterPrivateClusterConfig"]]:
        return jsii.get(self, "privateClusterConfig")

    @private_cluster_config.setter
    def private_cluster_config(self, value: typing.Optional[typing.List["ContainerClusterPrivateClusterConfig"]]) -> None:
        jsii.set(self, "privateClusterConfig", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="releaseChannel")
    def release_channel(self) -> typing.Optional[typing.List["ContainerClusterReleaseChannel"]]:
        return jsii.get(self, "releaseChannel")

    @release_channel.setter
    def release_channel(self, value: typing.Optional[typing.List["ContainerClusterReleaseChannel"]]) -> None:
        jsii.set(self, "releaseChannel", value)

    @builtins.property
    @jsii.member(jsii_name="removeDefaultNodePool")
    def remove_default_node_pool(self) -> typing.Optional[bool]:
        return jsii.get(self, "removeDefaultNodePool")

    @remove_default_node_pool.setter
    def remove_default_node_pool(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "removeDefaultNodePool", value)

    @builtins.property
    @jsii.member(jsii_name="resourceLabels")
    def resource_labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "resourceLabels")

    @resource_labels.setter
    def resource_labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "resourceLabels", value)

    @builtins.property
    @jsii.member(jsii_name="resourceUsageExportConfig")
    def resource_usage_export_config(self) -> typing.Optional[typing.List["ContainerClusterResourceUsageExportConfig"]]:
        return jsii.get(self, "resourceUsageExportConfig")

    @resource_usage_export_config.setter
    def resource_usage_export_config(self, value: typing.Optional[typing.List["ContainerClusterResourceUsageExportConfig"]]) -> None:
        jsii.set(self, "resourceUsageExportConfig", value)

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> typing.Optional[str]:
        return jsii.get(self, "subnetwork")

    @subnetwork.setter
    def subnetwork(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "subnetwork", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ContainerClusterTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ContainerClusterTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="verticalPodAutoscaling")
    def vertical_pod_autoscaling(self) -> typing.Optional[typing.List["ContainerClusterVerticalPodAutoscaling"]]:
        return jsii.get(self, "verticalPodAutoscaling")

    @vertical_pod_autoscaling.setter
    def vertical_pod_autoscaling(self, value: typing.Optional[typing.List["ContainerClusterVerticalPodAutoscaling"]]) -> None:
        jsii.set(self, "verticalPodAutoscaling", value)

    @builtins.property
    @jsii.member(jsii_name="workloadIdentityConfig")
    def workload_identity_config(self) -> typing.Optional[typing.List["ContainerClusterWorkloadIdentityConfig"]]:
        return jsii.get(self, "workloadIdentityConfig")

    @workload_identity_config.setter
    def workload_identity_config(self, value: typing.Optional[typing.List["ContainerClusterWorkloadIdentityConfig"]]) -> None:
        jsii.set(self, "workloadIdentityConfig", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterAddonsConfig", jsii_struct_bases=[], name_mapping={'cloudrun_config': 'cloudrunConfig', 'horizontal_pod_autoscaling': 'horizontalPodAutoscaling', 'http_load_balancing': 'httpLoadBalancing', 'kubernetes_dashboard': 'kubernetesDashboard', 'network_policy_config': 'networkPolicyConfig'})
class ContainerClusterAddonsConfig():
    def __init__(self, *, cloudrun_config: typing.Optional[typing.List["ContainerClusterAddonsConfigCloudrunConfig"]]=None, horizontal_pod_autoscaling: typing.Optional[typing.List["ContainerClusterAddonsConfigHorizontalPodAutoscaling"]]=None, http_load_balancing: typing.Optional[typing.List["ContainerClusterAddonsConfigHttpLoadBalancing"]]=None, kubernetes_dashboard: typing.Optional[typing.List["ContainerClusterAddonsConfigKubernetesDashboard"]]=None, network_policy_config: typing.Optional[typing.List["ContainerClusterAddonsConfigNetworkPolicyConfig"]]=None) -> None:
        """
        :param cloudrun_config: cloudrun_config block.
        :param horizontal_pod_autoscaling: horizontal_pod_autoscaling block.
        :param http_load_balancing: http_load_balancing block.
        :param kubernetes_dashboard: kubernetes_dashboard block.
        :param network_policy_config: network_policy_config block.
        """
        self._values = {
        }
        if cloudrun_config is not None: self._values["cloudrun_config"] = cloudrun_config
        if horizontal_pod_autoscaling is not None: self._values["horizontal_pod_autoscaling"] = horizontal_pod_autoscaling
        if http_load_balancing is not None: self._values["http_load_balancing"] = http_load_balancing
        if kubernetes_dashboard is not None: self._values["kubernetes_dashboard"] = kubernetes_dashboard
        if network_policy_config is not None: self._values["network_policy_config"] = network_policy_config

    @builtins.property
    def cloudrun_config(self) -> typing.Optional[typing.List["ContainerClusterAddonsConfigCloudrunConfig"]]:
        """cloudrun_config block."""
        return self._values.get('cloudrun_config')

    @builtins.property
    def horizontal_pod_autoscaling(self) -> typing.Optional[typing.List["ContainerClusterAddonsConfigHorizontalPodAutoscaling"]]:
        """horizontal_pod_autoscaling block."""
        return self._values.get('horizontal_pod_autoscaling')

    @builtins.property
    def http_load_balancing(self) -> typing.Optional[typing.List["ContainerClusterAddonsConfigHttpLoadBalancing"]]:
        """http_load_balancing block."""
        return self._values.get('http_load_balancing')

    @builtins.property
    def kubernetes_dashboard(self) -> typing.Optional[typing.List["ContainerClusterAddonsConfigKubernetesDashboard"]]:
        """kubernetes_dashboard block."""
        return self._values.get('kubernetes_dashboard')

    @builtins.property
    def network_policy_config(self) -> typing.Optional[typing.List["ContainerClusterAddonsConfigNetworkPolicyConfig"]]:
        """network_policy_config block."""
        return self._values.get('network_policy_config')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterAddonsConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterAddonsConfigCloudrunConfig", jsii_struct_bases=[], name_mapping={'disabled': 'disabled'})
class ContainerClusterAddonsConfigCloudrunConfig():
    def __init__(self, *, disabled: bool) -> None:
        """
        :param disabled: 
        """
        self._values = {
            'disabled': disabled,
        }

    @builtins.property
    def disabled(self) -> bool:
        return self._values.get('disabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterAddonsConfigCloudrunConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterAddonsConfigHorizontalPodAutoscaling", jsii_struct_bases=[], name_mapping={'disabled': 'disabled'})
class ContainerClusterAddonsConfigHorizontalPodAutoscaling():
    def __init__(self, *, disabled: bool) -> None:
        """
        :param disabled: 
        """
        self._values = {
            'disabled': disabled,
        }

    @builtins.property
    def disabled(self) -> bool:
        return self._values.get('disabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterAddonsConfigHorizontalPodAutoscaling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterAddonsConfigHttpLoadBalancing", jsii_struct_bases=[], name_mapping={'disabled': 'disabled'})
class ContainerClusterAddonsConfigHttpLoadBalancing():
    def __init__(self, *, disabled: bool) -> None:
        """
        :param disabled: 
        """
        self._values = {
            'disabled': disabled,
        }

    @builtins.property
    def disabled(self) -> bool:
        return self._values.get('disabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterAddonsConfigHttpLoadBalancing(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterAddonsConfigKubernetesDashboard", jsii_struct_bases=[], name_mapping={'disabled': 'disabled'})
class ContainerClusterAddonsConfigKubernetesDashboard():
    def __init__(self, *, disabled: typing.Optional[bool]=None) -> None:
        """
        :param disabled: 
        """
        self._values = {
        }
        if disabled is not None: self._values["disabled"] = disabled

    @builtins.property
    def disabled(self) -> typing.Optional[bool]:
        return self._values.get('disabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterAddonsConfigKubernetesDashboard(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterAddonsConfigNetworkPolicyConfig", jsii_struct_bases=[], name_mapping={'disabled': 'disabled'})
class ContainerClusterAddonsConfigNetworkPolicyConfig():
    def __init__(self, *, disabled: bool) -> None:
        """
        :param disabled: 
        """
        self._values = {
            'disabled': disabled,
        }

    @builtins.property
    def disabled(self) -> bool:
        return self._values.get('disabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterAddonsConfigNetworkPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterAuthenticatorGroupsConfig", jsii_struct_bases=[], name_mapping={'security_group': 'securityGroup'})
class ContainerClusterAuthenticatorGroupsConfig():
    def __init__(self, *, security_group: str) -> None:
        """
        :param security_group: The name of the RBAC security group for use with Google security groups in Kubernetes RBAC. Group name must be in format gke-security-groups@yourdomain.com.
        """
        self._values = {
            'security_group': security_group,
        }

    @builtins.property
    def security_group(self) -> str:
        """The name of the RBAC security group for use with Google security groups in Kubernetes RBAC.

        Group name must be in format gke-security-groups@yourdomain.com.
        """
        return self._values.get('security_group')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterAuthenticatorGroupsConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterClusterAutoscaling", jsii_struct_bases=[], name_mapping={'enabled': 'enabled', 'auto_provisioning_defaults': 'autoProvisioningDefaults', 'resource_limits': 'resourceLimits'})
class ContainerClusterClusterAutoscaling():
    def __init__(self, *, enabled: bool, auto_provisioning_defaults: typing.Optional[typing.List["ContainerClusterClusterAutoscalingAutoProvisioningDefaults"]]=None, resource_limits: typing.Optional[typing.List["ContainerClusterClusterAutoscalingResourceLimits"]]=None) -> None:
        """
        :param enabled: Whether node auto-provisioning is enabled. Resource limits for cpu and memory must be defined to enable node auto-provisioning.
        :param auto_provisioning_defaults: auto_provisioning_defaults block.
        :param resource_limits: resource_limits block.
        """
        self._values = {
            'enabled': enabled,
        }
        if auto_provisioning_defaults is not None: self._values["auto_provisioning_defaults"] = auto_provisioning_defaults
        if resource_limits is not None: self._values["resource_limits"] = resource_limits

    @builtins.property
    def enabled(self) -> bool:
        """Whether node auto-provisioning is enabled.

        Resource limits for cpu and memory must be defined to enable node auto-provisioning.
        """
        return self._values.get('enabled')

    @builtins.property
    def auto_provisioning_defaults(self) -> typing.Optional[typing.List["ContainerClusterClusterAutoscalingAutoProvisioningDefaults"]]:
        """auto_provisioning_defaults block."""
        return self._values.get('auto_provisioning_defaults')

    @builtins.property
    def resource_limits(self) -> typing.Optional[typing.List["ContainerClusterClusterAutoscalingResourceLimits"]]:
        """resource_limits block."""
        return self._values.get('resource_limits')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterClusterAutoscaling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterClusterAutoscalingAutoProvisioningDefaults", jsii_struct_bases=[], name_mapping={'oauth_scopes': 'oauthScopes', 'service_account': 'serviceAccount'})
class ContainerClusterClusterAutoscalingAutoProvisioningDefaults():
    def __init__(self, *, oauth_scopes: typing.Optional[typing.List[str]]=None, service_account: typing.Optional[str]=None) -> None:
        """
        :param oauth_scopes: Scopes that are used by NAP when creating node pools.
        :param service_account: The Google Cloud Platform Service Account to be used by the node VMs.
        """
        self._values = {
        }
        if oauth_scopes is not None: self._values["oauth_scopes"] = oauth_scopes
        if service_account is not None: self._values["service_account"] = service_account

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[str]]:
        """Scopes that are used by NAP when creating node pools."""
        return self._values.get('oauth_scopes')

    @builtins.property
    def service_account(self) -> typing.Optional[str]:
        """The Google Cloud Platform Service Account to be used by the node VMs."""
        return self._values.get('service_account')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterClusterAutoscalingAutoProvisioningDefaults(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterClusterAutoscalingResourceLimits", jsii_struct_bases=[], name_mapping={'resource_type': 'resourceType', 'maximum': 'maximum', 'minimum': 'minimum'})
class ContainerClusterClusterAutoscalingResourceLimits():
    def __init__(self, *, resource_type: str, maximum: typing.Optional[jsii.Number]=None, minimum: typing.Optional[jsii.Number]=None) -> None:
        """
        :param resource_type: The type of the resource. For example, cpu and memory. See the guide to using Node Auto-Provisioning for a list of types.
        :param maximum: Maximum amount of the resource in the cluster.
        :param minimum: Minimum amount of the resource in the cluster.
        """
        self._values = {
            'resource_type': resource_type,
        }
        if maximum is not None: self._values["maximum"] = maximum
        if minimum is not None: self._values["minimum"] = minimum

    @builtins.property
    def resource_type(self) -> str:
        """The type of the resource.

        For example, cpu and memory. See the guide to using Node Auto-Provisioning for a list of types.
        """
        return self._values.get('resource_type')

    @builtins.property
    def maximum(self) -> typing.Optional[jsii.Number]:
        """Maximum amount of the resource in the cluster."""
        return self._values.get('maximum')

    @builtins.property
    def minimum(self) -> typing.Optional[jsii.Number]:
        """Minimum amount of the resource in the cluster."""
        return self._values.get('minimum')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterClusterAutoscalingResourceLimits(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'additional_zones': 'additionalZones', 'addons_config': 'addonsConfig', 'authenticator_groups_config': 'authenticatorGroupsConfig', 'cluster_autoscaling': 'clusterAutoscaling', 'cluster_ipv4_cidr': 'clusterIpv4Cidr', 'database_encryption': 'databaseEncryption', 'default_max_pods_per_node': 'defaultMaxPodsPerNode', 'description': 'description', 'enable_binary_authorization': 'enableBinaryAuthorization', 'enable_intranode_visibility': 'enableIntranodeVisibility', 'enable_kubernetes_alpha': 'enableKubernetesAlpha', 'enable_legacy_abac': 'enableLegacyAbac', 'enable_shielded_nodes': 'enableShieldedNodes', 'enable_tpu': 'enableTpu', 'initial_node_count': 'initialNodeCount', 'ip_allocation_policy': 'ipAllocationPolicy', 'location': 'location', 'logging_service': 'loggingService', 'maintenance_policy': 'maintenancePolicy', 'master_auth': 'masterAuth', 'master_authorized_networks_config': 'masterAuthorizedNetworksConfig', 'min_master_version': 'minMasterVersion', 'monitoring_service': 'monitoringService', 'network': 'network', 'network_policy': 'networkPolicy', 'node_config': 'nodeConfig', 'node_locations': 'nodeLocations', 'node_pool': 'nodePool', 'node_version': 'nodeVersion', 'pod_security_policy_config': 'podSecurityPolicyConfig', 'private_cluster_config': 'privateClusterConfig', 'project': 'project', 'region': 'region', 'release_channel': 'releaseChannel', 'remove_default_node_pool': 'removeDefaultNodePool', 'resource_labels': 'resourceLabels', 'resource_usage_export_config': 'resourceUsageExportConfig', 'subnetwork': 'subnetwork', 'timeouts': 'timeouts', 'vertical_pod_autoscaling': 'verticalPodAutoscaling', 'workload_identity_config': 'workloadIdentityConfig', 'zone': 'zone'})
class ContainerClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, additional_zones: typing.Optional[typing.List[str]]=None, addons_config: typing.Optional[typing.List["ContainerClusterAddonsConfig"]]=None, authenticator_groups_config: typing.Optional[typing.List["ContainerClusterAuthenticatorGroupsConfig"]]=None, cluster_autoscaling: typing.Optional[typing.List["ContainerClusterClusterAutoscaling"]]=None, cluster_ipv4_cidr: typing.Optional[str]=None, database_encryption: typing.Optional[typing.List["ContainerClusterDatabaseEncryption"]]=None, default_max_pods_per_node: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, enable_binary_authorization: typing.Optional[bool]=None, enable_intranode_visibility: typing.Optional[bool]=None, enable_kubernetes_alpha: typing.Optional[bool]=None, enable_legacy_abac: typing.Optional[bool]=None, enable_shielded_nodes: typing.Optional[bool]=None, enable_tpu: typing.Optional[bool]=None, initial_node_count: typing.Optional[jsii.Number]=None, ip_allocation_policy: typing.Optional[typing.List["ContainerClusterIpAllocationPolicy"]]=None, location: typing.Optional[str]=None, logging_service: typing.Optional[str]=None, maintenance_policy: typing.Optional[typing.List["ContainerClusterMaintenancePolicy"]]=None, master_auth: typing.Optional[typing.List["ContainerClusterMasterAuth"]]=None, master_authorized_networks_config: typing.Optional[typing.List["ContainerClusterMasterAuthorizedNetworksConfig"]]=None, min_master_version: typing.Optional[str]=None, monitoring_service: typing.Optional[str]=None, network: typing.Optional[str]=None, network_policy: typing.Optional[typing.List["ContainerClusterNetworkPolicy"]]=None, node_config: typing.Optional[typing.List["ContainerClusterNodeConfig"]]=None, node_locations: typing.Optional[typing.List[str]]=None, node_pool: typing.Optional[typing.List["ContainerClusterNodePool"]]=None, node_version: typing.Optional[str]=None, pod_security_policy_config: typing.Optional[typing.List["ContainerClusterPodSecurityPolicyConfig"]]=None, private_cluster_config: typing.Optional[typing.List["ContainerClusterPrivateClusterConfig"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, release_channel: typing.Optional[typing.List["ContainerClusterReleaseChannel"]]=None, remove_default_node_pool: typing.Optional[bool]=None, resource_labels: typing.Optional[typing.Mapping[str, str]]=None, resource_usage_export_config: typing.Optional[typing.List["ContainerClusterResourceUsageExportConfig"]]=None, subnetwork: typing.Optional[str]=None, timeouts: typing.Optional["ContainerClusterTimeouts"]=None, vertical_pod_autoscaling: typing.Optional[typing.List["ContainerClusterVerticalPodAutoscaling"]]=None, workload_identity_config: typing.Optional[typing.List["ContainerClusterWorkloadIdentityConfig"]]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the cluster, unique within the project and location.
        :param additional_zones: Additional_zones has been removed in favor of node_locations.
        :param addons_config: addons_config block.
        :param authenticator_groups_config: authenticator_groups_config block.
        :param cluster_autoscaling: cluster_autoscaling block.
        :param cluster_ipv4_cidr: The IP address range of the Kubernetes pods in this cluster in CIDR notation (e.g. 10.96.0.0/14). Leave blank to have one automatically chosen or specify a /14 block in 10.0.0.0/8. This field will only work for routes-based clusters, where ip_allocation_policy is not defined.
        :param database_encryption: database_encryption block.
        :param default_max_pods_per_node: The default maximum number of pods per node in this cluster. This doesn't work on "routes-based" clusters, clusters that don't have IP Aliasing enabled.
        :param description: Description of the cluster.
        :param enable_binary_authorization: Enable Binary Authorization for this cluster. If enabled, all container images will be validated by Google Binary Authorization.
        :param enable_intranode_visibility: Whether Intra-node visibility is enabled for this cluster. This makes same node pod to pod traffic visible for VPC network.
        :param enable_kubernetes_alpha: Whether to enable Kubernetes Alpha features for this cluster. Note that when this option is enabled, the cluster cannot be upgraded and will be automatically deleted after 30 days.
        :param enable_legacy_abac: Whether the ABAC authorizer is enabled for this cluster. When enabled, identities in the system, including service accounts, nodes, and controllers, will have statically granted permissions beyond those provided by the RBAC configuration or IAM. Defaults to false.
        :param enable_shielded_nodes: Enable Shielded Nodes features on all nodes in this cluster. Defaults to false.
        :param enable_tpu: Whether to enable Cloud TPU resources in this cluster.
        :param initial_node_count: The number of nodes to create in this cluster's default node pool. In regional or multi-zonal clusters, this is the number of nodes per zone. Must be set if node_pool is not set. If you're using google_container_node_pool objects with no default node pool, you'll need to set this to a value of at least 1, alongside setting remove_default_node_pool to true.
        :param ip_allocation_policy: ip_allocation_policy block.
        :param location: The location (region or zone) in which the cluster master will be created, as well as the default node location. If you specify a zone (such as us-central1-a), the cluster will be a zonal cluster with a single cluster master. If you specify a region (such as us-west1), the cluster will be a regional cluster with multiple masters spread across zones in the region, and with default node locations in those zones as well.
        :param logging_service: The logging service that the cluster should write logs to. Available options include logging.googleapis.com(Legacy Stackdriver), logging.googleapis.com/kubernetes(Stackdriver Kubernetes Engine Logging), and none. Defaults to logging.googleapis.com/kubernetes.
        :param maintenance_policy: maintenance_policy block.
        :param master_auth: master_auth block.
        :param master_authorized_networks_config: master_authorized_networks_config block.
        :param min_master_version: The minimum version of the master. GKE will auto-update the master to new versions, so this does not guarantee the current master version--use the read-only master_version field to obtain that. If unset, the cluster's version will be set by GKE to the version of the most recent official release (which is not necessarily the latest version).
        :param monitoring_service: The monitoring service that the cluster should write metrics to. Automatically send metrics from pods in the cluster to the Google Cloud Monitoring API. VM metrics will be collected by Google Compute Engine regardless of this setting Available options include monitoring.googleapis.com(Legacy Stackdriver), monitoring.googleapis.com/kubernetes(Stackdriver Kubernetes Engine Monitoring), and none. Defaults to monitoring.googleapis.com/kubernetes.
        :param network: The name or self_link of the Google Compute Engine network to which the cluster is connected. For Shared VPC, set this to the self link of the shared network.
        :param network_policy: network_policy block.
        :param node_config: node_config block.
        :param node_locations: The list of zones in which the cluster's nodes are located. Nodes must be in the region of their regional cluster or in the same region as their cluster's zone for zonal clusters. If this is specified for a zonal cluster, omit the cluster's zone.
        :param node_pool: node_pool block.
        :param node_version: The Kubernetes version on the nodes. Must either be unset or set to the same value as min_master_version on create. Defaults to the default version set by GKE which is not necessarily the latest version. This only affects nodes in the default node pool. While a fuzzy version can be specified, it's recommended that you specify explicit versions as Terraform will see spurious diffs when fuzzy versions are used. See the google_container_engine_versions data source's version_prefix field to approximate fuzzy versions in a Terraform-compatible way. To update nodes in other node pools, use the version attribute on the node pool.
        :param pod_security_policy_config: pod_security_policy_config block.
        :param private_cluster_config: private_cluster_config block.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param region: The region in which the cluster master will be created. Zone and region have been removed in favor of location.
        :param release_channel: release_channel block.
        :param remove_default_node_pool: If true, deletes the default node pool upon cluster creation. If you're using google_container_node_pool resources with no default node pool, this should be set to true, alongside setting initial_node_count to at least 1.
        :param resource_labels: The GCE resource labels (a map of key/value pairs) to be applied to the cluster.
        :param resource_usage_export_config: resource_usage_export_config block.
        :param subnetwork: The name or self_link of the Google Compute Engine subnetwork in which the cluster's instances are launched.
        :param timeouts: timeouts block.
        :param vertical_pod_autoscaling: vertical_pod_autoscaling block.
        :param workload_identity_config: workload_identity_config block.
        :param zone: The zone in which the cluster master will be created. Zone and region have been removed in favor of location.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ContainerClusterTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if additional_zones is not None: self._values["additional_zones"] = additional_zones
        if addons_config is not None: self._values["addons_config"] = addons_config
        if authenticator_groups_config is not None: self._values["authenticator_groups_config"] = authenticator_groups_config
        if cluster_autoscaling is not None: self._values["cluster_autoscaling"] = cluster_autoscaling
        if cluster_ipv4_cidr is not None: self._values["cluster_ipv4_cidr"] = cluster_ipv4_cidr
        if database_encryption is not None: self._values["database_encryption"] = database_encryption
        if default_max_pods_per_node is not None: self._values["default_max_pods_per_node"] = default_max_pods_per_node
        if description is not None: self._values["description"] = description
        if enable_binary_authorization is not None: self._values["enable_binary_authorization"] = enable_binary_authorization
        if enable_intranode_visibility is not None: self._values["enable_intranode_visibility"] = enable_intranode_visibility
        if enable_kubernetes_alpha is not None: self._values["enable_kubernetes_alpha"] = enable_kubernetes_alpha
        if enable_legacy_abac is not None: self._values["enable_legacy_abac"] = enable_legacy_abac
        if enable_shielded_nodes is not None: self._values["enable_shielded_nodes"] = enable_shielded_nodes
        if enable_tpu is not None: self._values["enable_tpu"] = enable_tpu
        if initial_node_count is not None: self._values["initial_node_count"] = initial_node_count
        if ip_allocation_policy is not None: self._values["ip_allocation_policy"] = ip_allocation_policy
        if location is not None: self._values["location"] = location
        if logging_service is not None: self._values["logging_service"] = logging_service
        if maintenance_policy is not None: self._values["maintenance_policy"] = maintenance_policy
        if master_auth is not None: self._values["master_auth"] = master_auth
        if master_authorized_networks_config is not None: self._values["master_authorized_networks_config"] = master_authorized_networks_config
        if min_master_version is not None: self._values["min_master_version"] = min_master_version
        if monitoring_service is not None: self._values["monitoring_service"] = monitoring_service
        if network is not None: self._values["network"] = network
        if network_policy is not None: self._values["network_policy"] = network_policy
        if node_config is not None: self._values["node_config"] = node_config
        if node_locations is not None: self._values["node_locations"] = node_locations
        if node_pool is not None: self._values["node_pool"] = node_pool
        if node_version is not None: self._values["node_version"] = node_version
        if pod_security_policy_config is not None: self._values["pod_security_policy_config"] = pod_security_policy_config
        if private_cluster_config is not None: self._values["private_cluster_config"] = private_cluster_config
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if release_channel is not None: self._values["release_channel"] = release_channel
        if remove_default_node_pool is not None: self._values["remove_default_node_pool"] = remove_default_node_pool
        if resource_labels is not None: self._values["resource_labels"] = resource_labels
        if resource_usage_export_config is not None: self._values["resource_usage_export_config"] = resource_usage_export_config
        if subnetwork is not None: self._values["subnetwork"] = subnetwork
        if timeouts is not None: self._values["timeouts"] = timeouts
        if vertical_pod_autoscaling is not None: self._values["vertical_pod_autoscaling"] = vertical_pod_autoscaling
        if workload_identity_config is not None: self._values["workload_identity_config"] = workload_identity_config
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name of the cluster, unique within the project and location."""
        return self._values.get('name')

    @builtins.property
    def additional_zones(self) -> typing.Optional[typing.List[str]]:
        """Additional_zones has been removed in favor of node_locations."""
        return self._values.get('additional_zones')

    @builtins.property
    def addons_config(self) -> typing.Optional[typing.List["ContainerClusterAddonsConfig"]]:
        """addons_config block."""
        return self._values.get('addons_config')

    @builtins.property
    def authenticator_groups_config(self) -> typing.Optional[typing.List["ContainerClusterAuthenticatorGroupsConfig"]]:
        """authenticator_groups_config block."""
        return self._values.get('authenticator_groups_config')

    @builtins.property
    def cluster_autoscaling(self) -> typing.Optional[typing.List["ContainerClusterClusterAutoscaling"]]:
        """cluster_autoscaling block."""
        return self._values.get('cluster_autoscaling')

    @builtins.property
    def cluster_ipv4_cidr(self) -> typing.Optional[str]:
        """The IP address range of the Kubernetes pods in this cluster in CIDR notation (e.g. 10.96.0.0/14). Leave blank to have one automatically chosen or specify a /14 block in 10.0.0.0/8. This field will only work for routes-based clusters, where ip_allocation_policy is not defined."""
        return self._values.get('cluster_ipv4_cidr')

    @builtins.property
    def database_encryption(self) -> typing.Optional[typing.List["ContainerClusterDatabaseEncryption"]]:
        """database_encryption block."""
        return self._values.get('database_encryption')

    @builtins.property
    def default_max_pods_per_node(self) -> typing.Optional[jsii.Number]:
        """The default maximum number of pods per node in this cluster.

        This doesn't work on "routes-based" clusters, clusters that don't have IP Aliasing enabled.
        """
        return self._values.get('default_max_pods_per_node')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Description of the cluster."""
        return self._values.get('description')

    @builtins.property
    def enable_binary_authorization(self) -> typing.Optional[bool]:
        """Enable Binary Authorization for this cluster.

        If enabled, all container images will be validated by Google Binary Authorization.
        """
        return self._values.get('enable_binary_authorization')

    @builtins.property
    def enable_intranode_visibility(self) -> typing.Optional[bool]:
        """Whether Intra-node visibility is enabled for this cluster.

        This makes same node pod to pod traffic visible for VPC network.
        """
        return self._values.get('enable_intranode_visibility')

    @builtins.property
    def enable_kubernetes_alpha(self) -> typing.Optional[bool]:
        """Whether to enable Kubernetes Alpha features for this cluster.

        Note that when this option is enabled, the cluster cannot be upgraded and will be automatically deleted after 30 days.
        """
        return self._values.get('enable_kubernetes_alpha')

    @builtins.property
    def enable_legacy_abac(self) -> typing.Optional[bool]:
        """Whether the ABAC authorizer is enabled for this cluster.

        When enabled, identities in the system, including service accounts, nodes, and controllers, will have statically granted permissions beyond those provided by the RBAC configuration or IAM. Defaults to false.
        """
        return self._values.get('enable_legacy_abac')

    @builtins.property
    def enable_shielded_nodes(self) -> typing.Optional[bool]:
        """Enable Shielded Nodes features on all nodes in this cluster.

        Defaults to false.
        """
        return self._values.get('enable_shielded_nodes')

    @builtins.property
    def enable_tpu(self) -> typing.Optional[bool]:
        """Whether to enable Cloud TPU resources in this cluster."""
        return self._values.get('enable_tpu')

    @builtins.property
    def initial_node_count(self) -> typing.Optional[jsii.Number]:
        """The number of nodes to create in this cluster's default node pool.

        In regional or multi-zonal clusters, this is the number of nodes per zone. Must be set if node_pool is not set. If you're using google_container_node_pool objects with no default node pool, you'll need to set this to a value of at least 1, alongside setting remove_default_node_pool to true.
        """
        return self._values.get('initial_node_count')

    @builtins.property
    def ip_allocation_policy(self) -> typing.Optional[typing.List["ContainerClusterIpAllocationPolicy"]]:
        """ip_allocation_policy block."""
        return self._values.get('ip_allocation_policy')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """The location (region or zone) in which the cluster master will be created, as well as the default node location.

        If you specify a zone (such as us-central1-a), the cluster will be a zonal cluster with a single cluster master. If you specify a region (such as us-west1), the cluster will be a regional cluster with multiple masters spread across zones in the region, and with default node locations in those zones as well.
        """
        return self._values.get('location')

    @builtins.property
    def logging_service(self) -> typing.Optional[str]:
        """The logging service that the cluster should write logs to.

        Available options include logging.googleapis.com(Legacy Stackdriver), logging.googleapis.com/kubernetes(Stackdriver Kubernetes Engine Logging), and none. Defaults to logging.googleapis.com/kubernetes.
        """
        return self._values.get('logging_service')

    @builtins.property
    def maintenance_policy(self) -> typing.Optional[typing.List["ContainerClusterMaintenancePolicy"]]:
        """maintenance_policy block."""
        return self._values.get('maintenance_policy')

    @builtins.property
    def master_auth(self) -> typing.Optional[typing.List["ContainerClusterMasterAuth"]]:
        """master_auth block."""
        return self._values.get('master_auth')

    @builtins.property
    def master_authorized_networks_config(self) -> typing.Optional[typing.List["ContainerClusterMasterAuthorizedNetworksConfig"]]:
        """master_authorized_networks_config block."""
        return self._values.get('master_authorized_networks_config')

    @builtins.property
    def min_master_version(self) -> typing.Optional[str]:
        """The minimum version of the master.

        GKE will auto-update the master to new versions, so this does not guarantee the current master version--use the read-only master_version field to obtain that. If unset, the cluster's version will be set by GKE to the version of the most recent official release (which is not necessarily the latest version).
        """
        return self._values.get('min_master_version')

    @builtins.property
    def monitoring_service(self) -> typing.Optional[str]:
        """The monitoring service that the cluster should write metrics to.

        Automatically send metrics from pods in the cluster to the Google Cloud Monitoring API. VM metrics will be collected by Google Compute Engine regardless of this setting Available options include monitoring.googleapis.com(Legacy Stackdriver), monitoring.googleapis.com/kubernetes(Stackdriver Kubernetes Engine Monitoring), and none. Defaults to monitoring.googleapis.com/kubernetes.
        """
        return self._values.get('monitoring_service')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """The name or self_link of the Google Compute Engine network to which the cluster is connected.

        For Shared VPC, set this to the self link of the shared network.
        """
        return self._values.get('network')

    @builtins.property
    def network_policy(self) -> typing.Optional[typing.List["ContainerClusterNetworkPolicy"]]:
        """network_policy block."""
        return self._values.get('network_policy')

    @builtins.property
    def node_config(self) -> typing.Optional[typing.List["ContainerClusterNodeConfig"]]:
        """node_config block."""
        return self._values.get('node_config')

    @builtins.property
    def node_locations(self) -> typing.Optional[typing.List[str]]:
        """The list of zones in which the cluster's nodes are located.

        Nodes must be in the region of their regional cluster or in the same region as their cluster's zone for zonal clusters. If this is specified for a zonal cluster, omit the cluster's zone.
        """
        return self._values.get('node_locations')

    @builtins.property
    def node_pool(self) -> typing.Optional[typing.List["ContainerClusterNodePool"]]:
        """node_pool block."""
        return self._values.get('node_pool')

    @builtins.property
    def node_version(self) -> typing.Optional[str]:
        """The Kubernetes version on the nodes.

        Must either be unset or set to the same value as min_master_version on create. Defaults to the default version set by GKE which is not necessarily the latest version. This only affects nodes in the default node pool. While a fuzzy version can be specified, it's recommended that you specify explicit versions as Terraform will see spurious diffs when fuzzy versions are used. See the google_container_engine_versions data source's version_prefix field to approximate fuzzy versions in a Terraform-compatible way. To update nodes in other node pools, use the version attribute on the node pool.
        """
        return self._values.get('node_version')

    @builtins.property
    def pod_security_policy_config(self) -> typing.Optional[typing.List["ContainerClusterPodSecurityPolicyConfig"]]:
        """pod_security_policy_config block."""
        return self._values.get('pod_security_policy_config')

    @builtins.property
    def private_cluster_config(self) -> typing.Optional[typing.List["ContainerClusterPrivateClusterConfig"]]:
        """private_cluster_config block."""
        return self._values.get('private_cluster_config')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The region in which the cluster master will be created.

        Zone and region have been removed in favor of location.
        """
        return self._values.get('region')

    @builtins.property
    def release_channel(self) -> typing.Optional[typing.List["ContainerClusterReleaseChannel"]]:
        """release_channel block."""
        return self._values.get('release_channel')

    @builtins.property
    def remove_default_node_pool(self) -> typing.Optional[bool]:
        """If true, deletes the default node pool upon cluster creation.

        If you're using google_container_node_pool resources with no default node pool, this should be set to true, alongside setting initial_node_count to at least 1.
        """
        return self._values.get('remove_default_node_pool')

    @builtins.property
    def resource_labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """The GCE resource labels (a map of key/value pairs) to be applied to the cluster."""
        return self._values.get('resource_labels')

    @builtins.property
    def resource_usage_export_config(self) -> typing.Optional[typing.List["ContainerClusterResourceUsageExportConfig"]]:
        """resource_usage_export_config block."""
        return self._values.get('resource_usage_export_config')

    @builtins.property
    def subnetwork(self) -> typing.Optional[str]:
        """The name or self_link of the Google Compute Engine subnetwork in which the cluster's instances are launched."""
        return self._values.get('subnetwork')

    @builtins.property
    def timeouts(self) -> typing.Optional["ContainerClusterTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def vertical_pod_autoscaling(self) -> typing.Optional[typing.List["ContainerClusterVerticalPodAutoscaling"]]:
        """vertical_pod_autoscaling block."""
        return self._values.get('vertical_pod_autoscaling')

    @builtins.property
    def workload_identity_config(self) -> typing.Optional[typing.List["ContainerClusterWorkloadIdentityConfig"]]:
        """workload_identity_config block."""
        return self._values.get('workload_identity_config')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The zone in which the cluster master will be created.

        Zone and region have been removed in favor of location.
        """
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterDatabaseEncryption", jsii_struct_bases=[], name_mapping={'state': 'state', 'key_name': 'keyName'})
class ContainerClusterDatabaseEncryption():
    def __init__(self, *, state: str, key_name: typing.Optional[str]=None) -> None:
        """
        :param state: ENCRYPTED or DECRYPTED.
        :param key_name: The key to use to encrypt/decrypt secrets.
        """
        self._values = {
            'state': state,
        }
        if key_name is not None: self._values["key_name"] = key_name

    @builtins.property
    def state(self) -> str:
        """ENCRYPTED or DECRYPTED."""
        return self._values.get('state')

    @builtins.property
    def key_name(self) -> typing.Optional[str]:
        """The key to use to encrypt/decrypt secrets."""
        return self._values.get('key_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterDatabaseEncryption(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterIpAllocationPolicy", jsii_struct_bases=[], name_mapping={'cluster_ipv4_cidr_block': 'clusterIpv4CidrBlock', 'cluster_secondary_range_name': 'clusterSecondaryRangeName', 'node_ipv4_cidr_block': 'nodeIpv4CidrBlock', 'services_ipv4_cidr_block': 'servicesIpv4CidrBlock', 'services_secondary_range_name': 'servicesSecondaryRangeName', 'subnetwork_name': 'subnetworkName'})
class ContainerClusterIpAllocationPolicy():
    def __init__(self, *, cluster_ipv4_cidr_block: typing.Optional[str]=None, cluster_secondary_range_name: typing.Optional[str]=None, node_ipv4_cidr_block: typing.Optional[str]=None, services_ipv4_cidr_block: typing.Optional[str]=None, services_secondary_range_name: typing.Optional[str]=None, subnetwork_name: typing.Optional[str]=None) -> None:
        """
        :param cluster_ipv4_cidr_block: The IP address range for the cluster pod IPs. Set to blank to have a range chosen with the default size. Set to /netmask (e.g. /14) to have a range chosen with a specific netmask. Set to a CIDR notation (e.g. 10.96.0.0/14) from the RFC-1918 private networks (e.g. 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) to pick a specific range to use.
        :param cluster_secondary_range_name: The name of the existing secondary range in the cluster's subnetwork to use for pod IP addresses. Alternatively, cluster_ipv4_cidr_block can be used to automatically create a GKE-managed one.
        :param node_ipv4_cidr_block: 
        :param services_ipv4_cidr_block: The IP address range of the services IPs in this cluster. Set to blank to have a range chosen with the default size. Set to /netmask (e.g. /14) to have a range chosen with a specific netmask. Set to a CIDR notation (e.g. 10.96.0.0/14) from the RFC-1918 private networks (e.g. 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) to pick a specific range to use.
        :param services_secondary_range_name: The name of the existing secondary range in the cluster's subnetwork to use for service ClusterIPs. Alternatively, services_ipv4_cidr_block can be used to automatically create a GKE-managed one.
        :param subnetwork_name: 
        """
        self._values = {
        }
        if cluster_ipv4_cidr_block is not None: self._values["cluster_ipv4_cidr_block"] = cluster_ipv4_cidr_block
        if cluster_secondary_range_name is not None: self._values["cluster_secondary_range_name"] = cluster_secondary_range_name
        if node_ipv4_cidr_block is not None: self._values["node_ipv4_cidr_block"] = node_ipv4_cidr_block
        if services_ipv4_cidr_block is not None: self._values["services_ipv4_cidr_block"] = services_ipv4_cidr_block
        if services_secondary_range_name is not None: self._values["services_secondary_range_name"] = services_secondary_range_name
        if subnetwork_name is not None: self._values["subnetwork_name"] = subnetwork_name

    @builtins.property
    def cluster_ipv4_cidr_block(self) -> typing.Optional[str]:
        """The IP address range for the cluster pod IPs.

        Set to blank to have a range chosen with the default size. Set to /netmask (e.g. /14) to have a range chosen with a specific netmask. Set to a CIDR notation (e.g. 10.96.0.0/14) from the RFC-1918 private networks (e.g. 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) to pick a specific range to use.
        """
        return self._values.get('cluster_ipv4_cidr_block')

    @builtins.property
    def cluster_secondary_range_name(self) -> typing.Optional[str]:
        """The name of the existing secondary range in the cluster's subnetwork to use for pod IP addresses.

        Alternatively, cluster_ipv4_cidr_block can be used to automatically create a GKE-managed one.
        """
        return self._values.get('cluster_secondary_range_name')

    @builtins.property
    def node_ipv4_cidr_block(self) -> typing.Optional[str]:
        return self._values.get('node_ipv4_cidr_block')

    @builtins.property
    def services_ipv4_cidr_block(self) -> typing.Optional[str]:
        """The IP address range of the services IPs in this cluster.

        Set to blank to have a range chosen with the default size. Set to /netmask (e.g. /14) to have a range chosen with a specific netmask. Set to a CIDR notation (e.g. 10.96.0.0/14) from the RFC-1918 private networks (e.g. 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) to pick a specific range to use.
        """
        return self._values.get('services_ipv4_cidr_block')

    @builtins.property
    def services_secondary_range_name(self) -> typing.Optional[str]:
        """The name of the existing secondary range in the cluster's subnetwork to use for service ClusterIPs.

        Alternatively, services_ipv4_cidr_block can be used to automatically create a GKE-managed one.
        """
        return self._values.get('services_secondary_range_name')

    @builtins.property
    def subnetwork_name(self) -> typing.Optional[str]:
        return self._values.get('subnetwork_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterIpAllocationPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterMaintenancePolicy", jsii_struct_bases=[], name_mapping={'daily_maintenance_window': 'dailyMaintenanceWindow', 'recurring_window': 'recurringWindow'})
class ContainerClusterMaintenancePolicy():
    def __init__(self, *, daily_maintenance_window: typing.Optional[typing.List["ContainerClusterMaintenancePolicyDailyMaintenanceWindow"]]=None, recurring_window: typing.Optional[typing.List["ContainerClusterMaintenancePolicyRecurringWindow"]]=None) -> None:
        """
        :param daily_maintenance_window: daily_maintenance_window block.
        :param recurring_window: recurring_window block.
        """
        self._values = {
        }
        if daily_maintenance_window is not None: self._values["daily_maintenance_window"] = daily_maintenance_window
        if recurring_window is not None: self._values["recurring_window"] = recurring_window

    @builtins.property
    def daily_maintenance_window(self) -> typing.Optional[typing.List["ContainerClusterMaintenancePolicyDailyMaintenanceWindow"]]:
        """daily_maintenance_window block."""
        return self._values.get('daily_maintenance_window')

    @builtins.property
    def recurring_window(self) -> typing.Optional[typing.List["ContainerClusterMaintenancePolicyRecurringWindow"]]:
        """recurring_window block."""
        return self._values.get('recurring_window')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterMaintenancePolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterMaintenancePolicyDailyMaintenanceWindow", jsii_struct_bases=[], name_mapping={'start_time': 'startTime'})
class ContainerClusterMaintenancePolicyDailyMaintenanceWindow():
    def __init__(self, *, start_time: str) -> None:
        """
        :param start_time: 
        """
        self._values = {
            'start_time': start_time,
        }

    @builtins.property
    def start_time(self) -> str:
        return self._values.get('start_time')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterMaintenancePolicyDailyMaintenanceWindow(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterMaintenancePolicyRecurringWindow", jsii_struct_bases=[], name_mapping={'end_time': 'endTime', 'recurrence': 'recurrence', 'start_time': 'startTime'})
class ContainerClusterMaintenancePolicyRecurringWindow():
    def __init__(self, *, end_time: str, recurrence: str, start_time: str) -> None:
        """
        :param end_time: 
        :param recurrence: 
        :param start_time: 
        """
        self._values = {
            'end_time': end_time,
            'recurrence': recurrence,
            'start_time': start_time,
        }

    @builtins.property
    def end_time(self) -> str:
        return self._values.get('end_time')

    @builtins.property
    def recurrence(self) -> str:
        return self._values.get('recurrence')

    @builtins.property
    def start_time(self) -> str:
        return self._values.get('start_time')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterMaintenancePolicyRecurringWindow(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterMasterAuth", jsii_struct_bases=[], name_mapping={'client_certificate_config': 'clientCertificateConfig', 'password': 'password', 'username': 'username'})
class ContainerClusterMasterAuth():
    def __init__(self, *, client_certificate_config: typing.Optional[typing.List["ContainerClusterMasterAuthClientCertificateConfig"]]=None, password: typing.Optional[str]=None, username: typing.Optional[str]=None) -> None:
        """
        :param client_certificate_config: client_certificate_config block.
        :param password: The password to use for HTTP basic authentication when accessing the Kubernetes master endpoint.
        :param username: The username to use for HTTP basic authentication when accessing the Kubernetes master endpoint. If not present basic auth will be disabled.
        """
        self._values = {
        }
        if client_certificate_config is not None: self._values["client_certificate_config"] = client_certificate_config
        if password is not None: self._values["password"] = password
        if username is not None: self._values["username"] = username

    @builtins.property
    def client_certificate_config(self) -> typing.Optional[typing.List["ContainerClusterMasterAuthClientCertificateConfig"]]:
        """client_certificate_config block."""
        return self._values.get('client_certificate_config')

    @builtins.property
    def password(self) -> typing.Optional[str]:
        """The password to use for HTTP basic authentication when accessing the Kubernetes master endpoint."""
        return self._values.get('password')

    @builtins.property
    def username(self) -> typing.Optional[str]:
        """The username to use for HTTP basic authentication when accessing the Kubernetes master endpoint.

        If not present basic auth will be disabled.
        """
        return self._values.get('username')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterMasterAuth(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterMasterAuthClientCertificateConfig", jsii_struct_bases=[], name_mapping={'issue_client_certificate': 'issueClientCertificate'})
class ContainerClusterMasterAuthClientCertificateConfig():
    def __init__(self, *, issue_client_certificate: bool) -> None:
        """
        :param issue_client_certificate: Whether client certificate authorization is enabled for this cluster.
        """
        self._values = {
            'issue_client_certificate': issue_client_certificate,
        }

    @builtins.property
    def issue_client_certificate(self) -> bool:
        """Whether client certificate authorization is enabled for this cluster."""
        return self._values.get('issue_client_certificate')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterMasterAuthClientCertificateConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterMasterAuthorizedNetworksConfig", jsii_struct_bases=[], name_mapping={'cidr_blocks': 'cidrBlocks'})
class ContainerClusterMasterAuthorizedNetworksConfig():
    def __init__(self, *, cidr_blocks: typing.Optional[typing.List["ContainerClusterMasterAuthorizedNetworksConfigCidrBlocks"]]=None) -> None:
        """
        :param cidr_blocks: cidr_blocks block.
        """
        self._values = {
        }
        if cidr_blocks is not None: self._values["cidr_blocks"] = cidr_blocks

    @builtins.property
    def cidr_blocks(self) -> typing.Optional[typing.List["ContainerClusterMasterAuthorizedNetworksConfigCidrBlocks"]]:
        """cidr_blocks block."""
        return self._values.get('cidr_blocks')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterMasterAuthorizedNetworksConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterMasterAuthorizedNetworksConfigCidrBlocks", jsii_struct_bases=[], name_mapping={'cidr_block': 'cidrBlock', 'display_name': 'displayName'})
class ContainerClusterMasterAuthorizedNetworksConfigCidrBlocks():
    def __init__(self, *, cidr_block: str, display_name: typing.Optional[str]=None) -> None:
        """
        :param cidr_block: External network that can access Kubernetes master through HTTPS. Must be specified in CIDR notation.
        :param display_name: Field for users to identify CIDR blocks.
        """
        self._values = {
            'cidr_block': cidr_block,
        }
        if display_name is not None: self._values["display_name"] = display_name

    @builtins.property
    def cidr_block(self) -> str:
        """External network that can access Kubernetes master through HTTPS.

        Must be specified in CIDR notation.
        """
        return self._values.get('cidr_block')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """Field for users to identify CIDR blocks."""
        return self._values.get('display_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterMasterAuthorizedNetworksConfigCidrBlocks(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNetworkPolicy", jsii_struct_bases=[], name_mapping={'enabled': 'enabled', 'provider': 'provider'})
class ContainerClusterNetworkPolicy():
    def __init__(self, *, enabled: bool, provider: typing.Optional[str]=None) -> None:
        """
        :param enabled: Whether network policy is enabled on the cluster.
        :param provider: The selected network policy provider. Defaults to PROVIDER_UNSPECIFIED.
        """
        self._values = {
            'enabled': enabled,
        }
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def enabled(self) -> bool:
        """Whether network policy is enabled on the cluster."""
        return self._values.get('enabled')

    @builtins.property
    def provider(self) -> typing.Optional[str]:
        """The selected network policy provider.

        Defaults to PROVIDER_UNSPECIFIED.
        """
        return self._values.get('provider')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNetworkPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodeConfig", jsii_struct_bases=[], name_mapping={'disk_size_gb': 'diskSizeGb', 'disk_type': 'diskType', 'guest_accelerator': 'guestAccelerator', 'image_type': 'imageType', 'labels': 'labels', 'local_ssd_count': 'localSsdCount', 'machine_type': 'machineType', 'metadata': 'metadata', 'min_cpu_platform': 'minCpuPlatform', 'oauth_scopes': 'oauthScopes', 'preemptible': 'preemptible', 'sandbox_config': 'sandboxConfig', 'service_account': 'serviceAccount', 'shielded_instance_config': 'shieldedInstanceConfig', 'tags': 'tags', 'taint': 'taint', 'workload_metadata_config': 'workloadMetadataConfig'})
class ContainerClusterNodeConfig():
    def __init__(self, *, disk_size_gb: typing.Optional[jsii.Number]=None, disk_type: typing.Optional[str]=None, guest_accelerator: typing.Optional[typing.List["ContainerClusterNodeConfigGuestAccelerator"]]=None, image_type: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, local_ssd_count: typing.Optional[jsii.Number]=None, machine_type: typing.Optional[str]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, min_cpu_platform: typing.Optional[str]=None, oauth_scopes: typing.Optional[typing.List[str]]=None, preemptible: typing.Optional[bool]=None, sandbox_config: typing.Optional[typing.List["ContainerClusterNodeConfigSandboxConfig"]]=None, service_account: typing.Optional[str]=None, shielded_instance_config: typing.Optional[typing.List["ContainerClusterNodeConfigShieldedInstanceConfig"]]=None, tags: typing.Optional[typing.List[str]]=None, taint: typing.Optional[typing.List["ContainerClusterNodeConfigTaint"]]=None, workload_metadata_config: typing.Optional[typing.List["ContainerClusterNodeConfigWorkloadMetadataConfig"]]=None) -> None:
        """
        :param disk_size_gb: 
        :param disk_type: 
        :param guest_accelerator: 
        :param image_type: 
        :param labels: 
        :param local_ssd_count: 
        :param machine_type: 
        :param metadata: 
        :param min_cpu_platform: 
        :param oauth_scopes: 
        :param preemptible: 
        :param sandbox_config: sandbox_config block.
        :param service_account: 
        :param shielded_instance_config: shielded_instance_config block.
        :param tags: 
        :param taint: 
        :param workload_metadata_config: workload_metadata_config block.
        """
        self._values = {
        }
        if disk_size_gb is not None: self._values["disk_size_gb"] = disk_size_gb
        if disk_type is not None: self._values["disk_type"] = disk_type
        if guest_accelerator is not None: self._values["guest_accelerator"] = guest_accelerator
        if image_type is not None: self._values["image_type"] = image_type
        if labels is not None: self._values["labels"] = labels
        if local_ssd_count is not None: self._values["local_ssd_count"] = local_ssd_count
        if machine_type is not None: self._values["machine_type"] = machine_type
        if metadata is not None: self._values["metadata"] = metadata
        if min_cpu_platform is not None: self._values["min_cpu_platform"] = min_cpu_platform
        if oauth_scopes is not None: self._values["oauth_scopes"] = oauth_scopes
        if preemptible is not None: self._values["preemptible"] = preemptible
        if sandbox_config is not None: self._values["sandbox_config"] = sandbox_config
        if service_account is not None: self._values["service_account"] = service_account
        if shielded_instance_config is not None: self._values["shielded_instance_config"] = shielded_instance_config
        if tags is not None: self._values["tags"] = tags
        if taint is not None: self._values["taint"] = taint
        if workload_metadata_config is not None: self._values["workload_metadata_config"] = workload_metadata_config

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        return self._values.get('disk_size_gb')

    @builtins.property
    def disk_type(self) -> typing.Optional[str]:
        return self._values.get('disk_type')

    @builtins.property
    def guest_accelerator(self) -> typing.Optional[typing.List["ContainerClusterNodeConfigGuestAccelerator"]]:
        return self._values.get('guest_accelerator')

    @builtins.property
    def image_type(self) -> typing.Optional[str]:
        return self._values.get('image_type')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return self._values.get('labels')

    @builtins.property
    def local_ssd_count(self) -> typing.Optional[jsii.Number]:
        return self._values.get('local_ssd_count')

    @builtins.property
    def machine_type(self) -> typing.Optional[str]:
        return self._values.get('machine_type')

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        return self._values.get('metadata')

    @builtins.property
    def min_cpu_platform(self) -> typing.Optional[str]:
        return self._values.get('min_cpu_platform')

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('oauth_scopes')

    @builtins.property
    def preemptible(self) -> typing.Optional[bool]:
        return self._values.get('preemptible')

    @builtins.property
    def sandbox_config(self) -> typing.Optional[typing.List["ContainerClusterNodeConfigSandboxConfig"]]:
        """sandbox_config block."""
        return self._values.get('sandbox_config')

    @builtins.property
    def service_account(self) -> typing.Optional[str]:
        return self._values.get('service_account')

    @builtins.property
    def shielded_instance_config(self) -> typing.Optional[typing.List["ContainerClusterNodeConfigShieldedInstanceConfig"]]:
        """shielded_instance_config block."""
        return self._values.get('shielded_instance_config')

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('tags')

    @builtins.property
    def taint(self) -> typing.Optional[typing.List["ContainerClusterNodeConfigTaint"]]:
        return self._values.get('taint')

    @builtins.property
    def workload_metadata_config(self) -> typing.Optional[typing.List["ContainerClusterNodeConfigWorkloadMetadataConfig"]]:
        """workload_metadata_config block."""
        return self._values.get('workload_metadata_config')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodeConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodeConfigGuestAccelerator", jsii_struct_bases=[], name_mapping={'count': 'count', 'type': 'type'})
class ContainerClusterNodeConfigGuestAccelerator():
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, type: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param type: 
        """
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if type is not None: self._values["type"] = type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        return self._values.get('count')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodeConfigGuestAccelerator(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodeConfigSandboxConfig", jsii_struct_bases=[], name_mapping={'sandbox_type': 'sandboxType'})
class ContainerClusterNodeConfigSandboxConfig():
    def __init__(self, *, sandbox_type: str) -> None:
        """
        :param sandbox_type: 
        """
        self._values = {
            'sandbox_type': sandbox_type,
        }

    @builtins.property
    def sandbox_type(self) -> str:
        return self._values.get('sandbox_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodeConfigSandboxConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodeConfigShieldedInstanceConfig", jsii_struct_bases=[], name_mapping={'enable_integrity_monitoring': 'enableIntegrityMonitoring', 'enable_secure_boot': 'enableSecureBoot'})
class ContainerClusterNodeConfigShieldedInstanceConfig():
    def __init__(self, *, enable_integrity_monitoring: typing.Optional[bool]=None, enable_secure_boot: typing.Optional[bool]=None) -> None:
        """
        :param enable_integrity_monitoring: 
        :param enable_secure_boot: 
        """
        self._values = {
        }
        if enable_integrity_monitoring is not None: self._values["enable_integrity_monitoring"] = enable_integrity_monitoring
        if enable_secure_boot is not None: self._values["enable_secure_boot"] = enable_secure_boot

    @builtins.property
    def enable_integrity_monitoring(self) -> typing.Optional[bool]:
        return self._values.get('enable_integrity_monitoring')

    @builtins.property
    def enable_secure_boot(self) -> typing.Optional[bool]:
        return self._values.get('enable_secure_boot')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodeConfigShieldedInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodeConfigTaint", jsii_struct_bases=[], name_mapping={'effect': 'effect', 'key': 'key', 'value': 'value'})
class ContainerClusterNodeConfigTaint():
    def __init__(self, *, effect: typing.Optional[str]=None, key: typing.Optional[str]=None, value: typing.Optional[str]=None) -> None:
        """
        :param effect: 
        :param key: 
        :param value: 
        """
        self._values = {
        }
        if effect is not None: self._values["effect"] = effect
        if key is not None: self._values["key"] = key
        if value is not None: self._values["value"] = value

    @builtins.property
    def effect(self) -> typing.Optional[str]:
        return self._values.get('effect')

    @builtins.property
    def key(self) -> typing.Optional[str]:
        return self._values.get('key')

    @builtins.property
    def value(self) -> typing.Optional[str]:
        return self._values.get('value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodeConfigTaint(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodeConfigWorkloadMetadataConfig", jsii_struct_bases=[], name_mapping={'node_metadata': 'nodeMetadata'})
class ContainerClusterNodeConfigWorkloadMetadataConfig():
    def __init__(self, *, node_metadata: str) -> None:
        """
        :param node_metadata: 
        """
        self._values = {
            'node_metadata': node_metadata,
        }

    @builtins.property
    def node_metadata(self) -> str:
        return self._values.get('node_metadata')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodeConfigWorkloadMetadataConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodePool", jsii_struct_bases=[], name_mapping={'autoscaling': 'autoscaling', 'initial_node_count': 'initialNodeCount', 'management': 'management', 'max_pods_per_node': 'maxPodsPerNode', 'name': 'name', 'name_prefix': 'namePrefix', 'node_config': 'nodeConfig', 'node_count': 'nodeCount', 'node_locations': 'nodeLocations', 'upgrade_settings': 'upgradeSettings', 'version': 'version'})
class ContainerClusterNodePool():
    def __init__(self, *, autoscaling: typing.Optional[typing.List["ContainerClusterNodePoolAutoscaling"]]=None, initial_node_count: typing.Optional[jsii.Number]=None, management: typing.Optional[typing.List["ContainerClusterNodePoolManagement"]]=None, max_pods_per_node: typing.Optional[jsii.Number]=None, name: typing.Optional[str]=None, name_prefix: typing.Optional[str]=None, node_config: typing.Optional[typing.List["ContainerClusterNodePoolNodeConfig"]]=None, node_count: typing.Optional[jsii.Number]=None, node_locations: typing.Optional[typing.List[str]]=None, upgrade_settings: typing.Optional[typing.List["ContainerClusterNodePoolUpgradeSettings"]]=None, version: typing.Optional[str]=None) -> None:
        """
        :param autoscaling: autoscaling block.
        :param initial_node_count: The initial number of nodes for the pool. In regional or multi-zonal clusters, this is the number of nodes per zone. Changing this will force recreation of the resource.
        :param management: management block.
        :param max_pods_per_node: The maximum number of pods per node in this node pool. Note that this does not work on node pools which are "route-based" - that is, node pools belonging to clusters that do not have IP Aliasing enabled.
        :param name: The name of the node pool. If left blank, Terraform will auto-generate a unique name.
        :param name_prefix: Creates a unique name for the node pool beginning with the specified prefix. Conflicts with name.
        :param node_config: node_config block.
        :param node_count: The number of nodes per instance group. This field can be used to update the number of nodes per instance group but should not be used alongside autoscaling.
        :param node_locations: The list of zones in which the node pool's nodes should be located. Nodes must be in the region of their regional cluster or in the same region as their cluster's zone for zonal clusters. If unspecified, the cluster-level node_locations will be used.
        :param upgrade_settings: upgrade_settings block.
        :param version: The Kubernetes version for the nodes in this pool. Note that if this field and auto_upgrade are both specified, they will fight each other for what the node version should be, so setting both is highly discouraged. While a fuzzy version can be specified, it's recommended that you specify explicit versions as Terraform will see spurious diffs when fuzzy versions are used. See the google_container_engine_versions data source's version_prefix field to approximate fuzzy versions in a Terraform-compatible way.
        """
        self._values = {
        }
        if autoscaling is not None: self._values["autoscaling"] = autoscaling
        if initial_node_count is not None: self._values["initial_node_count"] = initial_node_count
        if management is not None: self._values["management"] = management
        if max_pods_per_node is not None: self._values["max_pods_per_node"] = max_pods_per_node
        if name is not None: self._values["name"] = name
        if name_prefix is not None: self._values["name_prefix"] = name_prefix
        if node_config is not None: self._values["node_config"] = node_config
        if node_count is not None: self._values["node_count"] = node_count
        if node_locations is not None: self._values["node_locations"] = node_locations
        if upgrade_settings is not None: self._values["upgrade_settings"] = upgrade_settings
        if version is not None: self._values["version"] = version

    @builtins.property
    def autoscaling(self) -> typing.Optional[typing.List["ContainerClusterNodePoolAutoscaling"]]:
        """autoscaling block."""
        return self._values.get('autoscaling')

    @builtins.property
    def initial_node_count(self) -> typing.Optional[jsii.Number]:
        """The initial number of nodes for the pool.

        In regional or multi-zonal clusters, this is the number of nodes per zone. Changing this will force recreation of the resource.
        """
        return self._values.get('initial_node_count')

    @builtins.property
    def management(self) -> typing.Optional[typing.List["ContainerClusterNodePoolManagement"]]:
        """management block."""
        return self._values.get('management')

    @builtins.property
    def max_pods_per_node(self) -> typing.Optional[jsii.Number]:
        """The maximum number of pods per node in this node pool.

        Note that this does not work on node pools which are "route-based" - that is, node pools belonging to clusters that do not have IP Aliasing enabled.
        """
        return self._values.get('max_pods_per_node')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """The name of the node pool.

        If left blank, Terraform will auto-generate a unique name.
        """
        return self._values.get('name')

    @builtins.property
    def name_prefix(self) -> typing.Optional[str]:
        """Creates a unique name for the node pool beginning with the specified prefix.

        Conflicts with name.
        """
        return self._values.get('name_prefix')

    @builtins.property
    def node_config(self) -> typing.Optional[typing.List["ContainerClusterNodePoolNodeConfig"]]:
        """node_config block."""
        return self._values.get('node_config')

    @builtins.property
    def node_count(self) -> typing.Optional[jsii.Number]:
        """The number of nodes per instance group.

        This field can be used to update the number of nodes per instance group but should not be used alongside autoscaling.
        """
        return self._values.get('node_count')

    @builtins.property
    def node_locations(self) -> typing.Optional[typing.List[str]]:
        """The list of zones in which the node pool's nodes should be located.

        Nodes must be in the region of their regional cluster or in the same region as their cluster's zone for zonal clusters. If unspecified, the cluster-level node_locations will be used.
        """
        return self._values.get('node_locations')

    @builtins.property
    def upgrade_settings(self) -> typing.Optional[typing.List["ContainerClusterNodePoolUpgradeSettings"]]:
        """upgrade_settings block."""
        return self._values.get('upgrade_settings')

    @builtins.property
    def version(self) -> typing.Optional[str]:
        """The Kubernetes version for the nodes in this pool.

        Note that if this field and auto_upgrade are both specified, they will fight each other for what the node version should be, so setting both is highly discouraged. While a fuzzy version can be specified, it's recommended that you specify explicit versions as Terraform will see spurious diffs when fuzzy versions are used. See the google_container_engine_versions data source's version_prefix field to approximate fuzzy versions in a Terraform-compatible way.
        """
        return self._values.get('version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodePool(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodePoolAutoscaling", jsii_struct_bases=[], name_mapping={'max_node_count': 'maxNodeCount', 'min_node_count': 'minNodeCount'})
class ContainerClusterNodePoolAutoscaling():
    def __init__(self, *, max_node_count: jsii.Number, min_node_count: jsii.Number) -> None:
        """
        :param max_node_count: Maximum number of nodes in the NodePool. Must be >= min_node_count.
        :param min_node_count: Minimum number of nodes in the NodePool. Must be >=0 and <= max_node_count.
        """
        self._values = {
            'max_node_count': max_node_count,
            'min_node_count': min_node_count,
        }

    @builtins.property
    def max_node_count(self) -> jsii.Number:
        """Maximum number of nodes in the NodePool.

        Must be >= min_node_count.
        """
        return self._values.get('max_node_count')

    @builtins.property
    def min_node_count(self) -> jsii.Number:
        """Minimum number of nodes in the NodePool.

        Must be >=0 and <= max_node_count.
        """
        return self._values.get('min_node_count')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodePoolAutoscaling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodePoolManagement", jsii_struct_bases=[], name_mapping={'auto_repair': 'autoRepair', 'auto_upgrade': 'autoUpgrade'})
class ContainerClusterNodePoolManagement():
    def __init__(self, *, auto_repair: typing.Optional[bool]=None, auto_upgrade: typing.Optional[bool]=None) -> None:
        """
        :param auto_repair: Whether the nodes will be automatically repaired.
        :param auto_upgrade: Whether the nodes will be automatically upgraded.
        """
        self._values = {
        }
        if auto_repair is not None: self._values["auto_repair"] = auto_repair
        if auto_upgrade is not None: self._values["auto_upgrade"] = auto_upgrade

    @builtins.property
    def auto_repair(self) -> typing.Optional[bool]:
        """Whether the nodes will be automatically repaired."""
        return self._values.get('auto_repair')

    @builtins.property
    def auto_upgrade(self) -> typing.Optional[bool]:
        """Whether the nodes will be automatically upgraded."""
        return self._values.get('auto_upgrade')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodePoolManagement(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodePoolNodeConfig", jsii_struct_bases=[], name_mapping={'disk_size_gb': 'diskSizeGb', 'disk_type': 'diskType', 'guest_accelerator': 'guestAccelerator', 'image_type': 'imageType', 'labels': 'labels', 'local_ssd_count': 'localSsdCount', 'machine_type': 'machineType', 'metadata': 'metadata', 'min_cpu_platform': 'minCpuPlatform', 'oauth_scopes': 'oauthScopes', 'preemptible': 'preemptible', 'sandbox_config': 'sandboxConfig', 'service_account': 'serviceAccount', 'shielded_instance_config': 'shieldedInstanceConfig', 'tags': 'tags', 'taint': 'taint', 'workload_metadata_config': 'workloadMetadataConfig'})
class ContainerClusterNodePoolNodeConfig():
    def __init__(self, *, disk_size_gb: typing.Optional[jsii.Number]=None, disk_type: typing.Optional[str]=None, guest_accelerator: typing.Optional[typing.List["ContainerClusterNodePoolNodeConfigGuestAccelerator"]]=None, image_type: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, local_ssd_count: typing.Optional[jsii.Number]=None, machine_type: typing.Optional[str]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, min_cpu_platform: typing.Optional[str]=None, oauth_scopes: typing.Optional[typing.List[str]]=None, preemptible: typing.Optional[bool]=None, sandbox_config: typing.Optional[typing.List["ContainerClusterNodePoolNodeConfigSandboxConfig"]]=None, service_account: typing.Optional[str]=None, shielded_instance_config: typing.Optional[typing.List["ContainerClusterNodePoolNodeConfigShieldedInstanceConfig"]]=None, tags: typing.Optional[typing.List[str]]=None, taint: typing.Optional[typing.List["ContainerClusterNodePoolNodeConfigTaint"]]=None, workload_metadata_config: typing.Optional[typing.List["ContainerClusterNodePoolNodeConfigWorkloadMetadataConfig"]]=None) -> None:
        """
        :param disk_size_gb: 
        :param disk_type: 
        :param guest_accelerator: 
        :param image_type: 
        :param labels: 
        :param local_ssd_count: 
        :param machine_type: 
        :param metadata: 
        :param min_cpu_platform: 
        :param oauth_scopes: 
        :param preemptible: 
        :param sandbox_config: sandbox_config block.
        :param service_account: 
        :param shielded_instance_config: shielded_instance_config block.
        :param tags: 
        :param taint: 
        :param workload_metadata_config: workload_metadata_config block.
        """
        self._values = {
        }
        if disk_size_gb is not None: self._values["disk_size_gb"] = disk_size_gb
        if disk_type is not None: self._values["disk_type"] = disk_type
        if guest_accelerator is not None: self._values["guest_accelerator"] = guest_accelerator
        if image_type is not None: self._values["image_type"] = image_type
        if labels is not None: self._values["labels"] = labels
        if local_ssd_count is not None: self._values["local_ssd_count"] = local_ssd_count
        if machine_type is not None: self._values["machine_type"] = machine_type
        if metadata is not None: self._values["metadata"] = metadata
        if min_cpu_platform is not None: self._values["min_cpu_platform"] = min_cpu_platform
        if oauth_scopes is not None: self._values["oauth_scopes"] = oauth_scopes
        if preemptible is not None: self._values["preemptible"] = preemptible
        if sandbox_config is not None: self._values["sandbox_config"] = sandbox_config
        if service_account is not None: self._values["service_account"] = service_account
        if shielded_instance_config is not None: self._values["shielded_instance_config"] = shielded_instance_config
        if tags is not None: self._values["tags"] = tags
        if taint is not None: self._values["taint"] = taint
        if workload_metadata_config is not None: self._values["workload_metadata_config"] = workload_metadata_config

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        return self._values.get('disk_size_gb')

    @builtins.property
    def disk_type(self) -> typing.Optional[str]:
        return self._values.get('disk_type')

    @builtins.property
    def guest_accelerator(self) -> typing.Optional[typing.List["ContainerClusterNodePoolNodeConfigGuestAccelerator"]]:
        return self._values.get('guest_accelerator')

    @builtins.property
    def image_type(self) -> typing.Optional[str]:
        return self._values.get('image_type')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return self._values.get('labels')

    @builtins.property
    def local_ssd_count(self) -> typing.Optional[jsii.Number]:
        return self._values.get('local_ssd_count')

    @builtins.property
    def machine_type(self) -> typing.Optional[str]:
        return self._values.get('machine_type')

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        return self._values.get('metadata')

    @builtins.property
    def min_cpu_platform(self) -> typing.Optional[str]:
        return self._values.get('min_cpu_platform')

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('oauth_scopes')

    @builtins.property
    def preemptible(self) -> typing.Optional[bool]:
        return self._values.get('preemptible')

    @builtins.property
    def sandbox_config(self) -> typing.Optional[typing.List["ContainerClusterNodePoolNodeConfigSandboxConfig"]]:
        """sandbox_config block."""
        return self._values.get('sandbox_config')

    @builtins.property
    def service_account(self) -> typing.Optional[str]:
        return self._values.get('service_account')

    @builtins.property
    def shielded_instance_config(self) -> typing.Optional[typing.List["ContainerClusterNodePoolNodeConfigShieldedInstanceConfig"]]:
        """shielded_instance_config block."""
        return self._values.get('shielded_instance_config')

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('tags')

    @builtins.property
    def taint(self) -> typing.Optional[typing.List["ContainerClusterNodePoolNodeConfigTaint"]]:
        return self._values.get('taint')

    @builtins.property
    def workload_metadata_config(self) -> typing.Optional[typing.List["ContainerClusterNodePoolNodeConfigWorkloadMetadataConfig"]]:
        """workload_metadata_config block."""
        return self._values.get('workload_metadata_config')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodePoolNodeConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodePoolNodeConfigGuestAccelerator", jsii_struct_bases=[], name_mapping={'count': 'count', 'type': 'type'})
class ContainerClusterNodePoolNodeConfigGuestAccelerator():
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, type: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param type: 
        """
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if type is not None: self._values["type"] = type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        return self._values.get('count')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodePoolNodeConfigGuestAccelerator(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodePoolNodeConfigSandboxConfig", jsii_struct_bases=[], name_mapping={'sandbox_type': 'sandboxType'})
class ContainerClusterNodePoolNodeConfigSandboxConfig():
    def __init__(self, *, sandbox_type: str) -> None:
        """
        :param sandbox_type: 
        """
        self._values = {
            'sandbox_type': sandbox_type,
        }

    @builtins.property
    def sandbox_type(self) -> str:
        return self._values.get('sandbox_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodePoolNodeConfigSandboxConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodePoolNodeConfigShieldedInstanceConfig", jsii_struct_bases=[], name_mapping={'enable_integrity_monitoring': 'enableIntegrityMonitoring', 'enable_secure_boot': 'enableSecureBoot'})
class ContainerClusterNodePoolNodeConfigShieldedInstanceConfig():
    def __init__(self, *, enable_integrity_monitoring: typing.Optional[bool]=None, enable_secure_boot: typing.Optional[bool]=None) -> None:
        """
        :param enable_integrity_monitoring: 
        :param enable_secure_boot: 
        """
        self._values = {
        }
        if enable_integrity_monitoring is not None: self._values["enable_integrity_monitoring"] = enable_integrity_monitoring
        if enable_secure_boot is not None: self._values["enable_secure_boot"] = enable_secure_boot

    @builtins.property
    def enable_integrity_monitoring(self) -> typing.Optional[bool]:
        return self._values.get('enable_integrity_monitoring')

    @builtins.property
    def enable_secure_boot(self) -> typing.Optional[bool]:
        return self._values.get('enable_secure_boot')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodePoolNodeConfigShieldedInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodePoolNodeConfigTaint", jsii_struct_bases=[], name_mapping={'effect': 'effect', 'key': 'key', 'value': 'value'})
class ContainerClusterNodePoolNodeConfigTaint():
    def __init__(self, *, effect: typing.Optional[str]=None, key: typing.Optional[str]=None, value: typing.Optional[str]=None) -> None:
        """
        :param effect: 
        :param key: 
        :param value: 
        """
        self._values = {
        }
        if effect is not None: self._values["effect"] = effect
        if key is not None: self._values["key"] = key
        if value is not None: self._values["value"] = value

    @builtins.property
    def effect(self) -> typing.Optional[str]:
        return self._values.get('effect')

    @builtins.property
    def key(self) -> typing.Optional[str]:
        return self._values.get('key')

    @builtins.property
    def value(self) -> typing.Optional[str]:
        return self._values.get('value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodePoolNodeConfigTaint(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodePoolNodeConfigWorkloadMetadataConfig", jsii_struct_bases=[], name_mapping={'node_metadata': 'nodeMetadata'})
class ContainerClusterNodePoolNodeConfigWorkloadMetadataConfig():
    def __init__(self, *, node_metadata: str) -> None:
        """
        :param node_metadata: 
        """
        self._values = {
            'node_metadata': node_metadata,
        }

    @builtins.property
    def node_metadata(self) -> str:
        return self._values.get('node_metadata')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodePoolNodeConfigWorkloadMetadataConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterNodePoolUpgradeSettings", jsii_struct_bases=[], name_mapping={'max_surge': 'maxSurge', 'max_unavailable': 'maxUnavailable'})
class ContainerClusterNodePoolUpgradeSettings():
    def __init__(self, *, max_surge: jsii.Number, max_unavailable: jsii.Number) -> None:
        """
        :param max_surge: The number of additional nodes that can be added to the node pool during an upgrade. Increasing max_surge raises the number of nodes that can be upgraded simultaneously. Can be set to 0 or greater.
        :param max_unavailable: The number of nodes that can be simultaneously unavailable during an upgrade. Increasing max_unavailable raises the number of nodes that can be upgraded in parallel. Can be set to 0 or greater.
        """
        self._values = {
            'max_surge': max_surge,
            'max_unavailable': max_unavailable,
        }

    @builtins.property
    def max_surge(self) -> jsii.Number:
        """The number of additional nodes that can be added to the node pool during an upgrade.

        Increasing max_surge raises the number of nodes that can be upgraded simultaneously. Can be set to 0 or greater.
        """
        return self._values.get('max_surge')

    @builtins.property
    def max_unavailable(self) -> jsii.Number:
        """The number of nodes that can be simultaneously unavailable during an upgrade.

        Increasing max_unavailable raises the number of nodes that can be upgraded in parallel. Can be set to 0 or greater.
        """
        return self._values.get('max_unavailable')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterNodePoolUpgradeSettings(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterPodSecurityPolicyConfig", jsii_struct_bases=[], name_mapping={'enabled': 'enabled'})
class ContainerClusterPodSecurityPolicyConfig():
    def __init__(self, *, enabled: bool) -> None:
        """
        :param enabled: Enable the PodSecurityPolicy controller for this cluster. If enabled, pods must be valid under a PodSecurityPolicy to be created.
        """
        self._values = {
            'enabled': enabled,
        }

    @builtins.property
    def enabled(self) -> bool:
        """Enable the PodSecurityPolicy controller for this cluster.

        If enabled, pods must be valid under a PodSecurityPolicy to be created.
        """
        return self._values.get('enabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterPodSecurityPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterPrivateClusterConfig", jsii_struct_bases=[], name_mapping={'enable_private_endpoint': 'enablePrivateEndpoint', 'enable_private_nodes': 'enablePrivateNodes', 'master_ipv4_cidr_block': 'masterIpv4CidrBlock'})
class ContainerClusterPrivateClusterConfig():
    def __init__(self, *, enable_private_endpoint: bool, enable_private_nodes: typing.Optional[bool]=None, master_ipv4_cidr_block: typing.Optional[str]=None) -> None:
        """
        :param enable_private_endpoint: Enables the private cluster feature, creating a private endpoint on the cluster. In a private cluster, nodes only have RFC 1918 private addresses and communicate with the master's private endpoint via private networking.
        :param enable_private_nodes: When true, the cluster's private endpoint is used as the cluster endpoint and access through the public endpoint is disabled. When false, either endpoint can be used. This field only applies to private clusters, when enable_private_nodes is true.
        :param master_ipv4_cidr_block: The IP range in CIDR notation to use for the hosted master network. This range will be used for assigning private IP addresses to the cluster master(s) and the ILB VIP. This range must not overlap with any other ranges in use within the cluster's network, and it must be a /28 subnet. See Private Cluster Limitations for more details. This field only applies to private clusters, when enable_private_nodes is true.
        """
        self._values = {
            'enable_private_endpoint': enable_private_endpoint,
        }
        if enable_private_nodes is not None: self._values["enable_private_nodes"] = enable_private_nodes
        if master_ipv4_cidr_block is not None: self._values["master_ipv4_cidr_block"] = master_ipv4_cidr_block

    @builtins.property
    def enable_private_endpoint(self) -> bool:
        """Enables the private cluster feature, creating a private endpoint on the cluster.

        In a private cluster, nodes only have RFC 1918 private addresses and communicate with the master's private endpoint via private networking.
        """
        return self._values.get('enable_private_endpoint')

    @builtins.property
    def enable_private_nodes(self) -> typing.Optional[bool]:
        """When true, the cluster's private endpoint is used as the cluster endpoint and access through the public endpoint is disabled.

        When false, either endpoint can be used. This field only applies to private clusters, when enable_private_nodes is true.
        """
        return self._values.get('enable_private_nodes')

    @builtins.property
    def master_ipv4_cidr_block(self) -> typing.Optional[str]:
        """The IP range in CIDR notation to use for the hosted master network.

        This range will be used for assigning private IP addresses to the cluster master(s) and the ILB VIP. This range must not overlap with any other ranges in use within the cluster's network, and it must be a /28 subnet. See Private Cluster Limitations for more details. This field only applies to private clusters, when enable_private_nodes is true.
        """
        return self._values.get('master_ipv4_cidr_block')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterPrivateClusterConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterReleaseChannel", jsii_struct_bases=[], name_mapping={'channel': 'channel'})
class ContainerClusterReleaseChannel():
    def __init__(self, *, channel: str) -> None:
        """
        :param channel: The selected release channel.
        """
        self._values = {
            'channel': channel,
        }

    @builtins.property
    def channel(self) -> str:
        """The selected release channel."""
        return self._values.get('channel')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterReleaseChannel(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterResourceUsageExportConfig", jsii_struct_bases=[], name_mapping={'bigquery_destination': 'bigqueryDestination', 'enable_network_egress_metering': 'enableNetworkEgressMetering', 'enable_resource_consumption_metering': 'enableResourceConsumptionMetering'})
class ContainerClusterResourceUsageExportConfig():
    def __init__(self, *, bigquery_destination: typing.List["ContainerClusterResourceUsageExportConfigBigqueryDestination"], enable_network_egress_metering: typing.Optional[bool]=None, enable_resource_consumption_metering: typing.Optional[bool]=None) -> None:
        """
        :param bigquery_destination: bigquery_destination block.
        :param enable_network_egress_metering: Whether to enable network egress metering for this cluster. If enabled, a daemonset will be created in the cluster to meter network egress traffic.
        :param enable_resource_consumption_metering: Whether to enable resource consumption metering on this cluster. When enabled, a table will be created in the resource export BigQuery dataset to store resource consumption data. The resulting table can be joined with the resource usage table or with BigQuery billing export. Defaults to true.
        """
        self._values = {
            'bigquery_destination': bigquery_destination,
        }
        if enable_network_egress_metering is not None: self._values["enable_network_egress_metering"] = enable_network_egress_metering
        if enable_resource_consumption_metering is not None: self._values["enable_resource_consumption_metering"] = enable_resource_consumption_metering

    @builtins.property
    def bigquery_destination(self) -> typing.List["ContainerClusterResourceUsageExportConfigBigqueryDestination"]:
        """bigquery_destination block."""
        return self._values.get('bigquery_destination')

    @builtins.property
    def enable_network_egress_metering(self) -> typing.Optional[bool]:
        """Whether to enable network egress metering for this cluster.

        If enabled, a daemonset will be created in the cluster to meter network egress traffic.
        """
        return self._values.get('enable_network_egress_metering')

    @builtins.property
    def enable_resource_consumption_metering(self) -> typing.Optional[bool]:
        """Whether to enable resource consumption metering on this cluster.

        When enabled, a table will be created in the resource export BigQuery dataset to store resource consumption data. The resulting table can be joined with the resource usage table or with BigQuery billing export. Defaults to true.
        """
        return self._values.get('enable_resource_consumption_metering')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterResourceUsageExportConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterResourceUsageExportConfigBigqueryDestination", jsii_struct_bases=[], name_mapping={'dataset_id': 'datasetId'})
class ContainerClusterResourceUsageExportConfigBigqueryDestination():
    def __init__(self, *, dataset_id: str) -> None:
        """
        :param dataset_id: The ID of a BigQuery Dataset.
        """
        self._values = {
            'dataset_id': dataset_id,
        }

    @builtins.property
    def dataset_id(self) -> str:
        """The ID of a BigQuery Dataset."""
        return self._values.get('dataset_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterResourceUsageExportConfigBigqueryDestination(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'read': 'read', 'update': 'update'})
class ContainerClusterTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, read: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param read: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if read is not None: self._values["read"] = read
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def read(self) -> typing.Optional[str]:
        return self._values.get('read')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterVerticalPodAutoscaling", jsii_struct_bases=[], name_mapping={'enabled': 'enabled'})
class ContainerClusterVerticalPodAutoscaling():
    def __init__(self, *, enabled: bool) -> None:
        """
        :param enabled: Enables vertical pod autoscaling.
        """
        self._values = {
            'enabled': enabled,
        }

    @builtins.property
    def enabled(self) -> bool:
        """Enables vertical pod autoscaling."""
        return self._values.get('enabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterVerticalPodAutoscaling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerClusterWorkloadIdentityConfig", jsii_struct_bases=[], name_mapping={'identity_namespace': 'identityNamespace'})
class ContainerClusterWorkloadIdentityConfig():
    def __init__(self, *, identity_namespace: str) -> None:
        """
        :param identity_namespace: 
        """
        self._values = {
            'identity_namespace': identity_namespace,
        }

    @builtins.property
    def identity_namespace(self) -> str:
        return self._values.get('identity_namespace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerClusterWorkloadIdentityConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ContainerNodePool(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ContainerNodePool"):
    def __init__(self, scope: constructs.Construct, id: str, *, cluster: str, autoscaling: typing.Optional[typing.List["ContainerNodePoolAutoscaling"]]=None, initial_node_count: typing.Optional[jsii.Number]=None, location: typing.Optional[str]=None, management: typing.Optional[typing.List["ContainerNodePoolManagement"]]=None, max_pods_per_node: typing.Optional[jsii.Number]=None, name: typing.Optional[str]=None, name_prefix: typing.Optional[str]=None, node_config: typing.Optional[typing.List["ContainerNodePoolNodeConfig"]]=None, node_count: typing.Optional[jsii.Number]=None, node_locations: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ContainerNodePoolTimeouts"]=None, upgrade_settings: typing.Optional[typing.List["ContainerNodePoolUpgradeSettings"]]=None, version: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster: The cluster to create the node pool for. Cluster must be present in location provided for zonal clusters.
        :param autoscaling: autoscaling block.
        :param initial_node_count: The initial number of nodes for the pool. In regional or multi-zonal clusters, this is the number of nodes per zone. Changing this will force recreation of the resource.
        :param location: The location (region or zone) of the cluster.
        :param management: management block.
        :param max_pods_per_node: The maximum number of pods per node in this node pool. Note that this does not work on node pools which are "route-based" - that is, node pools belonging to clusters that do not have IP Aliasing enabled.
        :param name: The name of the node pool. If left blank, Terraform will auto-generate a unique name.
        :param name_prefix: Creates a unique name for the node pool beginning with the specified prefix. Conflicts with name.
        :param node_config: node_config block.
        :param node_count: The number of nodes per instance group. This field can be used to update the number of nodes per instance group but should not be used alongside autoscaling.
        :param node_locations: The list of zones in which the node pool's nodes should be located. Nodes must be in the region of their regional cluster or in the same region as their cluster's zone for zonal clusters. If unspecified, the cluster-level node_locations will be used.
        :param project: The ID of the project in which to create the node pool. If blank, the provider-configured project will be used.
        :param region: The region of the cluster.
        :param timeouts: timeouts block.
        :param upgrade_settings: upgrade_settings block.
        :param version: The Kubernetes version for the nodes in this pool. Note that if this field and auto_upgrade are both specified, they will fight each other for what the node version should be, so setting both is highly discouraged. While a fuzzy version can be specified, it's recommended that you specify explicit versions as Terraform will see spurious diffs when fuzzy versions are used. See the google_container_engine_versions data source's version_prefix field to approximate fuzzy versions in a Terraform-compatible way.
        :param zone: The zone of the cluster.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ContainerNodePoolConfig(cluster=cluster, autoscaling=autoscaling, initial_node_count=initial_node_count, location=location, management=management, max_pods_per_node=max_pods_per_node, name=name, name_prefix=name_prefix, node_config=node_config, node_count=node_count, node_locations=node_locations, project=project, region=region, timeouts=timeouts, upgrade_settings=upgrade_settings, version=version, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ContainerNodePool, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="instanceGroupUrls")
    def instance_group_urls(self) -> typing.List[str]:
        return jsii.get(self, "instanceGroupUrls")

    @builtins.property
    @jsii.member(jsii_name="cluster")
    def cluster(self) -> str:
        return jsii.get(self, "cluster")

    @cluster.setter
    def cluster(self, value: str) -> None:
        jsii.set(self, "cluster", value)

    @builtins.property
    @jsii.member(jsii_name="autoscaling")
    def autoscaling(self) -> typing.Optional[typing.List["ContainerNodePoolAutoscaling"]]:
        return jsii.get(self, "autoscaling")

    @autoscaling.setter
    def autoscaling(self, value: typing.Optional[typing.List["ContainerNodePoolAutoscaling"]]) -> None:
        jsii.set(self, "autoscaling", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="initialNodeCount")
    def initial_node_count(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "initialNodeCount")

    @initial_node_count.setter
    def initial_node_count(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "initialNodeCount", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="management")
    def management(self) -> typing.Optional[typing.List["ContainerNodePoolManagement"]]:
        return jsii.get(self, "management")

    @management.setter
    def management(self, value: typing.Optional[typing.List["ContainerNodePoolManagement"]]) -> None:
        jsii.set(self, "management", value)

    @builtins.property
    @jsii.member(jsii_name="maxPodsPerNode")
    def max_pods_per_node(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxPodsPerNode")

    @max_pods_per_node.setter
    def max_pods_per_node(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "maxPodsPerNode", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="namePrefix")
    def name_prefix(self) -> typing.Optional[str]:
        return jsii.get(self, "namePrefix")

    @name_prefix.setter
    def name_prefix(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "namePrefix", value)

    @builtins.property
    @jsii.member(jsii_name="nodeConfig")
    def node_config(self) -> typing.Optional[typing.List["ContainerNodePoolNodeConfig"]]:
        return jsii.get(self, "nodeConfig")

    @node_config.setter
    def node_config(self, value: typing.Optional[typing.List["ContainerNodePoolNodeConfig"]]) -> None:
        jsii.set(self, "nodeConfig", value)

    @builtins.property
    @jsii.member(jsii_name="nodeCount")
    def node_count(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "nodeCount")

    @node_count.setter
    def node_count(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "nodeCount", value)

    @builtins.property
    @jsii.member(jsii_name="nodeLocations")
    def node_locations(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "nodeLocations")

    @node_locations.setter
    def node_locations(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "nodeLocations", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ContainerNodePoolTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ContainerNodePoolTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="upgradeSettings")
    def upgrade_settings(self) -> typing.Optional[typing.List["ContainerNodePoolUpgradeSettings"]]:
        return jsii.get(self, "upgradeSettings")

    @upgrade_settings.setter
    def upgrade_settings(self, value: typing.Optional[typing.List["ContainerNodePoolUpgradeSettings"]]) -> None:
        jsii.set(self, "upgradeSettings", value)

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> typing.Optional[str]:
        return jsii.get(self, "version")

    @version.setter
    def version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "version", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerNodePoolAutoscaling", jsii_struct_bases=[], name_mapping={'max_node_count': 'maxNodeCount', 'min_node_count': 'minNodeCount'})
class ContainerNodePoolAutoscaling():
    def __init__(self, *, max_node_count: jsii.Number, min_node_count: jsii.Number) -> None:
        """
        :param max_node_count: Maximum number of nodes in the NodePool. Must be >= min_node_count.
        :param min_node_count: Minimum number of nodes in the NodePool. Must be >=0 and <= max_node_count.
        """
        self._values = {
            'max_node_count': max_node_count,
            'min_node_count': min_node_count,
        }

    @builtins.property
    def max_node_count(self) -> jsii.Number:
        """Maximum number of nodes in the NodePool.

        Must be >= min_node_count.
        """
        return self._values.get('max_node_count')

    @builtins.property
    def min_node_count(self) -> jsii.Number:
        """Minimum number of nodes in the NodePool.

        Must be >=0 and <= max_node_count.
        """
        return self._values.get('min_node_count')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerNodePoolAutoscaling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerNodePoolConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'cluster': 'cluster', 'autoscaling': 'autoscaling', 'initial_node_count': 'initialNodeCount', 'location': 'location', 'management': 'management', 'max_pods_per_node': 'maxPodsPerNode', 'name': 'name', 'name_prefix': 'namePrefix', 'node_config': 'nodeConfig', 'node_count': 'nodeCount', 'node_locations': 'nodeLocations', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts', 'upgrade_settings': 'upgradeSettings', 'version': 'version', 'zone': 'zone'})
class ContainerNodePoolConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, cluster: str, autoscaling: typing.Optional[typing.List["ContainerNodePoolAutoscaling"]]=None, initial_node_count: typing.Optional[jsii.Number]=None, location: typing.Optional[str]=None, management: typing.Optional[typing.List["ContainerNodePoolManagement"]]=None, max_pods_per_node: typing.Optional[jsii.Number]=None, name: typing.Optional[str]=None, name_prefix: typing.Optional[str]=None, node_config: typing.Optional[typing.List["ContainerNodePoolNodeConfig"]]=None, node_count: typing.Optional[jsii.Number]=None, node_locations: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["ContainerNodePoolTimeouts"]=None, upgrade_settings: typing.Optional[typing.List["ContainerNodePoolUpgradeSettings"]]=None, version: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster: The cluster to create the node pool for. Cluster must be present in location provided for zonal clusters.
        :param autoscaling: autoscaling block.
        :param initial_node_count: The initial number of nodes for the pool. In regional or multi-zonal clusters, this is the number of nodes per zone. Changing this will force recreation of the resource.
        :param location: The location (region or zone) of the cluster.
        :param management: management block.
        :param max_pods_per_node: The maximum number of pods per node in this node pool. Note that this does not work on node pools which are "route-based" - that is, node pools belonging to clusters that do not have IP Aliasing enabled.
        :param name: The name of the node pool. If left blank, Terraform will auto-generate a unique name.
        :param name_prefix: Creates a unique name for the node pool beginning with the specified prefix. Conflicts with name.
        :param node_config: node_config block.
        :param node_count: The number of nodes per instance group. This field can be used to update the number of nodes per instance group but should not be used alongside autoscaling.
        :param node_locations: The list of zones in which the node pool's nodes should be located. Nodes must be in the region of their regional cluster or in the same region as their cluster's zone for zonal clusters. If unspecified, the cluster-level node_locations will be used.
        :param project: The ID of the project in which to create the node pool. If blank, the provider-configured project will be used.
        :param region: The region of the cluster.
        :param timeouts: timeouts block.
        :param upgrade_settings: upgrade_settings block.
        :param version: The Kubernetes version for the nodes in this pool. Note that if this field and auto_upgrade are both specified, they will fight each other for what the node version should be, so setting both is highly discouraged. While a fuzzy version can be specified, it's recommended that you specify explicit versions as Terraform will see spurious diffs when fuzzy versions are used. See the google_container_engine_versions data source's version_prefix field to approximate fuzzy versions in a Terraform-compatible way.
        :param zone: The zone of the cluster.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ContainerNodePoolTimeouts(**timeouts)
        self._values = {
            'cluster': cluster,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if autoscaling is not None: self._values["autoscaling"] = autoscaling
        if initial_node_count is not None: self._values["initial_node_count"] = initial_node_count
        if location is not None: self._values["location"] = location
        if management is not None: self._values["management"] = management
        if max_pods_per_node is not None: self._values["max_pods_per_node"] = max_pods_per_node
        if name is not None: self._values["name"] = name
        if name_prefix is not None: self._values["name_prefix"] = name_prefix
        if node_config is not None: self._values["node_config"] = node_config
        if node_count is not None: self._values["node_count"] = node_count
        if node_locations is not None: self._values["node_locations"] = node_locations
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts
        if upgrade_settings is not None: self._values["upgrade_settings"] = upgrade_settings
        if version is not None: self._values["version"] = version
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def cluster(self) -> str:
        """The cluster to create the node pool for.

        Cluster must be present in location provided for zonal clusters.
        """
        return self._values.get('cluster')

    @builtins.property
    def autoscaling(self) -> typing.Optional[typing.List["ContainerNodePoolAutoscaling"]]:
        """autoscaling block."""
        return self._values.get('autoscaling')

    @builtins.property
    def initial_node_count(self) -> typing.Optional[jsii.Number]:
        """The initial number of nodes for the pool.

        In regional or multi-zonal clusters, this is the number of nodes per zone. Changing this will force recreation of the resource.
        """
        return self._values.get('initial_node_count')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """The location (region or zone) of the cluster."""
        return self._values.get('location')

    @builtins.property
    def management(self) -> typing.Optional[typing.List["ContainerNodePoolManagement"]]:
        """management block."""
        return self._values.get('management')

    @builtins.property
    def max_pods_per_node(self) -> typing.Optional[jsii.Number]:
        """The maximum number of pods per node in this node pool.

        Note that this does not work on node pools which are "route-based" - that is, node pools belonging to clusters that do not have IP Aliasing enabled.
        """
        return self._values.get('max_pods_per_node')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """The name of the node pool.

        If left blank, Terraform will auto-generate a unique name.
        """
        return self._values.get('name')

    @builtins.property
    def name_prefix(self) -> typing.Optional[str]:
        """Creates a unique name for the node pool beginning with the specified prefix.

        Conflicts with name.
        """
        return self._values.get('name_prefix')

    @builtins.property
    def node_config(self) -> typing.Optional[typing.List["ContainerNodePoolNodeConfig"]]:
        """node_config block."""
        return self._values.get('node_config')

    @builtins.property
    def node_count(self) -> typing.Optional[jsii.Number]:
        """The number of nodes per instance group.

        This field can be used to update the number of nodes per instance group but should not be used alongside autoscaling.
        """
        return self._values.get('node_count')

    @builtins.property
    def node_locations(self) -> typing.Optional[typing.List[str]]:
        """The list of zones in which the node pool's nodes should be located.

        Nodes must be in the region of their regional cluster or in the same region as their cluster's zone for zonal clusters. If unspecified, the cluster-level node_locations will be used.
        """
        return self._values.get('node_locations')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which to create the node pool.

        If blank, the provider-configured project will be used.
        """
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The region of the cluster."""
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["ContainerNodePoolTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def upgrade_settings(self) -> typing.Optional[typing.List["ContainerNodePoolUpgradeSettings"]]:
        """upgrade_settings block."""
        return self._values.get('upgrade_settings')

    @builtins.property
    def version(self) -> typing.Optional[str]:
        """The Kubernetes version for the nodes in this pool.

        Note that if this field and auto_upgrade are both specified, they will fight each other for what the node version should be, so setting both is highly discouraged. While a fuzzy version can be specified, it's recommended that you specify explicit versions as Terraform will see spurious diffs when fuzzy versions are used. See the google_container_engine_versions data source's version_prefix field to approximate fuzzy versions in a Terraform-compatible way.
        """
        return self._values.get('version')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The zone of the cluster."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerNodePoolConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerNodePoolManagement", jsii_struct_bases=[], name_mapping={'auto_repair': 'autoRepair', 'auto_upgrade': 'autoUpgrade'})
class ContainerNodePoolManagement():
    def __init__(self, *, auto_repair: typing.Optional[bool]=None, auto_upgrade: typing.Optional[bool]=None) -> None:
        """
        :param auto_repair: Whether the nodes will be automatically repaired.
        :param auto_upgrade: Whether the nodes will be automatically upgraded.
        """
        self._values = {
        }
        if auto_repair is not None: self._values["auto_repair"] = auto_repair
        if auto_upgrade is not None: self._values["auto_upgrade"] = auto_upgrade

    @builtins.property
    def auto_repair(self) -> typing.Optional[bool]:
        """Whether the nodes will be automatically repaired."""
        return self._values.get('auto_repair')

    @builtins.property
    def auto_upgrade(self) -> typing.Optional[bool]:
        """Whether the nodes will be automatically upgraded."""
        return self._values.get('auto_upgrade')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerNodePoolManagement(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerNodePoolNodeConfig", jsii_struct_bases=[], name_mapping={'disk_size_gb': 'diskSizeGb', 'disk_type': 'diskType', 'guest_accelerator': 'guestAccelerator', 'image_type': 'imageType', 'labels': 'labels', 'local_ssd_count': 'localSsdCount', 'machine_type': 'machineType', 'metadata': 'metadata', 'min_cpu_platform': 'minCpuPlatform', 'oauth_scopes': 'oauthScopes', 'preemptible': 'preemptible', 'sandbox_config': 'sandboxConfig', 'service_account': 'serviceAccount', 'shielded_instance_config': 'shieldedInstanceConfig', 'tags': 'tags', 'taint': 'taint', 'workload_metadata_config': 'workloadMetadataConfig'})
class ContainerNodePoolNodeConfig():
    def __init__(self, *, disk_size_gb: typing.Optional[jsii.Number]=None, disk_type: typing.Optional[str]=None, guest_accelerator: typing.Optional[typing.List["ContainerNodePoolNodeConfigGuestAccelerator"]]=None, image_type: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, local_ssd_count: typing.Optional[jsii.Number]=None, machine_type: typing.Optional[str]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, min_cpu_platform: typing.Optional[str]=None, oauth_scopes: typing.Optional[typing.List[str]]=None, preemptible: typing.Optional[bool]=None, sandbox_config: typing.Optional[typing.List["ContainerNodePoolNodeConfigSandboxConfig"]]=None, service_account: typing.Optional[str]=None, shielded_instance_config: typing.Optional[typing.List["ContainerNodePoolNodeConfigShieldedInstanceConfig"]]=None, tags: typing.Optional[typing.List[str]]=None, taint: typing.Optional[typing.List["ContainerNodePoolNodeConfigTaint"]]=None, workload_metadata_config: typing.Optional[typing.List["ContainerNodePoolNodeConfigWorkloadMetadataConfig"]]=None) -> None:
        """
        :param disk_size_gb: 
        :param disk_type: 
        :param guest_accelerator: 
        :param image_type: 
        :param labels: 
        :param local_ssd_count: 
        :param machine_type: 
        :param metadata: 
        :param min_cpu_platform: 
        :param oauth_scopes: 
        :param preemptible: 
        :param sandbox_config: sandbox_config block.
        :param service_account: 
        :param shielded_instance_config: shielded_instance_config block.
        :param tags: 
        :param taint: 
        :param workload_metadata_config: workload_metadata_config block.
        """
        self._values = {
        }
        if disk_size_gb is not None: self._values["disk_size_gb"] = disk_size_gb
        if disk_type is not None: self._values["disk_type"] = disk_type
        if guest_accelerator is not None: self._values["guest_accelerator"] = guest_accelerator
        if image_type is not None: self._values["image_type"] = image_type
        if labels is not None: self._values["labels"] = labels
        if local_ssd_count is not None: self._values["local_ssd_count"] = local_ssd_count
        if machine_type is not None: self._values["machine_type"] = machine_type
        if metadata is not None: self._values["metadata"] = metadata
        if min_cpu_platform is not None: self._values["min_cpu_platform"] = min_cpu_platform
        if oauth_scopes is not None: self._values["oauth_scopes"] = oauth_scopes
        if preemptible is not None: self._values["preemptible"] = preemptible
        if sandbox_config is not None: self._values["sandbox_config"] = sandbox_config
        if service_account is not None: self._values["service_account"] = service_account
        if shielded_instance_config is not None: self._values["shielded_instance_config"] = shielded_instance_config
        if tags is not None: self._values["tags"] = tags
        if taint is not None: self._values["taint"] = taint
        if workload_metadata_config is not None: self._values["workload_metadata_config"] = workload_metadata_config

    @builtins.property
    def disk_size_gb(self) -> typing.Optional[jsii.Number]:
        return self._values.get('disk_size_gb')

    @builtins.property
    def disk_type(self) -> typing.Optional[str]:
        return self._values.get('disk_type')

    @builtins.property
    def guest_accelerator(self) -> typing.Optional[typing.List["ContainerNodePoolNodeConfigGuestAccelerator"]]:
        return self._values.get('guest_accelerator')

    @builtins.property
    def image_type(self) -> typing.Optional[str]:
        return self._values.get('image_type')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return self._values.get('labels')

    @builtins.property
    def local_ssd_count(self) -> typing.Optional[jsii.Number]:
        return self._values.get('local_ssd_count')

    @builtins.property
    def machine_type(self) -> typing.Optional[str]:
        return self._values.get('machine_type')

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        return self._values.get('metadata')

    @builtins.property
    def min_cpu_platform(self) -> typing.Optional[str]:
        return self._values.get('min_cpu_platform')

    @builtins.property
    def oauth_scopes(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('oauth_scopes')

    @builtins.property
    def preemptible(self) -> typing.Optional[bool]:
        return self._values.get('preemptible')

    @builtins.property
    def sandbox_config(self) -> typing.Optional[typing.List["ContainerNodePoolNodeConfigSandboxConfig"]]:
        """sandbox_config block."""
        return self._values.get('sandbox_config')

    @builtins.property
    def service_account(self) -> typing.Optional[str]:
        return self._values.get('service_account')

    @builtins.property
    def shielded_instance_config(self) -> typing.Optional[typing.List["ContainerNodePoolNodeConfigShieldedInstanceConfig"]]:
        """shielded_instance_config block."""
        return self._values.get('shielded_instance_config')

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('tags')

    @builtins.property
    def taint(self) -> typing.Optional[typing.List["ContainerNodePoolNodeConfigTaint"]]:
        return self._values.get('taint')

    @builtins.property
    def workload_metadata_config(self) -> typing.Optional[typing.List["ContainerNodePoolNodeConfigWorkloadMetadataConfig"]]:
        """workload_metadata_config block."""
        return self._values.get('workload_metadata_config')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerNodePoolNodeConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerNodePoolNodeConfigGuestAccelerator", jsii_struct_bases=[], name_mapping={'count': 'count', 'type': 'type'})
class ContainerNodePoolNodeConfigGuestAccelerator():
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, type: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param type: 
        """
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if type is not None: self._values["type"] = type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        return self._values.get('count')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerNodePoolNodeConfigGuestAccelerator(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerNodePoolNodeConfigSandboxConfig", jsii_struct_bases=[], name_mapping={'sandbox_type': 'sandboxType'})
class ContainerNodePoolNodeConfigSandboxConfig():
    def __init__(self, *, sandbox_type: str) -> None:
        """
        :param sandbox_type: 
        """
        self._values = {
            'sandbox_type': sandbox_type,
        }

    @builtins.property
    def sandbox_type(self) -> str:
        return self._values.get('sandbox_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerNodePoolNodeConfigSandboxConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerNodePoolNodeConfigShieldedInstanceConfig", jsii_struct_bases=[], name_mapping={'enable_integrity_monitoring': 'enableIntegrityMonitoring', 'enable_secure_boot': 'enableSecureBoot'})
class ContainerNodePoolNodeConfigShieldedInstanceConfig():
    def __init__(self, *, enable_integrity_monitoring: typing.Optional[bool]=None, enable_secure_boot: typing.Optional[bool]=None) -> None:
        """
        :param enable_integrity_monitoring: 
        :param enable_secure_boot: 
        """
        self._values = {
        }
        if enable_integrity_monitoring is not None: self._values["enable_integrity_monitoring"] = enable_integrity_monitoring
        if enable_secure_boot is not None: self._values["enable_secure_boot"] = enable_secure_boot

    @builtins.property
    def enable_integrity_monitoring(self) -> typing.Optional[bool]:
        return self._values.get('enable_integrity_monitoring')

    @builtins.property
    def enable_secure_boot(self) -> typing.Optional[bool]:
        return self._values.get('enable_secure_boot')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerNodePoolNodeConfigShieldedInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerNodePoolNodeConfigTaint", jsii_struct_bases=[], name_mapping={'effect': 'effect', 'key': 'key', 'value': 'value'})
class ContainerNodePoolNodeConfigTaint():
    def __init__(self, *, effect: typing.Optional[str]=None, key: typing.Optional[str]=None, value: typing.Optional[str]=None) -> None:
        """
        :param effect: 
        :param key: 
        :param value: 
        """
        self._values = {
        }
        if effect is not None: self._values["effect"] = effect
        if key is not None: self._values["key"] = key
        if value is not None: self._values["value"] = value

    @builtins.property
    def effect(self) -> typing.Optional[str]:
        return self._values.get('effect')

    @builtins.property
    def key(self) -> typing.Optional[str]:
        return self._values.get('key')

    @builtins.property
    def value(self) -> typing.Optional[str]:
        return self._values.get('value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerNodePoolNodeConfigTaint(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerNodePoolNodeConfigWorkloadMetadataConfig", jsii_struct_bases=[], name_mapping={'node_metadata': 'nodeMetadata'})
class ContainerNodePoolNodeConfigWorkloadMetadataConfig():
    def __init__(self, *, node_metadata: str) -> None:
        """
        :param node_metadata: 
        """
        self._values = {
            'node_metadata': node_metadata,
        }

    @builtins.property
    def node_metadata(self) -> str:
        return self._values.get('node_metadata')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerNodePoolNodeConfigWorkloadMetadataConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerNodePoolTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ContainerNodePoolTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerNodePoolTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerNodePoolUpgradeSettings", jsii_struct_bases=[], name_mapping={'max_surge': 'maxSurge', 'max_unavailable': 'maxUnavailable'})
class ContainerNodePoolUpgradeSettings():
    def __init__(self, *, max_surge: jsii.Number, max_unavailable: jsii.Number) -> None:
        """
        :param max_surge: The number of additional nodes that can be added to the node pool during an upgrade. Increasing max_surge raises the number of nodes that can be upgraded simultaneously. Can be set to 0 or greater.
        :param max_unavailable: The number of nodes that can be simultaneously unavailable during an upgrade. Increasing max_unavailable raises the number of nodes that can be upgraded in parallel. Can be set to 0 or greater.
        """
        self._values = {
            'max_surge': max_surge,
            'max_unavailable': max_unavailable,
        }

    @builtins.property
    def max_surge(self) -> jsii.Number:
        """The number of additional nodes that can be added to the node pool during an upgrade.

        Increasing max_surge raises the number of nodes that can be upgraded simultaneously. Can be set to 0 or greater.
        """
        return self._values.get('max_surge')

    @builtins.property
    def max_unavailable(self) -> jsii.Number:
        """The number of nodes that can be simultaneously unavailable during an upgrade.

        Increasing max_unavailable raises the number of nodes that can be upgraded in parallel. Can be set to 0 or greater.
        """
        return self._values.get('max_unavailable')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerNodePoolUpgradeSettings(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ContainerRegistry(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ContainerRegistry"):
    def __init__(self, scope: constructs.Construct, id: str, *, location: typing.Optional[str]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param location: The location of the registry. One of ASIA, EU, US or not specified. See the official documentation for more information on registry locations.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ContainerRegistryConfig(location=location, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ContainerRegistry, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="bucketSelfLink")
    def bucket_self_link(self) -> str:
        return jsii.get(self, "bucketSelfLink")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ContainerRegistryConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'location': 'location', 'project': 'project'})
class ContainerRegistryConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: The location of the registry. One of ASIA, EU, US or not specified. See the official documentation for more information on registry locations.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """The location of the registry.

        One of ASIA, EU, US or not specified. See the official documentation for more information on registry locations.
        """
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ContainerRegistryConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataCatalogEntry(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataCatalogEntry"):
    def __init__(self, scope: constructs.Construct, id: str, *, entry_group: str, entry_id: str, description: typing.Optional[str]=None, display_name: typing.Optional[str]=None, gcs_fileset_spec: typing.Optional[typing.List["DataCatalogEntryGcsFilesetSpec"]]=None, linked_resource: typing.Optional[str]=None, schema: typing.Optional[str]=None, timeouts: typing.Optional["DataCatalogEntryTimeouts"]=None, type: typing.Optional[str]=None, user_specified_system: typing.Optional[str]=None, user_specified_type: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param entry_group: The name of the entry group this entry is in.
        :param entry_id: The id of the entry to create.
        :param description: Entry description, which can consist of several sentences or paragraphs that describe entry contents.
        :param display_name: Display information such as title and description. A short name to identify the entry, for example, "Analytics Data - Jan 2011".
        :param gcs_fileset_spec: gcs_fileset_spec block.
        :param linked_resource: The resource this metadata entry refers to. For Google Cloud Platform resources, linkedResource is the full name of the resource. For example, the linkedResource for a table resource from BigQuery is: //bigquery.googleapis.com/projects/projectId/datasets/datasetId/tables/tableId Output only when Entry is of type in the EntryType enum. For entries with userSpecifiedType, this field is optional and defaults to an empty string.
        :param schema: Schema of the entry (e.g. BigQuery, GoogleSQL, Avro schema), as a json string. An entry might not have any schema attached to it. See https://cloud.google.com/data-catalog/docs/reference/rest/v1/projects.locations.entryGroups.entries#schema for what fields this schema can contain.
        :param timeouts: timeouts block.
        :param type: The type of the entry. Only used for Entries with types in the EntryType enum. Currently, only FILESET enum value is allowed. All other entries created through Data Catalog must use userSpecifiedType. Possible values: ["FILESET"]
        :param user_specified_system: This field indicates the entry's source system that Data Catalog does not integrate with. userSpecifiedSystem strings must begin with a letter or underscore and can only contain letters, numbers, and underscores; are case insensitive; must be at least 1 character and at most 64 characters long.
        :param user_specified_type: Entry type if it does not fit any of the input-allowed values listed in EntryType enum above. When creating an entry, users should check the enum values first, if nothing matches the entry to be created, then provide a custom value, for example "my_special_type". userSpecifiedType strings must begin with a letter or underscore and can only contain letters, numbers, and underscores; are case insensitive; must be at least 1 character and at most 64 characters long.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataCatalogEntryConfig(entry_group=entry_group, entry_id=entry_id, description=description, display_name=display_name, gcs_fileset_spec=gcs_fileset_spec, linked_resource=linked_resource, schema=schema, timeouts=timeouts, type=type, user_specified_system=user_specified_system, user_specified_type=user_specified_type, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataCatalogEntry, self, [scope, id, config])

    @jsii.member(jsii_name="bigqueryDateShardedSpec")
    def bigquery_date_sharded_spec(self, index: str) -> "DataCatalogEntryBigqueryDateShardedSpec":
        """
        :param index: -
        """
        return jsii.invoke(self, "bigqueryDateShardedSpec", [index])

    @jsii.member(jsii_name="bigqueryTableSpec")
    def bigquery_table_spec(self, index: str) -> "DataCatalogEntryBigqueryTableSpec":
        """
        :param index: -
        """
        return jsii.invoke(self, "bigqueryTableSpec", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="integratedSystem")
    def integrated_system(self) -> str:
        return jsii.get(self, "integratedSystem")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="entryGroup")
    def entry_group(self) -> str:
        return jsii.get(self, "entryGroup")

    @entry_group.setter
    def entry_group(self, value: str) -> None:
        jsii.set(self, "entryGroup", value)

    @builtins.property
    @jsii.member(jsii_name="entryId")
    def entry_id(self) -> str:
        return jsii.get(self, "entryId")

    @entry_id.setter
    def entry_id(self, value: str) -> None:
        jsii.set(self, "entryId", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> typing.Optional[str]:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="gcsFilesetSpec")
    def gcs_fileset_spec(self) -> typing.Optional[typing.List["DataCatalogEntryGcsFilesetSpec"]]:
        return jsii.get(self, "gcsFilesetSpec")

    @gcs_fileset_spec.setter
    def gcs_fileset_spec(self, value: typing.Optional[typing.List["DataCatalogEntryGcsFilesetSpec"]]) -> None:
        jsii.set(self, "gcsFilesetSpec", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="linkedResource")
    def linked_resource(self) -> typing.Optional[str]:
        return jsii.get(self, "linkedResource")

    @linked_resource.setter
    def linked_resource(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "linkedResource", value)

    @builtins.property
    @jsii.member(jsii_name="schema")
    def schema(self) -> typing.Optional[str]:
        return jsii.get(self, "schema")

    @schema.setter
    def schema(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "schema", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DataCatalogEntryTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DataCatalogEntryTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> typing.Optional[str]:
        return jsii.get(self, "type")

    @type.setter
    def type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "type", value)

    @builtins.property
    @jsii.member(jsii_name="userSpecifiedSystem")
    def user_specified_system(self) -> typing.Optional[str]:
        return jsii.get(self, "userSpecifiedSystem")

    @user_specified_system.setter
    def user_specified_system(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "userSpecifiedSystem", value)

    @builtins.property
    @jsii.member(jsii_name="userSpecifiedType")
    def user_specified_type(self) -> typing.Optional[str]:
        return jsii.get(self, "userSpecifiedType")

    @user_specified_type.setter
    def user_specified_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "userSpecifiedType", value)


class DataCatalogEntryBigqueryDateShardedSpec(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataCatalogEntryBigqueryDateShardedSpec"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataCatalogEntryBigqueryDateShardedSpec, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="dataset")
    def dataset(self) -> str:
        return jsii.get(self, "dataset")

    @builtins.property
    @jsii.member(jsii_name="shardCount")
    def shard_count(self) -> jsii.Number:
        return jsii.get(self, "shardCount")

    @builtins.property
    @jsii.member(jsii_name="tablePrefix")
    def table_prefix(self) -> str:
        return jsii.get(self, "tablePrefix")


class DataCatalogEntryBigqueryTableSpec(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataCatalogEntryBigqueryTableSpec"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataCatalogEntryBigqueryTableSpec, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="tableSourceType")
    def table_source_type(self) -> str:
        return jsii.get(self, "tableSourceType")

    @builtins.property
    @jsii.member(jsii_name="tableSpec")
    def table_spec(self) -> typing.Any:
        return jsii.get(self, "tableSpec")

    @builtins.property
    @jsii.member(jsii_name="viewSpec")
    def view_spec(self) -> typing.Any:
        return jsii.get(self, "viewSpec")


class DataCatalogEntryBigqueryTableSpecTableSpec(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataCatalogEntryBigqueryTableSpecTableSpec"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataCatalogEntryBigqueryTableSpecTableSpec, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="groupedEntry")
    def grouped_entry(self) -> str:
        return jsii.get(self, "groupedEntry")


class DataCatalogEntryBigqueryTableSpecViewSpec(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataCatalogEntryBigqueryTableSpecViewSpec"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataCatalogEntryBigqueryTableSpecViewSpec, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="viewQuery")
    def view_query(self) -> str:
        return jsii.get(self, "viewQuery")


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogEntryConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'entry_group': 'entryGroup', 'entry_id': 'entryId', 'description': 'description', 'display_name': 'displayName', 'gcs_fileset_spec': 'gcsFilesetSpec', 'linked_resource': 'linkedResource', 'schema': 'schema', 'timeouts': 'timeouts', 'type': 'type', 'user_specified_system': 'userSpecifiedSystem', 'user_specified_type': 'userSpecifiedType'})
class DataCatalogEntryConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, entry_group: str, entry_id: str, description: typing.Optional[str]=None, display_name: typing.Optional[str]=None, gcs_fileset_spec: typing.Optional[typing.List["DataCatalogEntryGcsFilesetSpec"]]=None, linked_resource: typing.Optional[str]=None, schema: typing.Optional[str]=None, timeouts: typing.Optional["DataCatalogEntryTimeouts"]=None, type: typing.Optional[str]=None, user_specified_system: typing.Optional[str]=None, user_specified_type: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param entry_group: The name of the entry group this entry is in.
        :param entry_id: The id of the entry to create.
        :param description: Entry description, which can consist of several sentences or paragraphs that describe entry contents.
        :param display_name: Display information such as title and description. A short name to identify the entry, for example, "Analytics Data - Jan 2011".
        :param gcs_fileset_spec: gcs_fileset_spec block.
        :param linked_resource: The resource this metadata entry refers to. For Google Cloud Platform resources, linkedResource is the full name of the resource. For example, the linkedResource for a table resource from BigQuery is: //bigquery.googleapis.com/projects/projectId/datasets/datasetId/tables/tableId Output only when Entry is of type in the EntryType enum. For entries with userSpecifiedType, this field is optional and defaults to an empty string.
        :param schema: Schema of the entry (e.g. BigQuery, GoogleSQL, Avro schema), as a json string. An entry might not have any schema attached to it. See https://cloud.google.com/data-catalog/docs/reference/rest/v1/projects.locations.entryGroups.entries#schema for what fields this schema can contain.
        :param timeouts: timeouts block.
        :param type: The type of the entry. Only used for Entries with types in the EntryType enum. Currently, only FILESET enum value is allowed. All other entries created through Data Catalog must use userSpecifiedType. Possible values: ["FILESET"]
        :param user_specified_system: This field indicates the entry's source system that Data Catalog does not integrate with. userSpecifiedSystem strings must begin with a letter or underscore and can only contain letters, numbers, and underscores; are case insensitive; must be at least 1 character and at most 64 characters long.
        :param user_specified_type: Entry type if it does not fit any of the input-allowed values listed in EntryType enum above. When creating an entry, users should check the enum values first, if nothing matches the entry to be created, then provide a custom value, for example "my_special_type". userSpecifiedType strings must begin with a letter or underscore and can only contain letters, numbers, and underscores; are case insensitive; must be at least 1 character and at most 64 characters long.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DataCatalogEntryTimeouts(**timeouts)
        self._values = {
            'entry_group': entry_group,
            'entry_id': entry_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if display_name is not None: self._values["display_name"] = display_name
        if gcs_fileset_spec is not None: self._values["gcs_fileset_spec"] = gcs_fileset_spec
        if linked_resource is not None: self._values["linked_resource"] = linked_resource
        if schema is not None: self._values["schema"] = schema
        if timeouts is not None: self._values["timeouts"] = timeouts
        if type is not None: self._values["type"] = type
        if user_specified_system is not None: self._values["user_specified_system"] = user_specified_system
        if user_specified_type is not None: self._values["user_specified_type"] = user_specified_type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def entry_group(self) -> str:
        """The name of the entry group this entry is in."""
        return self._values.get('entry_group')

    @builtins.property
    def entry_id(self) -> str:
        """The id of the entry to create."""
        return self._values.get('entry_id')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Entry description, which can consist of several sentences or paragraphs that describe entry contents."""
        return self._values.get('description')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """Display information such as title and description.

        A short name to identify the entry,
        for example, "Analytics Data - Jan 2011".
        """
        return self._values.get('display_name')

    @builtins.property
    def gcs_fileset_spec(self) -> typing.Optional[typing.List["DataCatalogEntryGcsFilesetSpec"]]:
        """gcs_fileset_spec block."""
        return self._values.get('gcs_fileset_spec')

    @builtins.property
    def linked_resource(self) -> typing.Optional[str]:
        """The resource this metadata entry refers to.

        For Google Cloud Platform resources, linkedResource is the full name of the resource.
        For example, the linkedResource for a table resource from BigQuery is:
        //bigquery.googleapis.com/projects/projectId/datasets/datasetId/tables/tableId
        Output only when Entry is of type in the EntryType enum. For entries with userSpecifiedType,
        this field is optional and defaults to an empty string.
        """
        return self._values.get('linked_resource')

    @builtins.property
    def schema(self) -> typing.Optional[str]:
        """Schema of the entry (e.g. BigQuery, GoogleSQL, Avro schema), as a json string. An entry might not have any schema attached to it. See https://cloud.google.com/data-catalog/docs/reference/rest/v1/projects.locations.entryGroups.entries#schema for what fields this schema can contain."""
        return self._values.get('schema')

    @builtins.property
    def timeouts(self) -> typing.Optional["DataCatalogEntryTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        """The type of the entry.

        Only used for Entries with types in the EntryType enum.
        Currently, only FILESET enum value is allowed. All other entries created through Data Catalog must use userSpecifiedType. Possible values: ["FILESET"]
        """
        return self._values.get('type')

    @builtins.property
    def user_specified_system(self) -> typing.Optional[str]:
        """This field indicates the entry's source system that Data Catalog does not integrate with.

        userSpecifiedSystem strings must begin with a letter or underscore and can only contain letters, numbers,
        and underscores; are case insensitive; must be at least 1 character and at most 64 characters long.
        """
        return self._values.get('user_specified_system')

    @builtins.property
    def user_specified_type(self) -> typing.Optional[str]:
        """Entry type if it does not fit any of the input-allowed values listed in EntryType enum above.

        When creating an entry, users should check the enum values first, if nothing matches the entry
        to be created, then provide a custom value, for example "my_special_type".
        userSpecifiedType strings must begin with a letter or underscore and can only contain letters,
        numbers, and underscores; are case insensitive; must be at least 1 character and at most 64 characters long.
        """
        return self._values.get('user_specified_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogEntryConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogEntryGcsFilesetSpec", jsii_struct_bases=[], name_mapping={'file_patterns': 'filePatterns'})
class DataCatalogEntryGcsFilesetSpec():
    def __init__(self, *, file_patterns: typing.List[str]) -> None:
        """
        :param file_patterns: Patterns to identify a set of files in Google Cloud Storage. See `Cloud Storage documentation <https://cloud.google.com/storage/docs/gsutil/addlhelp/WildcardNames>`_ for more information. Note that bucket wildcards are currently not supported. Examples of valid filePatterns: gs://bucket_name/dir/*: matches all files within bucket_name/dir directory. gs://bucket_name/dir/**: matches all files in bucket_name/dir spanning all subdirectories. gs://bucket_name/file*: matches files prefixed by file in bucket_name gs://bucket_name/??.txt: matches files with two characters followed by .txt in bucket_name gs://bucket_name/[aeiou].txt: matches files that contain a single vowel character followed by .txt in bucket_name gs://bucket_name/[a-m].txt: matches files that contain a, b, ... or m followed by .txt in bucket_name gs://bucket_name/a/*/b: matches all files in bucket_name that match a/*/b pattern, such as a/c/b, a/d/b gs://another_bucket/a.txt: matches gs://another_bucket/a.txt
        """
        self._values = {
            'file_patterns': file_patterns,
        }

    @builtins.property
    def file_patterns(self) -> typing.List[str]:
        """Patterns to identify a set of files in Google Cloud Storage.

        See `Cloud Storage documentation <https://cloud.google.com/storage/docs/gsutil/addlhelp/WildcardNames>`_
        for more information. Note that bucket wildcards are currently not supported. Examples of valid filePatterns:

        gs://bucket_name/dir/*: matches all files within bucket_name/dir directory.
        gs://bucket_name/dir/**: matches all files in bucket_name/dir spanning all subdirectories.
        gs://bucket_name/file*: matches files prefixed by file in bucket_name
        gs://bucket_name/??.txt: matches files with two characters followed by .txt in bucket_name
        gs://bucket_name/[aeiou].txt: matches files that contain a single vowel character followed by .txt in bucket_name
        gs://bucket_name/[a-m].txt: matches files that contain a, b, ... or m followed by .txt in bucket_name
        gs://bucket_name/a/*/b: matches all files in bucket_name that match a/*/b pattern, such as a/c/b, a/d/b
        gs://another_bucket/a.txt: matches gs://another_bucket/a.txt
        """
        return self._values.get('file_patterns')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogEntryGcsFilesetSpec(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataCatalogEntryGroup(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataCatalogEntryGroup"):
    def __init__(self, scope: constructs.Construct, id: str, *, entry_group_id: str, description: typing.Optional[str]=None, display_name: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["DataCatalogEntryGroupTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param entry_group_id: The id of the entry group to create. The id must begin with a letter or underscore, contain only English letters, numbers and underscores, and be at most 64 characters.
        :param description: Entry group description, which can consist of several sentences or paragraphs that describe entry group contents.
        :param display_name: A short name to identify the entry group, for example, "analytics data - jan 2011".
        :param project: 
        :param region: EntryGroup location region.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataCatalogEntryGroupConfig(entry_group_id=entry_group_id, description=description, display_name=display_name, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataCatalogEntryGroup, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="entryGroupId")
    def entry_group_id(self) -> str:
        return jsii.get(self, "entryGroupId")

    @entry_group_id.setter
    def entry_group_id(self, value: str) -> None:
        jsii.set(self, "entryGroupId", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> typing.Optional[str]:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DataCatalogEntryGroupTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DataCatalogEntryGroupTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogEntryGroupConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'entry_group_id': 'entryGroupId', 'description': 'description', 'display_name': 'displayName', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class DataCatalogEntryGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, entry_group_id: str, description: typing.Optional[str]=None, display_name: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["DataCatalogEntryGroupTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param entry_group_id: The id of the entry group to create. The id must begin with a letter or underscore, contain only English letters, numbers and underscores, and be at most 64 characters.
        :param description: Entry group description, which can consist of several sentences or paragraphs that describe entry group contents.
        :param display_name: A short name to identify the entry group, for example, "analytics data - jan 2011".
        :param project: 
        :param region: EntryGroup location region.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DataCatalogEntryGroupTimeouts(**timeouts)
        self._values = {
            'entry_group_id': entry_group_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if display_name is not None: self._values["display_name"] = display_name
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def entry_group_id(self) -> str:
        """The id of the entry group to create.

        The id must begin with a letter or underscore,
        contain only English letters, numbers and underscores, and be at most 64 characters.
        """
        return self._values.get('entry_group_id')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Entry group description, which can consist of several sentences or paragraphs that describe entry group contents."""
        return self._values.get('description')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """A short name to identify the entry group, for example, "analytics data - jan 2011"."""
        return self._values.get('display_name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """EntryGroup location region."""
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["DataCatalogEntryGroupTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogEntryGroupConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataCatalogEntryGroupIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataCatalogEntryGroupIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, entry_group: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["DataCatalogEntryGroupIamBindingCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param entry_group: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataCatalogEntryGroupIamBindingConfig(entry_group=entry_group, members=members, role=role, condition=condition, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataCatalogEntryGroupIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="entryGroup")
    def entry_group(self) -> str:
        return jsii.get(self, "entryGroup")

    @entry_group.setter
    def entry_group(self, value: str) -> None:
        jsii.set(self, "entryGroup", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["DataCatalogEntryGroupIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["DataCatalogEntryGroupIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogEntryGroupIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class DataCatalogEntryGroupIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogEntryGroupIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogEntryGroupIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'entry_group': 'entryGroup', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project', 'region': 'region'})
class DataCatalogEntryGroupIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, entry_group: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["DataCatalogEntryGroupIamBindingCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param entry_group: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'entry_group': entry_group,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def entry_group(self) -> str:
        return self._values.get('entry_group')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["DataCatalogEntryGroupIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogEntryGroupIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataCatalogEntryGroupIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataCatalogEntryGroupIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, entry_group: str, member: str, role: str, condition: typing.Optional[typing.List["DataCatalogEntryGroupIamMemberCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param entry_group: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataCatalogEntryGroupIamMemberConfig(entry_group=entry_group, member=member, role=role, condition=condition, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataCatalogEntryGroupIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="entryGroup")
    def entry_group(self) -> str:
        return jsii.get(self, "entryGroup")

    @entry_group.setter
    def entry_group(self, value: str) -> None:
        jsii.set(self, "entryGroup", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["DataCatalogEntryGroupIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["DataCatalogEntryGroupIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogEntryGroupIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class DataCatalogEntryGroupIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogEntryGroupIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogEntryGroupIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'entry_group': 'entryGroup', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project', 'region': 'region'})
class DataCatalogEntryGroupIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, entry_group: str, member: str, role: str, condition: typing.Optional[typing.List["DataCatalogEntryGroupIamMemberCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param entry_group: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'entry_group': entry_group,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def entry_group(self) -> str:
        return self._values.get('entry_group')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["DataCatalogEntryGroupIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogEntryGroupIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataCatalogEntryGroupIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataCatalogEntryGroupIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, entry_group: str, policy_data: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param entry_group: 
        :param policy_data: 
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataCatalogEntryGroupIamPolicyConfig(entry_group=entry_group, policy_data=policy_data, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataCatalogEntryGroupIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="entryGroup")
    def entry_group(self) -> str:
        return jsii.get(self, "entryGroup")

    @entry_group.setter
    def entry_group(self, value: str) -> None:
        jsii.set(self, "entryGroup", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogEntryGroupIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'entry_group': 'entryGroup', 'policy_data': 'policyData', 'project': 'project', 'region': 'region'})
class DataCatalogEntryGroupIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, entry_group: str, policy_data: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param entry_group: 
        :param policy_data: 
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'entry_group': entry_group,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def entry_group(self) -> str:
        return self._values.get('entry_group')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogEntryGroupIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogEntryGroupTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class DataCatalogEntryGroupTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogEntryGroupTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogEntryTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class DataCatalogEntryTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogEntryTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataCatalogTag(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataCatalogTag"):
    def __init__(self, scope: constructs.Construct, id: str, *, fields: typing.List["DataCatalogTagFields"], template: str, column: typing.Optional[str]=None, parent: typing.Optional[str]=None, timeouts: typing.Optional["DataCatalogTagTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param fields: fields block.
        :param template: The resource name of the tag template that this tag uses. Example: projects/{project_id}/locations/{location}/tagTemplates/{tagTemplateId} This field cannot be modified after creation.
        :param column: Resources like Entry can have schemas associated with them. This scope allows users to attach tags to an individual column based on that schema. For attaching a tag to a nested column, use '.' to separate the column names. Example: 'outer_column.inner_column'
        :param parent: The name of the parent this tag is attached to. This can be the name of an entry or an entry group. If an entry group, the tag will be attached to all entries in that group.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataCatalogTagConfig(fields=fields, template=template, column=column, parent=parent, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataCatalogTag, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="templateDisplayname")
    def template_displayname(self) -> str:
        return jsii.get(self, "templateDisplayname")

    @builtins.property
    @jsii.member(jsii_name="fields")
    def fields(self) -> typing.List["DataCatalogTagFields"]:
        return jsii.get(self, "fields")

    @fields.setter
    def fields(self, value: typing.List["DataCatalogTagFields"]) -> None:
        jsii.set(self, "fields", value)

    @builtins.property
    @jsii.member(jsii_name="template")
    def template(self) -> str:
        return jsii.get(self, "template")

    @template.setter
    def template(self, value: str) -> None:
        jsii.set(self, "template", value)

    @builtins.property
    @jsii.member(jsii_name="column")
    def column(self) -> typing.Optional[str]:
        return jsii.get(self, "column")

    @column.setter
    def column(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "column", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="parent")
    def parent(self) -> typing.Optional[str]:
        return jsii.get(self, "parent")

    @parent.setter
    def parent(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "parent", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DataCatalogTagTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DataCatalogTagTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogTagConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'fields': 'fields', 'template': 'template', 'column': 'column', 'parent': 'parent', 'timeouts': 'timeouts'})
class DataCatalogTagConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, fields: typing.List["DataCatalogTagFields"], template: str, column: typing.Optional[str]=None, parent: typing.Optional[str]=None, timeouts: typing.Optional["DataCatalogTagTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param fields: fields block.
        :param template: The resource name of the tag template that this tag uses. Example: projects/{project_id}/locations/{location}/tagTemplates/{tagTemplateId} This field cannot be modified after creation.
        :param column: Resources like Entry can have schemas associated with them. This scope allows users to attach tags to an individual column based on that schema. For attaching a tag to a nested column, use '.' to separate the column names. Example: 'outer_column.inner_column'
        :param parent: The name of the parent this tag is attached to. This can be the name of an entry or an entry group. If an entry group, the tag will be attached to all entries in that group.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DataCatalogTagTimeouts(**timeouts)
        self._values = {
            'fields': fields,
            'template': template,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if column is not None: self._values["column"] = column
        if parent is not None: self._values["parent"] = parent
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def fields(self) -> typing.List["DataCatalogTagFields"]:
        """fields block."""
        return self._values.get('fields')

    @builtins.property
    def template(self) -> str:
        """The resource name of the tag template that this tag uses.

        Example:
        projects/{project_id}/locations/{location}/tagTemplates/{tagTemplateId}
        This field cannot be modified after creation.
        """
        return self._values.get('template')

    @builtins.property
    def column(self) -> typing.Optional[str]:
        """Resources like Entry can have schemas associated with them.

        This scope allows users to attach tags to an
        individual column based on that schema.

        For attaching a tag to a nested column, use '.' to separate the column names. Example:
        'outer_column.inner_column'
        """
        return self._values.get('column')

    @builtins.property
    def parent(self) -> typing.Optional[str]:
        """The name of the parent this tag is attached to.

        This can be the name of an entry or an entry group. If an entry group, the tag will be attached to
        all entries in that group.
        """
        return self._values.get('parent')

    @builtins.property
    def timeouts(self) -> typing.Optional["DataCatalogTagTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogTagConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogTagFields", jsii_struct_bases=[], name_mapping={'field_name': 'fieldName', 'bool_value': 'boolValue', 'double_value': 'doubleValue', 'enum_value': 'enumValue', 'string_value': 'stringValue', 'timestamp_value': 'timestampValue'})
class DataCatalogTagFields():
    def __init__(self, *, field_name: str, bool_value: typing.Optional[bool]=None, double_value: typing.Optional[jsii.Number]=None, enum_value: typing.Optional[str]=None, string_value: typing.Optional[str]=None, timestamp_value: typing.Optional[str]=None) -> None:
        """
        :param field_name: 
        :param bool_value: Holds the value for a tag field with boolean type.
        :param double_value: Holds the value for a tag field with double type.
        :param enum_value: The display name of the enum value.
        :param string_value: Holds the value for a tag field with string type.
        :param timestamp_value: Holds the value for a tag field with timestamp type.
        """
        self._values = {
            'field_name': field_name,
        }
        if bool_value is not None: self._values["bool_value"] = bool_value
        if double_value is not None: self._values["double_value"] = double_value
        if enum_value is not None: self._values["enum_value"] = enum_value
        if string_value is not None: self._values["string_value"] = string_value
        if timestamp_value is not None: self._values["timestamp_value"] = timestamp_value

    @builtins.property
    def field_name(self) -> str:
        return self._values.get('field_name')

    @builtins.property
    def bool_value(self) -> typing.Optional[bool]:
        """Holds the value for a tag field with boolean type."""
        return self._values.get('bool_value')

    @builtins.property
    def double_value(self) -> typing.Optional[jsii.Number]:
        """Holds the value for a tag field with double type."""
        return self._values.get('double_value')

    @builtins.property
    def enum_value(self) -> typing.Optional[str]:
        """The display name of the enum value."""
        return self._values.get('enum_value')

    @builtins.property
    def string_value(self) -> typing.Optional[str]:
        """Holds the value for a tag field with string type."""
        return self._values.get('string_value')

    @builtins.property
    def timestamp_value(self) -> typing.Optional[str]:
        """Holds the value for a tag field with timestamp type."""
        return self._values.get('timestamp_value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogTagFields(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataCatalogTagTemplate(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataCatalogTagTemplate"):
    def __init__(self, scope: constructs.Construct, id: str, *, fields: typing.List["DataCatalogTagTemplateFields"], tag_template_id: str, display_name: typing.Optional[str]=None, force_delete: typing.Optional[bool]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["DataCatalogTagTemplateTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param fields: fields block.
        :param tag_template_id: The id of the tag template to create.
        :param display_name: The display name for this template.
        :param force_delete: This confirms the deletion of any possible tags using this template. Must be set to true in order to delete the tag template.
        :param project: 
        :param region: Template location region.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataCatalogTagTemplateConfig(fields=fields, tag_template_id=tag_template_id, display_name=display_name, force_delete=force_delete, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataCatalogTagTemplate, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="fields")
    def fields(self) -> typing.List["DataCatalogTagTemplateFields"]:
        return jsii.get(self, "fields")

    @fields.setter
    def fields(self, value: typing.List["DataCatalogTagTemplateFields"]) -> None:
        jsii.set(self, "fields", value)

    @builtins.property
    @jsii.member(jsii_name="tagTemplateId")
    def tag_template_id(self) -> str:
        return jsii.get(self, "tagTemplateId")

    @tag_template_id.setter
    def tag_template_id(self, value: str) -> None:
        jsii.set(self, "tagTemplateId", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> typing.Optional[str]:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="forceDelete")
    def force_delete(self) -> typing.Optional[bool]:
        return jsii.get(self, "forceDelete")

    @force_delete.setter
    def force_delete(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "forceDelete", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DataCatalogTagTemplateTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DataCatalogTagTemplateTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogTagTemplateConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'fields': 'fields', 'tag_template_id': 'tagTemplateId', 'display_name': 'displayName', 'force_delete': 'forceDelete', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class DataCatalogTagTemplateConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, fields: typing.List["DataCatalogTagTemplateFields"], tag_template_id: str, display_name: typing.Optional[str]=None, force_delete: typing.Optional[bool]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["DataCatalogTagTemplateTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param fields: fields block.
        :param tag_template_id: The id of the tag template to create.
        :param display_name: The display name for this template.
        :param force_delete: This confirms the deletion of any possible tags using this template. Must be set to true in order to delete the tag template.
        :param project: 
        :param region: Template location region.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DataCatalogTagTemplateTimeouts(**timeouts)
        self._values = {
            'fields': fields,
            'tag_template_id': tag_template_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if display_name is not None: self._values["display_name"] = display_name
        if force_delete is not None: self._values["force_delete"] = force_delete
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def fields(self) -> typing.List["DataCatalogTagTemplateFields"]:
        """fields block."""
        return self._values.get('fields')

    @builtins.property
    def tag_template_id(self) -> str:
        """The id of the tag template to create."""
        return self._values.get('tag_template_id')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """The display name for this template."""
        return self._values.get('display_name')

    @builtins.property
    def force_delete(self) -> typing.Optional[bool]:
        """This confirms the deletion of any possible tags using this template.

        Must be set to true in order to delete the tag template.
        """
        return self._values.get('force_delete')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """Template location region."""
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["DataCatalogTagTemplateTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogTagTemplateConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogTagTemplateFields", jsii_struct_bases=[], name_mapping={'field_id': 'fieldId', 'type': 'type', 'display_name': 'displayName', 'is_required': 'isRequired', 'order': 'order'})
class DataCatalogTagTemplateFields():
    def __init__(self, *, field_id: str, type: typing.List["DataCatalogTagTemplateFieldsType"], display_name: typing.Optional[str]=None, is_required: typing.Optional[bool]=None, order: typing.Optional[jsii.Number]=None) -> None:
        """
        :param field_id: 
        :param type: type block.
        :param display_name: The display name for this field.
        :param is_required: Whether this is a required field. Defaults to false.
        :param order: The order of this field with respect to other fields in this tag template. A higher value indicates a more important field. The value can be negative. Multiple fields can have the same order, and field orders within a tag do not have to be sequential.
        """
        self._values = {
            'field_id': field_id,
            'type': type,
        }
        if display_name is not None: self._values["display_name"] = display_name
        if is_required is not None: self._values["is_required"] = is_required
        if order is not None: self._values["order"] = order

    @builtins.property
    def field_id(self) -> str:
        return self._values.get('field_id')

    @builtins.property
    def type(self) -> typing.List["DataCatalogTagTemplateFieldsType"]:
        """type block."""
        return self._values.get('type')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """The display name for this field."""
        return self._values.get('display_name')

    @builtins.property
    def is_required(self) -> typing.Optional[bool]:
        """Whether this is a required field.

        Defaults to false.
        """
        return self._values.get('is_required')

    @builtins.property
    def order(self) -> typing.Optional[jsii.Number]:
        """The order of this field with respect to other fields in this tag template.

        A higher value indicates a more important field. The value can be negative.
        Multiple fields can have the same order, and field orders within a tag do not have to be sequential.
        """
        return self._values.get('order')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogTagTemplateFields(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogTagTemplateFieldsType", jsii_struct_bases=[], name_mapping={'enum_type': 'enumType', 'primitive_type': 'primitiveType'})
class DataCatalogTagTemplateFieldsType():
    def __init__(self, *, enum_type: typing.Optional[typing.List["DataCatalogTagTemplateFieldsTypeEnumType"]]=None, primitive_type: typing.Optional[str]=None) -> None:
        """
        :param enum_type: enum_type block.
        :param primitive_type: Represents primitive types - string, bool etc. Exactly one of 'primitive_type' or 'enum_type' must be set Possible values: ["DOUBLE", "STRING", "BOOL", "TIMESTAMP"]
        """
        self._values = {
        }
        if enum_type is not None: self._values["enum_type"] = enum_type
        if primitive_type is not None: self._values["primitive_type"] = primitive_type

    @builtins.property
    def enum_type(self) -> typing.Optional[typing.List["DataCatalogTagTemplateFieldsTypeEnumType"]]:
        """enum_type block."""
        return self._values.get('enum_type')

    @builtins.property
    def primitive_type(self) -> typing.Optional[str]:
        """Represents primitive types - string, bool etc.

        Exactly one of 'primitive_type' or 'enum_type' must be set Possible values: ["DOUBLE", "STRING", "BOOL", "TIMESTAMP"]
        """
        return self._values.get('primitive_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogTagTemplateFieldsType(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogTagTemplateFieldsTypeEnumType", jsii_struct_bases=[], name_mapping={'allowed_values': 'allowedValues'})
class DataCatalogTagTemplateFieldsTypeEnumType():
    def __init__(self, *, allowed_values: typing.List["DataCatalogTagTemplateFieldsTypeEnumTypeAllowedValues"]) -> None:
        """
        :param allowed_values: allowed_values block.
        """
        self._values = {
            'allowed_values': allowed_values,
        }

    @builtins.property
    def allowed_values(self) -> typing.List["DataCatalogTagTemplateFieldsTypeEnumTypeAllowedValues"]:
        """allowed_values block."""
        return self._values.get('allowed_values')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogTagTemplateFieldsTypeEnumType(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogTagTemplateFieldsTypeEnumTypeAllowedValues", jsii_struct_bases=[], name_mapping={'display_name': 'displayName'})
class DataCatalogTagTemplateFieldsTypeEnumTypeAllowedValues():
    def __init__(self, *, display_name: str) -> None:
        """
        :param display_name: The display name of the enum value.
        """
        self._values = {
            'display_name': display_name,
        }

    @builtins.property
    def display_name(self) -> str:
        """The display name of the enum value."""
        return self._values.get('display_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogTagTemplateFieldsTypeEnumTypeAllowedValues(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogTagTemplateTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class DataCatalogTagTemplateTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogTagTemplateTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataCatalogTagTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class DataCatalogTagTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataCatalogTagTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleActiveFolder(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleActiveFolder"):
    def __init__(self, scope: constructs.Construct, id: str, *, display_name: str, parent: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: 
        :param parent: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleActiveFolderConfig(display_name=display_name, parent=parent, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleActiveFolder, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="parent")
    def parent(self) -> str:
        return jsii.get(self, "parent")

    @parent.setter
    def parent(self, value: str) -> None:
        jsii.set(self, "parent", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleActiveFolderConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'display_name': 'displayName', 'parent': 'parent'})
class DataGoogleActiveFolderConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, display_name: str, parent: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: 
        :param parent: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'display_name': display_name,
            'parent': parent,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def display_name(self) -> str:
        return self._values.get('display_name')

    @builtins.property
    def parent(self) -> str:
        return self._values.get('parent')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleActiveFolderConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleBigqueryDefaultServiceAccount(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleBigqueryDefaultServiceAccount"):
    def __init__(self, scope: constructs.Construct, id: str, *, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleBigqueryDefaultServiceAccountConfig(project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleBigqueryDefaultServiceAccount, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="email")
    def email(self) -> str:
        return jsii.get(self, "email")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleBigqueryDefaultServiceAccountConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'project': 'project'})
class DataGoogleBigqueryDefaultServiceAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleBigqueryDefaultServiceAccountConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleBillingAccount(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleBillingAccount"):
    def __init__(self, scope: constructs.Construct, id: str, *, billing_account: typing.Optional[str]=None, display_name: typing.Optional[str]=None, open: typing.Optional[bool]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param billing_account: 
        :param display_name: 
        :param open: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleBillingAccountConfig(billing_account=billing_account, display_name=display_name, open=open, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleBillingAccount, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="projectIds")
    def project_ids(self) -> typing.List[str]:
        return jsii.get(self, "projectIds")

    @builtins.property
    @jsii.member(jsii_name="billingAccount")
    def billing_account(self) -> typing.Optional[str]:
        return jsii.get(self, "billingAccount")

    @billing_account.setter
    def billing_account(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "billingAccount", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> typing.Optional[str]:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="open")
    def open(self) -> typing.Optional[bool]:
        return jsii.get(self, "open")

    @open.setter
    def open(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "open", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleBillingAccountConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'billing_account': 'billingAccount', 'display_name': 'displayName', 'open': 'open'})
class DataGoogleBillingAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, billing_account: typing.Optional[str]=None, display_name: typing.Optional[str]=None, open: typing.Optional[bool]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param billing_account: 
        :param display_name: 
        :param open: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if billing_account is not None: self._values["billing_account"] = billing_account
        if display_name is not None: self._values["display_name"] = display_name
        if open is not None: self._values["open"] = open

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def billing_account(self) -> typing.Optional[str]:
        return self._values.get('billing_account')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        return self._values.get('display_name')

    @builtins.property
    def open(self) -> typing.Optional[bool]:
        return self._values.get('open')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleBillingAccountConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleClientConfig(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleClientConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleClientConfigConfig(count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleClientConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="accessToken")
    def access_token(self) -> str:
        return jsii.get(self, "accessToken")

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> str:
        return jsii.get(self, "project")

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> str:
        return jsii.get(self, "region")

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> str:
        return jsii.get(self, "zone")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleClientConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider'})
class DataGoogleClientConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleClientConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleClientOpenidUserinfo(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleClientOpenidUserinfo"):
    def __init__(self, scope: constructs.Construct, id: str, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleClientOpenidUserinfoConfig(count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleClientOpenidUserinfo, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="email")
    def email(self) -> str:
        return jsii.get(self, "email")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleClientOpenidUserinfoConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider'})
class DataGoogleClientOpenidUserinfoConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleClientOpenidUserinfoConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleCloudfunctionsFunction(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleCloudfunctionsFunction"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: A user-defined name of the function. Function names must be unique globally.
        :param project: Project of the function. If it is not provided, the provider project is used.
        :param region: Region of function. Currently can be only "us-central1". If it is not provided, the provider region is used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleCloudfunctionsFunctionConfig(name=name, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleCloudfunctionsFunction, self, [scope, id, config])

    @jsii.member(jsii_name="environmentVariables")
    def environment_variables(self, key: str) -> str:
        """
        :param key: -
        """
        return jsii.invoke(self, "environmentVariables", [key])

    @jsii.member(jsii_name="eventTrigger")
    def event_trigger(self, index: str) -> "DataGoogleCloudfunctionsFunctionEventTrigger":
        """
        :param index: -
        """
        return jsii.invoke(self, "eventTrigger", [index])

    @jsii.member(jsii_name="labels")
    def labels(self, key: str) -> str:
        """
        :param key: -
        """
        return jsii.invoke(self, "labels", [key])

    @jsii.member(jsii_name="sourceRepository")
    def source_repository(self, index: str) -> "DataGoogleCloudfunctionsFunctionSourceRepository":
        """
        :param index: -
        """
        return jsii.invoke(self, "sourceRepository", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="availableMemoryMb")
    def available_memory_mb(self) -> jsii.Number:
        return jsii.get(self, "availableMemoryMb")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="entryPoint")
    def entry_point(self) -> str:
        return jsii.get(self, "entryPoint")

    @builtins.property
    @jsii.member(jsii_name="httpsTriggerUrl")
    def https_trigger_url(self) -> str:
        return jsii.get(self, "httpsTriggerUrl")

    @builtins.property
    @jsii.member(jsii_name="ingressSettings")
    def ingress_settings(self) -> str:
        return jsii.get(self, "ingressSettings")

    @builtins.property
    @jsii.member(jsii_name="maxInstances")
    def max_instances(self) -> jsii.Number:
        return jsii.get(self, "maxInstances")

    @builtins.property
    @jsii.member(jsii_name="runtime")
    def runtime(self) -> str:
        return jsii.get(self, "runtime")

    @builtins.property
    @jsii.member(jsii_name="serviceAccountEmail")
    def service_account_email(self) -> str:
        return jsii.get(self, "serviceAccountEmail")

    @builtins.property
    @jsii.member(jsii_name="sourceArchiveBucket")
    def source_archive_bucket(self) -> str:
        return jsii.get(self, "sourceArchiveBucket")

    @builtins.property
    @jsii.member(jsii_name="sourceArchiveObject")
    def source_archive_object(self) -> str:
        return jsii.get(self, "sourceArchiveObject")

    @builtins.property
    @jsii.member(jsii_name="timeout")
    def timeout(self) -> jsii.Number:
        return jsii.get(self, "timeout")

    @builtins.property
    @jsii.member(jsii_name="triggerHttp")
    def trigger_http(self) -> bool:
        return jsii.get(self, "triggerHttp")

    @builtins.property
    @jsii.member(jsii_name="vpcConnector")
    def vpc_connector(self) -> str:
        return jsii.get(self, "vpcConnector")

    @builtins.property
    @jsii.member(jsii_name="vpcConnectorEgressSettings")
    def vpc_connector_egress_settings(self) -> str:
        return jsii.get(self, "vpcConnectorEgressSettings")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleCloudfunctionsFunctionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project', 'region': 'region'})
class DataGoogleCloudfunctionsFunctionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: A user-defined name of the function. Function names must be unique globally.
        :param project: Project of the function. If it is not provided, the provider project is used.
        :param region: Region of function. Currently can be only "us-central1". If it is not provided, the provider region is used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """A user-defined name of the function.

        Function names must be unique globally.
        """
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """Project of the function.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """Region of function.

        Currently can be only "us-central1". If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleCloudfunctionsFunctionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleCloudfunctionsFunctionEventTrigger(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleCloudfunctionsFunctionEventTrigger"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleCloudfunctionsFunctionEventTrigger, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="eventType")
    def event_type(self) -> str:
        return jsii.get(self, "eventType")

    @builtins.property
    @jsii.member(jsii_name="failurePolicy")
    def failure_policy(self) -> typing.Any:
        return jsii.get(self, "failurePolicy")

    @builtins.property
    @jsii.member(jsii_name="resource")
    def resource(self) -> str:
        return jsii.get(self, "resource")


class DataGoogleCloudfunctionsFunctionEventTriggerFailurePolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleCloudfunctionsFunctionEventTriggerFailurePolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleCloudfunctionsFunctionEventTriggerFailurePolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="retry")
    def retry(self) -> bool:
        return jsii.get(self, "retry")


class DataGoogleCloudfunctionsFunctionSourceRepository(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleCloudfunctionsFunctionSourceRepository"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleCloudfunctionsFunctionSourceRepository, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="deployedUrl")
    def deployed_url(self) -> str:
        return jsii.get(self, "deployedUrl")

    @builtins.property
    @jsii.member(jsii_name="url")
    def url(self) -> str:
        return jsii.get(self, "url")


class DataGoogleComposerImageVersions(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComposerImageVersions"):
    def __init__(self, scope: constructs.Construct, id: str, *, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComposerImageVersionsConfig(project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComposerImageVersions, self, [scope, id, config])

    @jsii.member(jsii_name="imageVersions")
    def image_versions(self, index: str) -> "DataGoogleComposerImageVersionsImageVersions":
        """
        :param index: -
        """
        return jsii.invoke(self, "imageVersions", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComposerImageVersionsConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'project': 'project', 'region': 'region'})
class DataGoogleComposerImageVersionsConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComposerImageVersionsConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComposerImageVersionsImageVersions(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComposerImageVersionsImageVersions"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComposerImageVersionsImageVersions, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="imageVersionId")
    def image_version_id(self) -> str:
        return jsii.get(self, "imageVersionId")

    @builtins.property
    @jsii.member(jsii_name="supportedPythonVersions")
    def supported_python_versions(self) -> typing.List[str]:
        return jsii.get(self, "supportedPythonVersions")


class DataGoogleComputeAddress(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeAddress"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: 
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeAddressConfig(name=name, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeAddress, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="address")
    def address(self) -> str:
        return jsii.get(self, "address")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="status")
    def status(self) -> str:
        return jsii.get(self, "status")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeAddressConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project', 'region': 'region'})
class DataGoogleComputeAddressConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: 
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeAddressConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeBackendBucket(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendBucket"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeBackendBucketConfig(name=name, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeBackendBucket, self, [scope, id, config])

    @jsii.member(jsii_name="cdnPolicy")
    def cdn_policy(self, index: str) -> "DataGoogleComputeBackendBucketCdnPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "cdnPolicy", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="bucketName")
    def bucket_name(self) -> str:
        return jsii.get(self, "bucketName")

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="enableCdn")
    def enable_cdn(self) -> bool:
        return jsii.get(self, "enableCdn")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


class DataGoogleComputeBackendBucketCdnPolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendBucketCdnPolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendBucketCdnPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="signedUrlCacheMaxAgeSec")
    def signed_url_cache_max_age_sec(self) -> jsii.Number:
        return jsii.get(self, "signedUrlCacheMaxAgeSec")


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeBackendBucketConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project'})
class DataGoogleComputeBackendBucketConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035.  Specifically, the name must be 1-63 characters long and
        match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means
        the first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the
        last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeBackendBucketConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeBackendService(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendService"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeBackendServiceConfig(name=name, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeBackendService, self, [scope, id, config])

    @jsii.member(jsii_name="backend")
    def backend(self, index: str) -> "DataGoogleComputeBackendServiceBackend":
        """
        :param index: -
        """
        return jsii.invoke(self, "backend", [index])

    @jsii.member(jsii_name="cdnPolicy")
    def cdn_policy(self, index: str) -> "DataGoogleComputeBackendServiceCdnPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "cdnPolicy", [index])

    @jsii.member(jsii_name="circuitBreakers")
    def circuit_breakers(self, index: str) -> "DataGoogleComputeBackendServiceCircuitBreakers":
        """
        :param index: -
        """
        return jsii.invoke(self, "circuitBreakers", [index])

    @jsii.member(jsii_name="consistentHash")
    def consistent_hash(self, index: str) -> "DataGoogleComputeBackendServiceConsistentHash":
        """
        :param index: -
        """
        return jsii.invoke(self, "consistentHash", [index])

    @jsii.member(jsii_name="iap")
    def iap(self, index: str) -> "DataGoogleComputeBackendServiceIap":
        """
        :param index: -
        """
        return jsii.invoke(self, "iap", [index])

    @jsii.member(jsii_name="logConfig")
    def log_config(self, index: str) -> "DataGoogleComputeBackendServiceLogConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "logConfig", [index])

    @jsii.member(jsii_name="outlierDetection")
    def outlier_detection(self, index: str) -> "DataGoogleComputeBackendServiceOutlierDetection":
        """
        :param index: -
        """
        return jsii.invoke(self, "outlierDetection", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="affinityCookieTtlSec")
    def affinity_cookie_ttl_sec(self) -> jsii.Number:
        return jsii.get(self, "affinityCookieTtlSec")

    @builtins.property
    @jsii.member(jsii_name="connectionDrainingTimeoutSec")
    def connection_draining_timeout_sec(self) -> jsii.Number:
        return jsii.get(self, "connectionDrainingTimeoutSec")

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="customRequestHeaders")
    def custom_request_headers(self) -> typing.List[str]:
        return jsii.get(self, "customRequestHeaders")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="enableCdn")
    def enable_cdn(self) -> bool:
        return jsii.get(self, "enableCdn")

    @builtins.property
    @jsii.member(jsii_name="fingerprint")
    def fingerprint(self) -> str:
        return jsii.get(self, "fingerprint")

    @builtins.property
    @jsii.member(jsii_name="healthChecks")
    def health_checks(self) -> typing.List[str]:
        return jsii.get(self, "healthChecks")

    @builtins.property
    @jsii.member(jsii_name="loadBalancingScheme")
    def load_balancing_scheme(self) -> str:
        return jsii.get(self, "loadBalancingScheme")

    @builtins.property
    @jsii.member(jsii_name="localityLbPolicy")
    def locality_lb_policy(self) -> str:
        return jsii.get(self, "localityLbPolicy")

    @builtins.property
    @jsii.member(jsii_name="portName")
    def port_name(self) -> str:
        return jsii.get(self, "portName")

    @builtins.property
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> str:
        return jsii.get(self, "protocol")

    @builtins.property
    @jsii.member(jsii_name="securityPolicy")
    def security_policy(self) -> str:
        return jsii.get(self, "securityPolicy")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="sessionAffinity")
    def session_affinity(self) -> str:
        return jsii.get(self, "sessionAffinity")

    @builtins.property
    @jsii.member(jsii_name="timeoutSec")
    def timeout_sec(self) -> jsii.Number:
        return jsii.get(self, "timeoutSec")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


class DataGoogleComputeBackendServiceBackend(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceBackend"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendServiceBackend, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="balancingMode")
    def balancing_mode(self) -> str:
        return jsii.get(self, "balancingMode")

    @builtins.property
    @jsii.member(jsii_name="capacityScaler")
    def capacity_scaler(self) -> jsii.Number:
        return jsii.get(self, "capacityScaler")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="group")
    def group(self) -> str:
        return jsii.get(self, "group")

    @builtins.property
    @jsii.member(jsii_name="maxConnections")
    def max_connections(self) -> jsii.Number:
        return jsii.get(self, "maxConnections")

    @builtins.property
    @jsii.member(jsii_name="maxConnectionsPerEndpoint")
    def max_connections_per_endpoint(self) -> jsii.Number:
        return jsii.get(self, "maxConnectionsPerEndpoint")

    @builtins.property
    @jsii.member(jsii_name="maxConnectionsPerInstance")
    def max_connections_per_instance(self) -> jsii.Number:
        return jsii.get(self, "maxConnectionsPerInstance")

    @builtins.property
    @jsii.member(jsii_name="maxRate")
    def max_rate(self) -> jsii.Number:
        return jsii.get(self, "maxRate")

    @builtins.property
    @jsii.member(jsii_name="maxRatePerEndpoint")
    def max_rate_per_endpoint(self) -> jsii.Number:
        return jsii.get(self, "maxRatePerEndpoint")

    @builtins.property
    @jsii.member(jsii_name="maxRatePerInstance")
    def max_rate_per_instance(self) -> jsii.Number:
        return jsii.get(self, "maxRatePerInstance")

    @builtins.property
    @jsii.member(jsii_name="maxUtilization")
    def max_utilization(self) -> jsii.Number:
        return jsii.get(self, "maxUtilization")


class DataGoogleComputeBackendServiceCdnPolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceCdnPolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendServiceCdnPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="cacheKeyPolicy")
    def cache_key_policy(self) -> typing.Any:
        return jsii.get(self, "cacheKeyPolicy")

    @builtins.property
    @jsii.member(jsii_name="signedUrlCacheMaxAgeSec")
    def signed_url_cache_max_age_sec(self) -> jsii.Number:
        return jsii.get(self, "signedUrlCacheMaxAgeSec")


class DataGoogleComputeBackendServiceCdnPolicyCacheKeyPolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceCdnPolicyCacheKeyPolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendServiceCdnPolicyCacheKeyPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="includeHost")
    def include_host(self) -> bool:
        return jsii.get(self, "includeHost")

    @builtins.property
    @jsii.member(jsii_name="includeProtocol")
    def include_protocol(self) -> bool:
        return jsii.get(self, "includeProtocol")

    @builtins.property
    @jsii.member(jsii_name="includeQueryString")
    def include_query_string(self) -> bool:
        return jsii.get(self, "includeQueryString")

    @builtins.property
    @jsii.member(jsii_name="queryStringBlacklist")
    def query_string_blacklist(self) -> typing.List[str]:
        return jsii.get(self, "queryStringBlacklist")

    @builtins.property
    @jsii.member(jsii_name="queryStringWhitelist")
    def query_string_whitelist(self) -> typing.List[str]:
        return jsii.get(self, "queryStringWhitelist")


class DataGoogleComputeBackendServiceCircuitBreakers(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceCircuitBreakers"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendServiceCircuitBreakers, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="maxConnections")
    def max_connections(self) -> jsii.Number:
        return jsii.get(self, "maxConnections")

    @builtins.property
    @jsii.member(jsii_name="maxPendingRequests")
    def max_pending_requests(self) -> jsii.Number:
        return jsii.get(self, "maxPendingRequests")

    @builtins.property
    @jsii.member(jsii_name="maxRequests")
    def max_requests(self) -> jsii.Number:
        return jsii.get(self, "maxRequests")

    @builtins.property
    @jsii.member(jsii_name="maxRequestsPerConnection")
    def max_requests_per_connection(self) -> jsii.Number:
        return jsii.get(self, "maxRequestsPerConnection")

    @builtins.property
    @jsii.member(jsii_name="maxRetries")
    def max_retries(self) -> jsii.Number:
        return jsii.get(self, "maxRetries")


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project'})
class DataGoogleComputeBackendServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeBackendServiceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeBackendServiceConsistentHash(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceConsistentHash"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendServiceConsistentHash, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="httpCookie")
    def http_cookie(self) -> typing.Any:
        return jsii.get(self, "httpCookie")

    @builtins.property
    @jsii.member(jsii_name="httpHeaderName")
    def http_header_name(self) -> str:
        return jsii.get(self, "httpHeaderName")

    @builtins.property
    @jsii.member(jsii_name="minimumRingSize")
    def minimum_ring_size(self) -> jsii.Number:
        return jsii.get(self, "minimumRingSize")


class DataGoogleComputeBackendServiceConsistentHashHttpCookie(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceConsistentHashHttpCookie"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendServiceConsistentHashHttpCookie, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="path")
    def path(self) -> str:
        return jsii.get(self, "path")

    @builtins.property
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> typing.Any:
        return jsii.get(self, "ttl")


class DataGoogleComputeBackendServiceConsistentHashHttpCookieTtl(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceConsistentHashHttpCookieTtl"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendServiceConsistentHashHttpCookieTtl, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="nanos")
    def nanos(self) -> jsii.Number:
        return jsii.get(self, "nanos")

    @builtins.property
    @jsii.member(jsii_name="seconds")
    def seconds(self) -> jsii.Number:
        return jsii.get(self, "seconds")


class DataGoogleComputeBackendServiceIap(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceIap"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendServiceIap, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="oauth2ClientId")
    def oauth2_client_id(self) -> str:
        return jsii.get(self, "oauth2ClientId")

    @builtins.property
    @jsii.member(jsii_name="oauth2ClientSecret")
    def oauth2_client_secret(self) -> str:
        return jsii.get(self, "oauth2ClientSecret")

    @builtins.property
    @jsii.member(jsii_name="oauth2ClientSecretSha256")
    def oauth2_client_secret_sha256(self) -> str:
        return jsii.get(self, "oauth2ClientSecretSha256")


class DataGoogleComputeBackendServiceLogConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceLogConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendServiceLogConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="enable")
    def enable(self) -> bool:
        return jsii.get(self, "enable")

    @builtins.property
    @jsii.member(jsii_name="sampleRate")
    def sample_rate(self) -> jsii.Number:
        return jsii.get(self, "sampleRate")


class DataGoogleComputeBackendServiceOutlierDetection(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceOutlierDetection"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendServiceOutlierDetection, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="baseEjectionTime")
    def base_ejection_time(self) -> typing.Any:
        return jsii.get(self, "baseEjectionTime")

    @builtins.property
    @jsii.member(jsii_name="consecutiveErrors")
    def consecutive_errors(self) -> jsii.Number:
        return jsii.get(self, "consecutiveErrors")

    @builtins.property
    @jsii.member(jsii_name="consecutiveGatewayFailure")
    def consecutive_gateway_failure(self) -> jsii.Number:
        return jsii.get(self, "consecutiveGatewayFailure")

    @builtins.property
    @jsii.member(jsii_name="enforcingConsecutiveErrors")
    def enforcing_consecutive_errors(self) -> jsii.Number:
        return jsii.get(self, "enforcingConsecutiveErrors")

    @builtins.property
    @jsii.member(jsii_name="enforcingConsecutiveGatewayFailure")
    def enforcing_consecutive_gateway_failure(self) -> jsii.Number:
        return jsii.get(self, "enforcingConsecutiveGatewayFailure")

    @builtins.property
    @jsii.member(jsii_name="enforcingSuccessRate")
    def enforcing_success_rate(self) -> jsii.Number:
        return jsii.get(self, "enforcingSuccessRate")

    @builtins.property
    @jsii.member(jsii_name="interval")
    def interval(self) -> typing.Any:
        return jsii.get(self, "interval")

    @builtins.property
    @jsii.member(jsii_name="maxEjectionPercent")
    def max_ejection_percent(self) -> jsii.Number:
        return jsii.get(self, "maxEjectionPercent")

    @builtins.property
    @jsii.member(jsii_name="successRateMinimumHosts")
    def success_rate_minimum_hosts(self) -> jsii.Number:
        return jsii.get(self, "successRateMinimumHosts")

    @builtins.property
    @jsii.member(jsii_name="successRateRequestVolume")
    def success_rate_request_volume(self) -> jsii.Number:
        return jsii.get(self, "successRateRequestVolume")

    @builtins.property
    @jsii.member(jsii_name="successRateStdevFactor")
    def success_rate_stdev_factor(self) -> jsii.Number:
        return jsii.get(self, "successRateStdevFactor")


class DataGoogleComputeBackendServiceOutlierDetectionBaseEjectionTime(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceOutlierDetectionBaseEjectionTime"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendServiceOutlierDetectionBaseEjectionTime, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="nanos")
    def nanos(self) -> jsii.Number:
        return jsii.get(self, "nanos")

    @builtins.property
    @jsii.member(jsii_name="seconds")
    def seconds(self) -> jsii.Number:
        return jsii.get(self, "seconds")


class DataGoogleComputeBackendServiceOutlierDetectionInterval(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeBackendServiceOutlierDetectionInterval"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeBackendServiceOutlierDetectionInterval, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="nanos")
    def nanos(self) -> jsii.Number:
        return jsii.get(self, "nanos")

    @builtins.property
    @jsii.member(jsii_name="seconds")
    def seconds(self) -> jsii.Number:
        return jsii.get(self, "seconds")


class DataGoogleComputeDefaultServiceAccount(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeDefaultServiceAccount"):
    def __init__(self, scope: constructs.Construct, id: str, *, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeDefaultServiceAccountConfig(project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeDefaultServiceAccount, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @builtins.property
    @jsii.member(jsii_name="email")
    def email(self) -> str:
        return jsii.get(self, "email")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="uniqueId")
    def unique_id(self) -> str:
        return jsii.get(self, "uniqueId")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeDefaultServiceAccountConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'project': 'project'})
class DataGoogleComputeDefaultServiceAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeDefaultServiceAccountConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeForwardingRule(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeForwardingRule"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: 
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeForwardingRuleConfig(name=name, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeForwardingRule, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="backendService")
    def backend_service(self) -> str:
        return jsii.get(self, "backendService")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> str:
        return jsii.get(self, "ipAddress")

    @builtins.property
    @jsii.member(jsii_name="ipProtocol")
    def ip_protocol(self) -> str:
        return jsii.get(self, "ipProtocol")

    @builtins.property
    @jsii.member(jsii_name="loadBalancingScheme")
    def load_balancing_scheme(self) -> str:
        return jsii.get(self, "loadBalancingScheme")

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @builtins.property
    @jsii.member(jsii_name="portRange")
    def port_range(self) -> str:
        return jsii.get(self, "portRange")

    @builtins.property
    @jsii.member(jsii_name="ports")
    def ports(self) -> typing.List[str]:
        return jsii.get(self, "ports")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> str:
        return jsii.get(self, "subnetwork")

    @builtins.property
    @jsii.member(jsii_name="target")
    def target(self) -> str:
        return jsii.get(self, "target")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeForwardingRuleConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project', 'region': 'region'})
class DataGoogleComputeForwardingRuleConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: 
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeForwardingRuleConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeGlobalAddress(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeGlobalAddress"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeGlobalAddressConfig(name=name, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeGlobalAddress, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="address")
    def address(self) -> str:
        return jsii.get(self, "address")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="status")
    def status(self) -> str:
        return jsii.get(self, "status")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeGlobalAddressConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project'})
class DataGoogleComputeGlobalAddressConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeGlobalAddressConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeImage(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeImage"):
    def __init__(self, scope: constructs.Construct, id: str, *, family: typing.Optional[str]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param family: 
        :param name: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeImageConfig(family=family, name=name, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeImage, self, [scope, id, config])

    @jsii.member(jsii_name="labels")
    def labels(self, key: str) -> str:
        """
        :param key: -
        """
        return jsii.invoke(self, "labels", [key])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="archiveSizeBytes")
    def archive_size_bytes(self) -> jsii.Number:
        return jsii.get(self, "archiveSizeBytes")

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="diskSizeGb")
    def disk_size_gb(self) -> jsii.Number:
        return jsii.get(self, "diskSizeGb")

    @builtins.property
    @jsii.member(jsii_name="imageEncryptionKeySha256")
    def image_encryption_key_sha256(self) -> str:
        return jsii.get(self, "imageEncryptionKeySha256")

    @builtins.property
    @jsii.member(jsii_name="imageId")
    def image_id(self) -> str:
        return jsii.get(self, "imageId")

    @builtins.property
    @jsii.member(jsii_name="labelFingerprint")
    def label_fingerprint(self) -> str:
        return jsii.get(self, "labelFingerprint")

    @builtins.property
    @jsii.member(jsii_name="licenses")
    def licenses(self) -> typing.List[str]:
        return jsii.get(self, "licenses")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="sourceDisk")
    def source_disk(self) -> str:
        return jsii.get(self, "sourceDisk")

    @builtins.property
    @jsii.member(jsii_name="sourceDiskEncryptionKeySha256")
    def source_disk_encryption_key_sha256(self) -> str:
        return jsii.get(self, "sourceDiskEncryptionKeySha256")

    @builtins.property
    @jsii.member(jsii_name="sourceDiskId")
    def source_disk_id(self) -> str:
        return jsii.get(self, "sourceDiskId")

    @builtins.property
    @jsii.member(jsii_name="sourceImageId")
    def source_image_id(self) -> str:
        return jsii.get(self, "sourceImageId")

    @builtins.property
    @jsii.member(jsii_name="status")
    def status(self) -> str:
        return jsii.get(self, "status")

    @builtins.property
    @jsii.member(jsii_name="family")
    def family(self) -> typing.Optional[str]:
        return jsii.get(self, "family")

    @family.setter
    def family(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "family", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeImageConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'family': 'family', 'name': 'name', 'project': 'project'})
class DataGoogleComputeImageConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, family: typing.Optional[str]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param family: 
        :param name: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if family is not None: self._values["family"] = family
        if name is not None: self._values["name"] = name
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def family(self) -> typing.Optional[str]:
        return self._values.get('family')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeImageConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeInstance(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstance"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: typing.Optional[str]=None, project: typing.Optional[str]=None, self_link: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the instance. One of name or self_link must be provided.
        :param project: The ID of the project in which the resource belongs. If self_link is provided, this value is ignored. If neither self_link nor project are provided, the provider project is used.
        :param self_link: The URI of the created resource.
        :param zone: The zone of the instance. If self_link is provided, this value is ignored. If neither self_link nor zone are provided, the provider zone is used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeInstanceConfig(name=name, project=project, self_link=self_link, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeInstance, self, [scope, id, config])

    @jsii.member(jsii_name="attachedDisk")
    def attached_disk(self, index: str) -> "DataGoogleComputeInstanceAttachedDisk":
        """
        :param index: -
        """
        return jsii.invoke(self, "attachedDisk", [index])

    @jsii.member(jsii_name="bootDisk")
    def boot_disk(self, index: str) -> "DataGoogleComputeInstanceBootDisk":
        """
        :param index: -
        """
        return jsii.invoke(self, "bootDisk", [index])

    @jsii.member(jsii_name="guestAccelerator")
    def guest_accelerator(self, index: str) -> "DataGoogleComputeInstanceGuestAccelerator":
        """
        :param index: -
        """
        return jsii.invoke(self, "guestAccelerator", [index])

    @jsii.member(jsii_name="labels")
    def labels(self, key: str) -> str:
        """
        :param key: -
        """
        return jsii.invoke(self, "labels", [key])

    @jsii.member(jsii_name="metadata")
    def metadata(self, key: str) -> str:
        """
        :param key: -
        """
        return jsii.invoke(self, "metadata", [key])

    @jsii.member(jsii_name="networkInterface")
    def network_interface(self, index: str) -> "DataGoogleComputeInstanceNetworkInterface":
        """
        :param index: -
        """
        return jsii.invoke(self, "networkInterface", [index])

    @jsii.member(jsii_name="scheduling")
    def scheduling(self, index: str) -> "DataGoogleComputeInstanceScheduling":
        """
        :param index: -
        """
        return jsii.invoke(self, "scheduling", [index])

    @jsii.member(jsii_name="scratchDisk")
    def scratch_disk(self, index: str) -> "DataGoogleComputeInstanceScratchDisk":
        """
        :param index: -
        """
        return jsii.invoke(self, "scratchDisk", [index])

    @jsii.member(jsii_name="serviceAccount")
    def service_account(self, index: str) -> "DataGoogleComputeInstanceServiceAccount":
        """
        :param index: -
        """
        return jsii.invoke(self, "serviceAccount", [index])

    @jsii.member(jsii_name="shieldedInstanceConfig")
    def shielded_instance_config(self, index: str) -> "DataGoogleComputeInstanceShieldedInstanceConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "shieldedInstanceConfig", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="allowStoppingForUpdate")
    def allow_stopping_for_update(self) -> bool:
        return jsii.get(self, "allowStoppingForUpdate")

    @builtins.property
    @jsii.member(jsii_name="canIpForward")
    def can_ip_forward(self) -> bool:
        return jsii.get(self, "canIpForward")

    @builtins.property
    @jsii.member(jsii_name="cpuPlatform")
    def cpu_platform(self) -> str:
        return jsii.get(self, "cpuPlatform")

    @builtins.property
    @jsii.member(jsii_name="currentStatus")
    def current_status(self) -> str:
        return jsii.get(self, "currentStatus")

    @builtins.property
    @jsii.member(jsii_name="deletionProtection")
    def deletion_protection(self) -> bool:
        return jsii.get(self, "deletionProtection")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="desiredStatus")
    def desired_status(self) -> str:
        return jsii.get(self, "desiredStatus")

    @builtins.property
    @jsii.member(jsii_name="enableDisplay")
    def enable_display(self) -> bool:
        return jsii.get(self, "enableDisplay")

    @builtins.property
    @jsii.member(jsii_name="hostname")
    def hostname(self) -> str:
        return jsii.get(self, "hostname")

    @builtins.property
    @jsii.member(jsii_name="instanceId")
    def instance_id(self) -> str:
        return jsii.get(self, "instanceId")

    @builtins.property
    @jsii.member(jsii_name="labelFingerprint")
    def label_fingerprint(self) -> str:
        return jsii.get(self, "labelFingerprint")

    @builtins.property
    @jsii.member(jsii_name="machineType")
    def machine_type(self) -> str:
        return jsii.get(self, "machineType")

    @builtins.property
    @jsii.member(jsii_name="metadataFingerprint")
    def metadata_fingerprint(self) -> str:
        return jsii.get(self, "metadataFingerprint")

    @builtins.property
    @jsii.member(jsii_name="metadataStartupScript")
    def metadata_startup_script(self) -> str:
        return jsii.get(self, "metadataStartupScript")

    @builtins.property
    @jsii.member(jsii_name="minCpuPlatform")
    def min_cpu_platform(self) -> str:
        return jsii.get(self, "minCpuPlatform")

    @builtins.property
    @jsii.member(jsii_name="resourcePolicies")
    def resource_policies(self) -> typing.List[str]:
        return jsii.get(self, "resourcePolicies")

    @builtins.property
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.List[str]:
        return jsii.get(self, "tags")

    @builtins.property
    @jsii.member(jsii_name="tagsFingerprint")
    def tags_fingerprint(self) -> str:
        return jsii.get(self, "tagsFingerprint")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> typing.Optional[str]:
        return jsii.get(self, "selfLink")

    @self_link.setter
    def self_link(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "selfLink", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


class DataGoogleComputeInstanceAttachedDisk(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceAttachedDisk"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceAttachedDisk, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="deviceName")
    def device_name(self) -> str:
        return jsii.get(self, "deviceName")

    @builtins.property
    @jsii.member(jsii_name="diskEncryptionKeyRaw")
    def disk_encryption_key_raw(self) -> str:
        return jsii.get(self, "diskEncryptionKeyRaw")

    @builtins.property
    @jsii.member(jsii_name="diskEncryptionKeySha256")
    def disk_encryption_key_sha256(self) -> str:
        return jsii.get(self, "diskEncryptionKeySha256")

    @builtins.property
    @jsii.member(jsii_name="kmsKeySelfLink")
    def kms_key_self_link(self) -> str:
        return jsii.get(self, "kmsKeySelfLink")

    @builtins.property
    @jsii.member(jsii_name="mode")
    def mode(self) -> str:
        return jsii.get(self, "mode")

    @builtins.property
    @jsii.member(jsii_name="source")
    def source(self) -> str:
        return jsii.get(self, "source")


class DataGoogleComputeInstanceBootDisk(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceBootDisk"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceBootDisk, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="autoDelete")
    def auto_delete(self) -> bool:
        return jsii.get(self, "autoDelete")

    @builtins.property
    @jsii.member(jsii_name="deviceName")
    def device_name(self) -> str:
        return jsii.get(self, "deviceName")

    @builtins.property
    @jsii.member(jsii_name="diskEncryptionKeyRaw")
    def disk_encryption_key_raw(self) -> str:
        return jsii.get(self, "diskEncryptionKeyRaw")

    @builtins.property
    @jsii.member(jsii_name="diskEncryptionKeySha256")
    def disk_encryption_key_sha256(self) -> str:
        return jsii.get(self, "diskEncryptionKeySha256")

    @builtins.property
    @jsii.member(jsii_name="initializeParams")
    def initialize_params(self) -> typing.Any:
        return jsii.get(self, "initializeParams")

    @builtins.property
    @jsii.member(jsii_name="kmsKeySelfLink")
    def kms_key_self_link(self) -> str:
        return jsii.get(self, "kmsKeySelfLink")

    @builtins.property
    @jsii.member(jsii_name="mode")
    def mode(self) -> str:
        return jsii.get(self, "mode")

    @builtins.property
    @jsii.member(jsii_name="source")
    def source(self) -> str:
        return jsii.get(self, "source")


class DataGoogleComputeInstanceBootDiskInitializeParams(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceBootDiskInitializeParams"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceBootDiskInitializeParams, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="image")
    def image(self) -> str:
        return jsii.get(self, "image")

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Any:
        return jsii.get(self, "labels")

    @builtins.property
    @jsii.member(jsii_name="size")
    def size(self) -> jsii.Number:
        return jsii.get(self, "size")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project', 'self_link': 'selfLink', 'zone': 'zone'})
class DataGoogleComputeInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, self_link: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the instance. One of name or self_link must be provided.
        :param project: The ID of the project in which the resource belongs. If self_link is provided, this value is ignored. If neither self_link nor project are provided, the provider project is used.
        :param self_link: The URI of the created resource.
        :param zone: The zone of the instance. If self_link is provided, this value is ignored. If neither self_link nor zone are provided, the provider zone is used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if name is not None: self._values["name"] = name
        if project is not None: self._values["project"] = project
        if self_link is not None: self._values["self_link"] = self_link
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """The name of the instance.

        One of name or self_link must be provided.
        """
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If self_link is provided, this value is ignored. If neither self_link nor project are provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def self_link(self) -> typing.Optional[str]:
        """The URI of the created resource."""
        return self._values.get('self_link')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The zone of the instance.

        If self_link is provided, this value is ignored. If neither self_link nor zone are provided, the provider zone is used.
        """
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeInstanceGroup(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceGroup"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: typing.Optional[str]=None, project: typing.Optional[str]=None, self_link: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: 
        :param project: 
        :param self_link: 
        :param zone: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeInstanceGroupConfig(name=name, project=project, self_link=self_link, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeInstanceGroup, self, [scope, id, config])

    @jsii.member(jsii_name="namedPort")
    def named_port(self, index: str) -> "DataGoogleComputeInstanceGroupNamedPort":
        """
        :param index: -
        """
        return jsii.invoke(self, "namedPort", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="instances")
    def instances(self) -> typing.List[str]:
        return jsii.get(self, "instances")

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @builtins.property
    @jsii.member(jsii_name="size")
    def size(self) -> jsii.Number:
        return jsii.get(self, "size")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> typing.Optional[str]:
        return jsii.get(self, "selfLink")

    @self_link.setter
    def self_link(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "selfLink", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceGroupConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project', 'self_link': 'selfLink', 'zone': 'zone'})
class DataGoogleComputeInstanceGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, self_link: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: 
        :param project: 
        :param self_link: 
        :param zone: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if name is not None: self._values["name"] = name
        if project is not None: self._values["project"] = project
        if self_link is not None: self._values["self_link"] = self_link
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def self_link(self) -> typing.Optional[str]:
        return self._values.get('self_link')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeInstanceGroupConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeInstanceGroupNamedPort(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceGroupNamedPort"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceGroupNamedPort, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")


class DataGoogleComputeInstanceGuestAccelerator(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceGuestAccelerator"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceGuestAccelerator, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="count")
    def count(self) -> jsii.Number:
        return jsii.get(self, "count")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")


class DataGoogleComputeInstanceNetworkInterface(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceNetworkInterface"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceNetworkInterface, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="accessConfig")
    def access_config(self) -> typing.Any:
        return jsii.get(self, "accessConfig")

    @builtins.property
    @jsii.member(jsii_name="aliasIpRange")
    def alias_ip_range(self) -> typing.Any:
        return jsii.get(self, "aliasIpRange")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @builtins.property
    @jsii.member(jsii_name="networkIp")
    def network_ip(self) -> str:
        return jsii.get(self, "networkIp")

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> str:
        return jsii.get(self, "subnetwork")

    @builtins.property
    @jsii.member(jsii_name="subnetworkProject")
    def subnetwork_project(self) -> str:
        return jsii.get(self, "subnetworkProject")


class DataGoogleComputeInstanceNetworkInterfaceAccessConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceNetworkInterfaceAccessConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceNetworkInterfaceAccessConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="natIp")
    def nat_ip(self) -> str:
        return jsii.get(self, "natIp")

    @builtins.property
    @jsii.member(jsii_name="networkTier")
    def network_tier(self) -> str:
        return jsii.get(self, "networkTier")

    @builtins.property
    @jsii.member(jsii_name="publicPtrDomainName")
    def public_ptr_domain_name(self) -> str:
        return jsii.get(self, "publicPtrDomainName")


class DataGoogleComputeInstanceNetworkInterfaceAliasIpRange(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceNetworkInterfaceAliasIpRange"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceNetworkInterfaceAliasIpRange, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="ipCidrRange")
    def ip_cidr_range(self) -> str:
        return jsii.get(self, "ipCidrRange")

    @builtins.property
    @jsii.member(jsii_name="subnetworkRangeName")
    def subnetwork_range_name(self) -> str:
        return jsii.get(self, "subnetworkRangeName")


class DataGoogleComputeInstanceScheduling(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceScheduling"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceScheduling, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="automaticRestart")
    def automatic_restart(self) -> bool:
        return jsii.get(self, "automaticRestart")

    @builtins.property
    @jsii.member(jsii_name="nodeAffinities")
    def node_affinities(self) -> typing.Any:
        return jsii.get(self, "nodeAffinities")

    @builtins.property
    @jsii.member(jsii_name="onHostMaintenance")
    def on_host_maintenance(self) -> str:
        return jsii.get(self, "onHostMaintenance")

    @builtins.property
    @jsii.member(jsii_name="preemptible")
    def preemptible(self) -> bool:
        return jsii.get(self, "preemptible")


class DataGoogleComputeInstanceSchedulingNodeAffinities(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceSchedulingNodeAffinities"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceSchedulingNodeAffinities, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="key")
    def key(self) -> str:
        return jsii.get(self, "key")

    @builtins.property
    @jsii.member(jsii_name="operator")
    def operator(self) -> str:
        return jsii.get(self, "operator")

    @builtins.property
    @jsii.member(jsii_name="values")
    def values(self) -> typing.List[str]:
        return jsii.get(self, "values")


class DataGoogleComputeInstanceScratchDisk(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceScratchDisk"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceScratchDisk, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="interface")
    def interface(self) -> str:
        return jsii.get(self, "interface")


class DataGoogleComputeInstanceSerialPort(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceSerialPort"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, port: jsii.Number, project: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: 
        :param port: 
        :param project: 
        :param zone: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeInstanceSerialPortConfig(instance=instance, port=port, project=project, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeInstanceSerialPort, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="contents")
    def contents(self) -> str:
        return jsii.get(self, "contents")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")

    @port.setter
    def port(self, value: jsii.Number) -> None:
        jsii.set(self, "port", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceSerialPortConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'port': 'port', 'project': 'project', 'zone': 'zone'})
class DataGoogleComputeInstanceSerialPortConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, port: jsii.Number, project: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: 
        :param port: 
        :param project: 
        :param zone: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance': instance,
            'port': port,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def port(self) -> jsii.Number:
        return self._values.get('port')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeInstanceSerialPortConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeInstanceServiceAccount(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceServiceAccount"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceServiceAccount, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="email")
    def email(self) -> str:
        return jsii.get(self, "email")

    @builtins.property
    @jsii.member(jsii_name="scopes")
    def scopes(self) -> typing.List[str]:
        return jsii.get(self, "scopes")


class DataGoogleComputeInstanceShieldedInstanceConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeInstanceShieldedInstanceConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeInstanceShieldedInstanceConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="enableIntegrityMonitoring")
    def enable_integrity_monitoring(self) -> bool:
        return jsii.get(self, "enableIntegrityMonitoring")

    @builtins.property
    @jsii.member(jsii_name="enableSecureBoot")
    def enable_secure_boot(self) -> bool:
        return jsii.get(self, "enableSecureBoot")

    @builtins.property
    @jsii.member(jsii_name="enableVtpm")
    def enable_vtpm(self) -> bool:
        return jsii.get(self, "enableVtpm")


class DataGoogleComputeLbIpRanges(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeLbIpRanges"):
    def __init__(self, scope: constructs.Construct, id: str, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeLbIpRangesConfig(count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeLbIpRanges, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="httpSslTcpInternal")
    def http_ssl_tcp_internal(self) -> typing.List[str]:
        return jsii.get(self, "httpSslTcpInternal")

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> typing.List[str]:
        return jsii.get(self, "network")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeLbIpRangesConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider'})
class DataGoogleComputeLbIpRangesConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeLbIpRangesConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeNetwork(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeNetwork"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeNetworkConfig(name=name, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeNetwork, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="gatewayIpv4")
    def gateway_ipv4(self) -> str:
        return jsii.get(self, "gatewayIpv4")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="subnetworksSelfLinks")
    def subnetworks_self_links(self) -> typing.List[str]:
        return jsii.get(self, "subnetworksSelfLinks")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeNetworkConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project'})
class DataGoogleComputeNetworkConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeNetworkConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeNetworkEndpointGroup(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeNetworkEndpointGroup"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: typing.Optional[str]=None, project: typing.Optional[str]=None, self_link: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param project: 
        :param self_link: 
        :param zone: Zone where the network endpoint group is located.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeNetworkEndpointGroupConfig(name=name, project=project, self_link=self_link, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeNetworkEndpointGroup, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="defaultPort")
    def default_port(self) -> jsii.Number:
        return jsii.get(self, "defaultPort")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @builtins.property
    @jsii.member(jsii_name="networkEndpointType")
    def network_endpoint_type(self) -> str:
        return jsii.get(self, "networkEndpointType")

    @builtins.property
    @jsii.member(jsii_name="size")
    def size(self) -> jsii.Number:
        return jsii.get(self, "size")

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> str:
        return jsii.get(self, "subnetwork")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> typing.Optional[str]:
        return jsii.get(self, "selfLink")

    @self_link.setter
    def self_link(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "selfLink", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeNetworkEndpointGroupConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project', 'self_link': 'selfLink', 'zone': 'zone'})
class DataGoogleComputeNetworkEndpointGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, self_link: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param project: 
        :param self_link: 
        :param zone: Zone where the network endpoint group is located.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if name is not None: self._values["name"] = name
        if project is not None: self._values["project"] = project
        if self_link is not None: self._values["self_link"] = self_link
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """Name of the resource;

        provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def self_link(self) -> typing.Optional[str]:
        return self._values.get('self_link')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """Zone where the network endpoint group is located."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeNetworkEndpointGroupConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeNodeTypes(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeNodeTypes"):
    def __init__(self, scope: constructs.Construct, id: str, *, project: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param project: 
        :param zone: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeNodeTypesConfig(project=project, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeNodeTypes, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="names")
    def names(self) -> typing.List[str]:
        return jsii.get(self, "names")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeNodeTypesConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'project': 'project', 'zone': 'zone'})
class DataGoogleComputeNodeTypesConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, project: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param project: 
        :param zone: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeNodeTypesConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeRegionInstanceGroup(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeRegionInstanceGroup"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, self_link: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: 
        :param project: 
        :param region: 
        :param self_link: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeRegionInstanceGroupConfig(name=name, project=project, region=region, self_link=self_link, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeRegionInstanceGroup, self, [scope, id, config])

    @jsii.member(jsii_name="instances")
    def instances(self, index: str) -> "DataGoogleComputeRegionInstanceGroupInstances":
        """
        :param index: -
        """
        return jsii.invoke(self, "instances", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="size")
    def size(self) -> jsii.Number:
        return jsii.get(self, "size")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> typing.Optional[str]:
        return jsii.get(self, "selfLink")

    @self_link.setter
    def self_link(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "selfLink", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeRegionInstanceGroupConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project', 'region': 'region', 'self_link': 'selfLink'})
class DataGoogleComputeRegionInstanceGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, self_link: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: 
        :param project: 
        :param region: 
        :param self_link: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if name is not None: self._values["name"] = name
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if self_link is not None: self._values["self_link"] = self_link

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    @builtins.property
    def self_link(self) -> typing.Optional[str]:
        return self._values.get('self_link')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeRegionInstanceGroupConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeRegionInstanceGroupInstances(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeRegionInstanceGroupInstances"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeRegionInstanceGroupInstances, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @builtins.property
    @jsii.member(jsii_name="namedPorts")
    def named_ports(self) -> typing.Any:
        return jsii.get(self, "namedPorts")

    @builtins.property
    @jsii.member(jsii_name="status")
    def status(self) -> str:
        return jsii.get(self, "status")


class DataGoogleComputeRegionInstanceGroupInstancesNamedPorts(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeRegionInstanceGroupInstancesNamedPorts"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeRegionInstanceGroupInstancesNamedPorts, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")


class DataGoogleComputeRegions(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeRegions"):
    def __init__(self, scope: constructs.Construct, id: str, *, project: typing.Optional[str]=None, status: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param project: 
        :param status: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeRegionsConfig(project=project, status=status, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeRegions, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="names")
    def names(self) -> typing.List[str]:
        return jsii.get(self, "names")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="status")
    def status(self) -> typing.Optional[str]:
        return jsii.get(self, "status")

    @status.setter
    def status(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "status", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeRegionsConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'project': 'project', 'status': 'status'})
class DataGoogleComputeRegionsConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, project: typing.Optional[str]=None, status: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param project: 
        :param status: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if status is not None: self._values["status"] = status

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def status(self) -> typing.Optional[str]:
        return self._values.get('status')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeRegionsConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeRouter(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeRouter"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, network: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: A reference to the network to which this router belongs.
        :param project: 
        :param region: Region where the router resides.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeRouterConfig(name=name, network=network, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeRouter, self, [scope, id, config])

    @jsii.member(jsii_name="bgp")
    def bgp(self, index: str) -> "DataGoogleComputeRouterBgp":
        """
        :param index: -
        """
        return jsii.invoke(self, "bgp", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: str) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


class DataGoogleComputeRouterBgp(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeRouterBgp"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeRouterBgp, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="advertisedGroups")
    def advertised_groups(self) -> typing.List[str]:
        return jsii.get(self, "advertisedGroups")

    @builtins.property
    @jsii.member(jsii_name="advertisedIpRanges")
    def advertised_ip_ranges(self) -> typing.Any:
        return jsii.get(self, "advertisedIpRanges")

    @builtins.property
    @jsii.member(jsii_name="advertiseMode")
    def advertise_mode(self) -> str:
        return jsii.get(self, "advertiseMode")

    @builtins.property
    @jsii.member(jsii_name="asn")
    def asn(self) -> jsii.Number:
        return jsii.get(self, "asn")


class DataGoogleComputeRouterBgpAdvertisedIpRanges(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeRouterBgpAdvertisedIpRanges"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeRouterBgpAdvertisedIpRanges, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="range")
    def range(self) -> str:
        return jsii.get(self, "range")


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeRouterConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'network': 'network', 'project': 'project', 'region': 'region'})
class DataGoogleComputeRouterConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, network: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param network: A reference to the network to which this router belongs.
        :param project: 
        :param region: Region where the router resides.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
            'network': network,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        The name must be 1-63 characters long, and
        comply with RFC1035. Specifically, the name must be 1-63 characters
        long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?'
        which means the first character must be a lowercase letter, and all
        following characters must be a dash, lowercase letter, or digit,
        except the last character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def network(self) -> str:
        """A reference to the network to which this router belongs."""
        return self._values.get('network')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """Region where the router resides."""
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeRouterConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeSslCertificate(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeSslCertificate"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash. These are in the same namespace as the managed SSL certificates.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeSslCertificateConfig(name=name, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeSslCertificate, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="certificate")
    def certificate(self) -> str:
        return jsii.get(self, "certificate")

    @builtins.property
    @jsii.member(jsii_name="certificateId")
    def certificate_id(self) -> jsii.Number:
        return jsii.get(self, "certificateId")

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="namePrefix")
    def name_prefix(self) -> str:
        return jsii.get(self, "namePrefix")

    @builtins.property
    @jsii.member(jsii_name="privateKey")
    def private_key(self) -> str:
        return jsii.get(self, "privateKey")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeSslCertificateConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project'})
class DataGoogleComputeSslCertificateConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash. These are in the same namespace as the managed SSL certificates.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.

        These are in the same namespace as the managed SSL certificates.
        """
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeSslCertificateConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeSslPolicy(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeSslPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeSslPolicyConfig(name=name, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeSslPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTimestamp")
    def creation_timestamp(self) -> str:
        return jsii.get(self, "creationTimestamp")

    @builtins.property
    @jsii.member(jsii_name="customFeatures")
    def custom_features(self) -> typing.List[str]:
        return jsii.get(self, "customFeatures")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="enabledFeatures")
    def enabled_features(self) -> typing.List[str]:
        return jsii.get(self, "enabledFeatures")

    @builtins.property
    @jsii.member(jsii_name="fingerprint")
    def fingerprint(self) -> str:
        return jsii.get(self, "fingerprint")

    @builtins.property
    @jsii.member(jsii_name="minTlsVersion")
    def min_tls_version(self) -> str:
        return jsii.get(self, "minTlsVersion")

    @builtins.property
    @jsii.member(jsii_name="profile")
    def profile(self) -> str:
        return jsii.get(self, "profile")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeSslPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project'})
class DataGoogleComputeSslPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the resource.

        Provided by the client when the resource is
        created. The name must be 1-63 characters long, and comply with
        RFC1035. Specifically, the name must be 1-63 characters long and match
        the regular expression '`a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_?' which means the
        first character must be a lowercase letter, and all following
        characters must be a dash, lowercase letter, or digit, except the last
        character, which cannot be a dash.
        """
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeSslPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeSubnetwork(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeSubnetwork"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, self_link: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: 
        :param project: 
        :param region: 
        :param self_link: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeSubnetworkConfig(name=name, project=project, region=region, self_link=self_link, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeSubnetwork, self, [scope, id, config])

    @jsii.member(jsii_name="secondaryIpRange")
    def secondary_ip_range(self, index: str) -> "DataGoogleComputeSubnetworkSecondaryIpRange":
        """
        :param index: -
        """
        return jsii.invoke(self, "secondaryIpRange", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="gatewayAddress")
    def gateway_address(self) -> str:
        return jsii.get(self, "gatewayAddress")

    @builtins.property
    @jsii.member(jsii_name="ipCidrRange")
    def ip_cidr_range(self) -> str:
        return jsii.get(self, "ipCidrRange")

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @builtins.property
    @jsii.member(jsii_name="privateIpGoogleAccess")
    def private_ip_google_access(self) -> bool:
        return jsii.get(self, "privateIpGoogleAccess")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> typing.Optional[str]:
        return jsii.get(self, "selfLink")

    @self_link.setter
    def self_link(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "selfLink", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeSubnetworkConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project', 'region': 'region', 'self_link': 'selfLink'})
class DataGoogleComputeSubnetworkConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, self_link: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: 
        :param project: 
        :param region: 
        :param self_link: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if name is not None: self._values["name"] = name
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if self_link is not None: self._values["self_link"] = self_link

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    @builtins.property
    def self_link(self) -> typing.Optional[str]:
        return self._values.get('self_link')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeSubnetworkConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeSubnetworkSecondaryIpRange(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeSubnetworkSecondaryIpRange"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleComputeSubnetworkSecondaryIpRange, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="ipCidrRange")
    def ip_cidr_range(self) -> str:
        return jsii.get(self, "ipCidrRange")

    @builtins.property
    @jsii.member(jsii_name="rangeName")
    def range_name(self) -> str:
        return jsii.get(self, "rangeName")


class DataGoogleComputeVpnGateway(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeVpnGateway"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: 
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeVpnGatewayConfig(name=name, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeVpnGateway, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeVpnGatewayConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project', 'region': 'region'})
class DataGoogleComputeVpnGatewayConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: 
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeVpnGatewayConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleComputeZones(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleComputeZones"):
    def __init__(self, scope: constructs.Construct, id: str, *, project: typing.Optional[str]=None, region: typing.Optional[str]=None, status: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param project: 
        :param region: 
        :param status: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleComputeZonesConfig(project=project, region=region, status=status, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleComputeZones, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="names")
    def names(self) -> typing.List[str]:
        return jsii.get(self, "names")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="status")
    def status(self) -> typing.Optional[str]:
        return jsii.get(self, "status")

    @status.setter
    def status(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "status", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleComputeZonesConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'project': 'project', 'region': 'region', 'status': 'status'})
class DataGoogleComputeZonesConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, status: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param project: 
        :param region: 
        :param status: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if status is not None: self._values["status"] = status

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    @builtins.property
    def status(self) -> typing.Optional[str]:
        return self._values.get('status')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleComputeZonesConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleContainerCluster(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerCluster"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, location: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the cluster, unique within the project and location.
        :param location: The location (region or zone) in which the cluster master will be created, as well as the default node location. If you specify a zone (such as us-central1-a), the cluster will be a zonal cluster with a single cluster master. If you specify a region (such as us-west1), the cluster will be a regional cluster with multiple masters spread across zones in the region, and with default node locations in those zones as well.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param region: The region in which the cluster master will be created. Zone and region have been removed in favor of location.
        :param zone: The zone in which the cluster master will be created. Zone and region have been removed in favor of location.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleContainerClusterConfig(name=name, location=location, project=project, region=region, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleContainerCluster, self, [scope, id, config])

    @jsii.member(jsii_name="addonsConfig")
    def addons_config(self, index: str) -> "DataGoogleContainerClusterAddonsConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "addonsConfig", [index])

    @jsii.member(jsii_name="authenticatorGroupsConfig")
    def authenticator_groups_config(self, index: str) -> "DataGoogleContainerClusterAuthenticatorGroupsConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "authenticatorGroupsConfig", [index])

    @jsii.member(jsii_name="clusterAutoscaling")
    def cluster_autoscaling(self, index: str) -> "DataGoogleContainerClusterClusterAutoscaling":
        """
        :param index: -
        """
        return jsii.invoke(self, "clusterAutoscaling", [index])

    @jsii.member(jsii_name="databaseEncryption")
    def database_encryption(self, index: str) -> "DataGoogleContainerClusterDatabaseEncryption":
        """
        :param index: -
        """
        return jsii.invoke(self, "databaseEncryption", [index])

    @jsii.member(jsii_name="ipAllocationPolicy")
    def ip_allocation_policy(self, index: str) -> "DataGoogleContainerClusterIpAllocationPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "ipAllocationPolicy", [index])

    @jsii.member(jsii_name="maintenancePolicy")
    def maintenance_policy(self, index: str) -> "DataGoogleContainerClusterMaintenancePolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "maintenancePolicy", [index])

    @jsii.member(jsii_name="masterAuth")
    def master_auth(self, index: str) -> "DataGoogleContainerClusterMasterAuth":
        """
        :param index: -
        """
        return jsii.invoke(self, "masterAuth", [index])

    @jsii.member(jsii_name="masterAuthorizedNetworksConfig")
    def master_authorized_networks_config(self, index: str) -> "DataGoogleContainerClusterMasterAuthorizedNetworksConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "masterAuthorizedNetworksConfig", [index])

    @jsii.member(jsii_name="networkPolicy")
    def network_policy(self, index: str) -> "DataGoogleContainerClusterNetworkPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "networkPolicy", [index])

    @jsii.member(jsii_name="nodeConfig")
    def node_config(self, index: str) -> "DataGoogleContainerClusterNodeConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "nodeConfig", [index])

    @jsii.member(jsii_name="nodePool")
    def node_pool(self, index: str) -> "DataGoogleContainerClusterNodePool":
        """
        :param index: -
        """
        return jsii.invoke(self, "nodePool", [index])

    @jsii.member(jsii_name="podSecurityPolicyConfig")
    def pod_security_policy_config(self, index: str) -> "DataGoogleContainerClusterPodSecurityPolicyConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "podSecurityPolicyConfig", [index])

    @jsii.member(jsii_name="privateClusterConfig")
    def private_cluster_config(self, index: str) -> "DataGoogleContainerClusterPrivateClusterConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "privateClusterConfig", [index])

    @jsii.member(jsii_name="releaseChannel")
    def release_channel(self, index: str) -> "DataGoogleContainerClusterReleaseChannel":
        """
        :param index: -
        """
        return jsii.invoke(self, "releaseChannel", [index])

    @jsii.member(jsii_name="resourceLabels")
    def resource_labels(self, key: str) -> str:
        """
        :param key: -
        """
        return jsii.invoke(self, "resourceLabels", [key])

    @jsii.member(jsii_name="resourceUsageExportConfig")
    def resource_usage_export_config(self, index: str) -> "DataGoogleContainerClusterResourceUsageExportConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "resourceUsageExportConfig", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="verticalPodAutoscaling")
    def vertical_pod_autoscaling(self, index: str) -> "DataGoogleContainerClusterVerticalPodAutoscaling":
        """
        :param index: -
        """
        return jsii.invoke(self, "verticalPodAutoscaling", [index])

    @jsii.member(jsii_name="workloadIdentityConfig")
    def workload_identity_config(self, index: str) -> "DataGoogleContainerClusterWorkloadIdentityConfig":
        """
        :param index: -
        """
        return jsii.invoke(self, "workloadIdentityConfig", [index])

    @builtins.property
    @jsii.member(jsii_name="additionalZones")
    def additional_zones(self) -> typing.List[str]:
        return jsii.get(self, "additionalZones")

    @builtins.property
    @jsii.member(jsii_name="clusterIpv4Cidr")
    def cluster_ipv4_cidr(self) -> str:
        return jsii.get(self, "clusterIpv4Cidr")

    @builtins.property
    @jsii.member(jsii_name="defaultMaxPodsPerNode")
    def default_max_pods_per_node(self) -> jsii.Number:
        return jsii.get(self, "defaultMaxPodsPerNode")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="enableBinaryAuthorization")
    def enable_binary_authorization(self) -> bool:
        return jsii.get(self, "enableBinaryAuthorization")

    @builtins.property
    @jsii.member(jsii_name="enableIntranodeVisibility")
    def enable_intranode_visibility(self) -> bool:
        return jsii.get(self, "enableIntranodeVisibility")

    @builtins.property
    @jsii.member(jsii_name="enableKubernetesAlpha")
    def enable_kubernetes_alpha(self) -> bool:
        return jsii.get(self, "enableKubernetesAlpha")

    @builtins.property
    @jsii.member(jsii_name="enableLegacyAbac")
    def enable_legacy_abac(self) -> bool:
        return jsii.get(self, "enableLegacyAbac")

    @builtins.property
    @jsii.member(jsii_name="enableShieldedNodes")
    def enable_shielded_nodes(self) -> bool:
        return jsii.get(self, "enableShieldedNodes")

    @builtins.property
    @jsii.member(jsii_name="enableTpu")
    def enable_tpu(self) -> bool:
        return jsii.get(self, "enableTpu")

    @builtins.property
    @jsii.member(jsii_name="endpoint")
    def endpoint(self) -> str:
        return jsii.get(self, "endpoint")

    @builtins.property
    @jsii.member(jsii_name="initialNodeCount")
    def initial_node_count(self) -> jsii.Number:
        return jsii.get(self, "initialNodeCount")

    @builtins.property
    @jsii.member(jsii_name="instanceGroupUrls")
    def instance_group_urls(self) -> typing.List[str]:
        return jsii.get(self, "instanceGroupUrls")

    @builtins.property
    @jsii.member(jsii_name="labelFingerprint")
    def label_fingerprint(self) -> str:
        return jsii.get(self, "labelFingerprint")

    @builtins.property
    @jsii.member(jsii_name="loggingService")
    def logging_service(self) -> str:
        return jsii.get(self, "loggingService")

    @builtins.property
    @jsii.member(jsii_name="masterVersion")
    def master_version(self) -> str:
        return jsii.get(self, "masterVersion")

    @builtins.property
    @jsii.member(jsii_name="minMasterVersion")
    def min_master_version(self) -> str:
        return jsii.get(self, "minMasterVersion")

    @builtins.property
    @jsii.member(jsii_name="monitoringService")
    def monitoring_service(self) -> str:
        return jsii.get(self, "monitoringService")

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @builtins.property
    @jsii.member(jsii_name="nodeLocations")
    def node_locations(self) -> typing.List[str]:
        return jsii.get(self, "nodeLocations")

    @builtins.property
    @jsii.member(jsii_name="nodeVersion")
    def node_version(self) -> str:
        return jsii.get(self, "nodeVersion")

    @builtins.property
    @jsii.member(jsii_name="operation")
    def operation(self) -> str:
        return jsii.get(self, "operation")

    @builtins.property
    @jsii.member(jsii_name="removeDefaultNodePool")
    def remove_default_node_pool(self) -> bool:
        return jsii.get(self, "removeDefaultNodePool")

    @builtins.property
    @jsii.member(jsii_name="servicesIpv4Cidr")
    def services_ipv4_cidr(self) -> str:
        return jsii.get(self, "servicesIpv4Cidr")

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> str:
        return jsii.get(self, "subnetwork")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


class DataGoogleContainerClusterAddonsConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterAddonsConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterAddonsConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="cloudrunConfig")
    def cloudrun_config(self) -> typing.Any:
        return jsii.get(self, "cloudrunConfig")

    @builtins.property
    @jsii.member(jsii_name="horizontalPodAutoscaling")
    def horizontal_pod_autoscaling(self) -> typing.Any:
        return jsii.get(self, "horizontalPodAutoscaling")

    @builtins.property
    @jsii.member(jsii_name="httpLoadBalancing")
    def http_load_balancing(self) -> typing.Any:
        return jsii.get(self, "httpLoadBalancing")

    @builtins.property
    @jsii.member(jsii_name="kubernetesDashboard")
    def kubernetes_dashboard(self) -> typing.Any:
        return jsii.get(self, "kubernetesDashboard")

    @builtins.property
    @jsii.member(jsii_name="networkPolicyConfig")
    def network_policy_config(self) -> typing.Any:
        return jsii.get(self, "networkPolicyConfig")


class DataGoogleContainerClusterAddonsConfigCloudrunConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterAddonsConfigCloudrunConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterAddonsConfigCloudrunConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="disabled")
    def disabled(self) -> bool:
        return jsii.get(self, "disabled")


class DataGoogleContainerClusterAddonsConfigHorizontalPodAutoscaling(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterAddonsConfigHorizontalPodAutoscaling"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterAddonsConfigHorizontalPodAutoscaling, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="disabled")
    def disabled(self) -> bool:
        return jsii.get(self, "disabled")


class DataGoogleContainerClusterAddonsConfigHttpLoadBalancing(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterAddonsConfigHttpLoadBalancing"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterAddonsConfigHttpLoadBalancing, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="disabled")
    def disabled(self) -> bool:
        return jsii.get(self, "disabled")


class DataGoogleContainerClusterAddonsConfigKubernetesDashboard(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterAddonsConfigKubernetesDashboard"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterAddonsConfigKubernetesDashboard, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="disabled")
    def disabled(self) -> bool:
        return jsii.get(self, "disabled")


class DataGoogleContainerClusterAddonsConfigNetworkPolicyConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterAddonsConfigNetworkPolicyConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterAddonsConfigNetworkPolicyConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="disabled")
    def disabled(self) -> bool:
        return jsii.get(self, "disabled")


class DataGoogleContainerClusterAuthenticatorGroupsConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterAuthenticatorGroupsConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterAuthenticatorGroupsConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="securityGroup")
    def security_group(self) -> str:
        return jsii.get(self, "securityGroup")


class DataGoogleContainerClusterClusterAutoscaling(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterClusterAutoscaling"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterClusterAutoscaling, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="autoProvisioningDefaults")
    def auto_provisioning_defaults(self) -> typing.Any:
        return jsii.get(self, "autoProvisioningDefaults")

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> bool:
        return jsii.get(self, "enabled")

    @builtins.property
    @jsii.member(jsii_name="resourceLimits")
    def resource_limits(self) -> typing.Any:
        return jsii.get(self, "resourceLimits")


class DataGoogleContainerClusterClusterAutoscalingAutoProvisioningDefaults(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterClusterAutoscalingAutoProvisioningDefaults"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterClusterAutoscalingAutoProvisioningDefaults, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="oauthScopes")
    def oauth_scopes(self) -> typing.List[str]:
        return jsii.get(self, "oauthScopes")

    @builtins.property
    @jsii.member(jsii_name="serviceAccount")
    def service_account(self) -> str:
        return jsii.get(self, "serviceAccount")


class DataGoogleContainerClusterClusterAutoscalingResourceLimits(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterClusterAutoscalingResourceLimits"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterClusterAutoscalingResourceLimits, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="maximum")
    def maximum(self) -> jsii.Number:
        return jsii.get(self, "maximum")

    @builtins.property
    @jsii.member(jsii_name="minimum")
    def minimum(self) -> jsii.Number:
        return jsii.get(self, "minimum")

    @builtins.property
    @jsii.member(jsii_name="resourceType")
    def resource_type(self) -> str:
        return jsii.get(self, "resourceType")


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleContainerClusterConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'location': 'location', 'project': 'project', 'region': 'region', 'zone': 'zone'})
class DataGoogleContainerClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, location: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the cluster, unique within the project and location.
        :param location: The location (region or zone) in which the cluster master will be created, as well as the default node location. If you specify a zone (such as us-central1-a), the cluster will be a zonal cluster with a single cluster master. If you specify a region (such as us-west1), the cluster will be a regional cluster with multiple masters spread across zones in the region, and with default node locations in those zones as well.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param region: The region in which the cluster master will be created. Zone and region have been removed in favor of location.
        :param zone: The zone in which the cluster master will be created. Zone and region have been removed in favor of location.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name of the cluster, unique within the project and location."""
        return self._values.get('name')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """The location (region or zone) in which the cluster master will be created, as well as the default node location.

        If you specify a zone (such as us-central1-a), the cluster will be a zonal cluster with a single cluster master. If you specify a region (such as us-west1), the cluster will be a regional cluster with multiple masters spread across zones in the region, and with default node locations in those zones as well.
        """
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The region in which the cluster master will be created.

        Zone and region have been removed in favor of location.
        """
        return self._values.get('region')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The zone in which the cluster master will be created.

        Zone and region have been removed in favor of location.
        """
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleContainerClusterConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleContainerClusterDatabaseEncryption(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterDatabaseEncryption"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterDatabaseEncryption, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="keyName")
    def key_name(self) -> str:
        return jsii.get(self, "keyName")

    @builtins.property
    @jsii.member(jsii_name="state")
    def state(self) -> str:
        return jsii.get(self, "state")


class DataGoogleContainerClusterIpAllocationPolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterIpAllocationPolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterIpAllocationPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="clusterIpv4CidrBlock")
    def cluster_ipv4_cidr_block(self) -> str:
        return jsii.get(self, "clusterIpv4CidrBlock")

    @builtins.property
    @jsii.member(jsii_name="clusterSecondaryRangeName")
    def cluster_secondary_range_name(self) -> str:
        return jsii.get(self, "clusterSecondaryRangeName")

    @builtins.property
    @jsii.member(jsii_name="nodeIpv4CidrBlock")
    def node_ipv4_cidr_block(self) -> str:
        return jsii.get(self, "nodeIpv4CidrBlock")

    @builtins.property
    @jsii.member(jsii_name="servicesIpv4CidrBlock")
    def services_ipv4_cidr_block(self) -> str:
        return jsii.get(self, "servicesIpv4CidrBlock")

    @builtins.property
    @jsii.member(jsii_name="servicesSecondaryRangeName")
    def services_secondary_range_name(self) -> str:
        return jsii.get(self, "servicesSecondaryRangeName")

    @builtins.property
    @jsii.member(jsii_name="subnetworkName")
    def subnetwork_name(self) -> str:
        return jsii.get(self, "subnetworkName")


class DataGoogleContainerClusterMaintenancePolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterMaintenancePolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterMaintenancePolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="dailyMaintenanceWindow")
    def daily_maintenance_window(self) -> typing.Any:
        return jsii.get(self, "dailyMaintenanceWindow")

    @builtins.property
    @jsii.member(jsii_name="recurringWindow")
    def recurring_window(self) -> typing.Any:
        return jsii.get(self, "recurringWindow")


class DataGoogleContainerClusterMaintenancePolicyDailyMaintenanceWindow(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterMaintenancePolicyDailyMaintenanceWindow"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterMaintenancePolicyDailyMaintenanceWindow, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="duration")
    def duration(self) -> str:
        return jsii.get(self, "duration")

    @builtins.property
    @jsii.member(jsii_name="startTime")
    def start_time(self) -> str:
        return jsii.get(self, "startTime")


class DataGoogleContainerClusterMaintenancePolicyRecurringWindow(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterMaintenancePolicyRecurringWindow"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterMaintenancePolicyRecurringWindow, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="endTime")
    def end_time(self) -> str:
        return jsii.get(self, "endTime")

    @builtins.property
    @jsii.member(jsii_name="recurrence")
    def recurrence(self) -> str:
        return jsii.get(self, "recurrence")

    @builtins.property
    @jsii.member(jsii_name="startTime")
    def start_time(self) -> str:
        return jsii.get(self, "startTime")


class DataGoogleContainerClusterMasterAuth(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterMasterAuth"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterMasterAuth, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="clientCertificate")
    def client_certificate(self) -> str:
        return jsii.get(self, "clientCertificate")

    @builtins.property
    @jsii.member(jsii_name="clientCertificateConfig")
    def client_certificate_config(self) -> typing.Any:
        return jsii.get(self, "clientCertificateConfig")

    @builtins.property
    @jsii.member(jsii_name="clientKey")
    def client_key(self) -> str:
        return jsii.get(self, "clientKey")

    @builtins.property
    @jsii.member(jsii_name="clusterCaCertificate")
    def cluster_ca_certificate(self) -> str:
        return jsii.get(self, "clusterCaCertificate")

    @builtins.property
    @jsii.member(jsii_name="password")
    def password(self) -> str:
        return jsii.get(self, "password")

    @builtins.property
    @jsii.member(jsii_name="username")
    def username(self) -> str:
        return jsii.get(self, "username")


class DataGoogleContainerClusterMasterAuthClientCertificateConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterMasterAuthClientCertificateConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterMasterAuthClientCertificateConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="issueClientCertificate")
    def issue_client_certificate(self) -> bool:
        return jsii.get(self, "issueClientCertificate")


class DataGoogleContainerClusterMasterAuthorizedNetworksConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterMasterAuthorizedNetworksConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterMasterAuthorizedNetworksConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="cidrBlocks")
    def cidr_blocks(self) -> typing.Any:
        return jsii.get(self, "cidrBlocks")


class DataGoogleContainerClusterMasterAuthorizedNetworksConfigCidrBlocks(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterMasterAuthorizedNetworksConfigCidrBlocks"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterMasterAuthorizedNetworksConfigCidrBlocks, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="cidrBlock")
    def cidr_block(self) -> str:
        return jsii.get(self, "cidrBlock")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")


class DataGoogleContainerClusterNetworkPolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNetworkPolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNetworkPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> bool:
        return jsii.get(self, "enabled")

    @builtins.property
    @jsii.member(jsii_name="provider")
    def provider(self) -> str:
        return jsii.get(self, "provider")


class DataGoogleContainerClusterNodeConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodeConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodeConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="diskSizeGb")
    def disk_size_gb(self) -> jsii.Number:
        return jsii.get(self, "diskSizeGb")

    @builtins.property
    @jsii.member(jsii_name="diskType")
    def disk_type(self) -> str:
        return jsii.get(self, "diskType")

    @builtins.property
    @jsii.member(jsii_name="guestAccelerator")
    def guest_accelerator(self) -> typing.Any:
        return jsii.get(self, "guestAccelerator")

    @builtins.property
    @jsii.member(jsii_name="imageType")
    def image_type(self) -> str:
        return jsii.get(self, "imageType")

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Any:
        return jsii.get(self, "labels")

    @builtins.property
    @jsii.member(jsii_name="localSsdCount")
    def local_ssd_count(self) -> jsii.Number:
        return jsii.get(self, "localSsdCount")

    @builtins.property
    @jsii.member(jsii_name="machineType")
    def machine_type(self) -> str:
        return jsii.get(self, "machineType")

    @builtins.property
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Any:
        return jsii.get(self, "metadata")

    @builtins.property
    @jsii.member(jsii_name="minCpuPlatform")
    def min_cpu_platform(self) -> str:
        return jsii.get(self, "minCpuPlatform")

    @builtins.property
    @jsii.member(jsii_name="oauthScopes")
    def oauth_scopes(self) -> typing.List[str]:
        return jsii.get(self, "oauthScopes")

    @builtins.property
    @jsii.member(jsii_name="preemptible")
    def preemptible(self) -> bool:
        return jsii.get(self, "preemptible")

    @builtins.property
    @jsii.member(jsii_name="sandboxConfig")
    def sandbox_config(self) -> typing.Any:
        return jsii.get(self, "sandboxConfig")

    @builtins.property
    @jsii.member(jsii_name="serviceAccount")
    def service_account(self) -> str:
        return jsii.get(self, "serviceAccount")

    @builtins.property
    @jsii.member(jsii_name="shieldedInstanceConfig")
    def shielded_instance_config(self) -> typing.Any:
        return jsii.get(self, "shieldedInstanceConfig")

    @builtins.property
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.List[str]:
        return jsii.get(self, "tags")

    @builtins.property
    @jsii.member(jsii_name="taint")
    def taint(self) -> typing.Any:
        return jsii.get(self, "taint")

    @builtins.property
    @jsii.member(jsii_name="workloadMetadataConfig")
    def workload_metadata_config(self) -> typing.Any:
        return jsii.get(self, "workloadMetadataConfig")


class DataGoogleContainerClusterNodeConfigGuestAccelerator(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodeConfigGuestAccelerator"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodeConfigGuestAccelerator, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="count")
    def count(self) -> jsii.Number:
        return jsii.get(self, "count")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")


class DataGoogleContainerClusterNodeConfigSandboxConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodeConfigSandboxConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodeConfigSandboxConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="sandboxType")
    def sandbox_type(self) -> str:
        return jsii.get(self, "sandboxType")


class DataGoogleContainerClusterNodeConfigShieldedInstanceConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodeConfigShieldedInstanceConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodeConfigShieldedInstanceConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="enableIntegrityMonitoring")
    def enable_integrity_monitoring(self) -> bool:
        return jsii.get(self, "enableIntegrityMonitoring")

    @builtins.property
    @jsii.member(jsii_name="enableSecureBoot")
    def enable_secure_boot(self) -> bool:
        return jsii.get(self, "enableSecureBoot")


class DataGoogleContainerClusterNodeConfigTaint(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodeConfigTaint"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodeConfigTaint, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="effect")
    def effect(self) -> str:
        return jsii.get(self, "effect")

    @builtins.property
    @jsii.member(jsii_name="key")
    def key(self) -> str:
        return jsii.get(self, "key")

    @builtins.property
    @jsii.member(jsii_name="value")
    def value(self) -> str:
        return jsii.get(self, "value")


class DataGoogleContainerClusterNodeConfigWorkloadMetadataConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodeConfigWorkloadMetadataConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodeConfigWorkloadMetadataConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="nodeMetadata")
    def node_metadata(self) -> str:
        return jsii.get(self, "nodeMetadata")


class DataGoogleContainerClusterNodePool(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodePool"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodePool, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="autoscaling")
    def autoscaling(self) -> typing.Any:
        return jsii.get(self, "autoscaling")

    @builtins.property
    @jsii.member(jsii_name="initialNodeCount")
    def initial_node_count(self) -> jsii.Number:
        return jsii.get(self, "initialNodeCount")

    @builtins.property
    @jsii.member(jsii_name="instanceGroupUrls")
    def instance_group_urls(self) -> typing.List[str]:
        return jsii.get(self, "instanceGroupUrls")

    @builtins.property
    @jsii.member(jsii_name="management")
    def management(self) -> typing.Any:
        return jsii.get(self, "management")

    @builtins.property
    @jsii.member(jsii_name="maxPodsPerNode")
    def max_pods_per_node(self) -> jsii.Number:
        return jsii.get(self, "maxPodsPerNode")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="namePrefix")
    def name_prefix(self) -> str:
        return jsii.get(self, "namePrefix")

    @builtins.property
    @jsii.member(jsii_name="nodeConfig")
    def node_config(self) -> typing.Any:
        return jsii.get(self, "nodeConfig")

    @builtins.property
    @jsii.member(jsii_name="nodeCount")
    def node_count(self) -> jsii.Number:
        return jsii.get(self, "nodeCount")

    @builtins.property
    @jsii.member(jsii_name="nodeLocations")
    def node_locations(self) -> typing.List[str]:
        return jsii.get(self, "nodeLocations")

    @builtins.property
    @jsii.member(jsii_name="upgradeSettings")
    def upgrade_settings(self) -> typing.Any:
        return jsii.get(self, "upgradeSettings")

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> str:
        return jsii.get(self, "version")


class DataGoogleContainerClusterNodePoolAutoscaling(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodePoolAutoscaling"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodePoolAutoscaling, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="maxNodeCount")
    def max_node_count(self) -> jsii.Number:
        return jsii.get(self, "maxNodeCount")

    @builtins.property
    @jsii.member(jsii_name="minNodeCount")
    def min_node_count(self) -> jsii.Number:
        return jsii.get(self, "minNodeCount")


class DataGoogleContainerClusterNodePoolManagement(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodePoolManagement"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodePoolManagement, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="autoRepair")
    def auto_repair(self) -> bool:
        return jsii.get(self, "autoRepair")

    @builtins.property
    @jsii.member(jsii_name="autoUpgrade")
    def auto_upgrade(self) -> bool:
        return jsii.get(self, "autoUpgrade")


class DataGoogleContainerClusterNodePoolNodeConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodePoolNodeConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodePoolNodeConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="diskSizeGb")
    def disk_size_gb(self) -> jsii.Number:
        return jsii.get(self, "diskSizeGb")

    @builtins.property
    @jsii.member(jsii_name="diskType")
    def disk_type(self) -> str:
        return jsii.get(self, "diskType")

    @builtins.property
    @jsii.member(jsii_name="guestAccelerator")
    def guest_accelerator(self) -> typing.Any:
        return jsii.get(self, "guestAccelerator")

    @builtins.property
    @jsii.member(jsii_name="imageType")
    def image_type(self) -> str:
        return jsii.get(self, "imageType")

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Any:
        return jsii.get(self, "labels")

    @builtins.property
    @jsii.member(jsii_name="localSsdCount")
    def local_ssd_count(self) -> jsii.Number:
        return jsii.get(self, "localSsdCount")

    @builtins.property
    @jsii.member(jsii_name="machineType")
    def machine_type(self) -> str:
        return jsii.get(self, "machineType")

    @builtins.property
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Any:
        return jsii.get(self, "metadata")

    @builtins.property
    @jsii.member(jsii_name="minCpuPlatform")
    def min_cpu_platform(self) -> str:
        return jsii.get(self, "minCpuPlatform")

    @builtins.property
    @jsii.member(jsii_name="oauthScopes")
    def oauth_scopes(self) -> typing.List[str]:
        return jsii.get(self, "oauthScopes")

    @builtins.property
    @jsii.member(jsii_name="preemptible")
    def preemptible(self) -> bool:
        return jsii.get(self, "preemptible")

    @builtins.property
    @jsii.member(jsii_name="sandboxConfig")
    def sandbox_config(self) -> typing.Any:
        return jsii.get(self, "sandboxConfig")

    @builtins.property
    @jsii.member(jsii_name="serviceAccount")
    def service_account(self) -> str:
        return jsii.get(self, "serviceAccount")

    @builtins.property
    @jsii.member(jsii_name="shieldedInstanceConfig")
    def shielded_instance_config(self) -> typing.Any:
        return jsii.get(self, "shieldedInstanceConfig")

    @builtins.property
    @jsii.member(jsii_name="tags")
    def tags(self) -> typing.List[str]:
        return jsii.get(self, "tags")

    @builtins.property
    @jsii.member(jsii_name="taint")
    def taint(self) -> typing.Any:
        return jsii.get(self, "taint")

    @builtins.property
    @jsii.member(jsii_name="workloadMetadataConfig")
    def workload_metadata_config(self) -> typing.Any:
        return jsii.get(self, "workloadMetadataConfig")


class DataGoogleContainerClusterNodePoolNodeConfigGuestAccelerator(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodePoolNodeConfigGuestAccelerator"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodePoolNodeConfigGuestAccelerator, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="count")
    def count(self) -> jsii.Number:
        return jsii.get(self, "count")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")


class DataGoogleContainerClusterNodePoolNodeConfigSandboxConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodePoolNodeConfigSandboxConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodePoolNodeConfigSandboxConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="sandboxType")
    def sandbox_type(self) -> str:
        return jsii.get(self, "sandboxType")


class DataGoogleContainerClusterNodePoolNodeConfigShieldedInstanceConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodePoolNodeConfigShieldedInstanceConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodePoolNodeConfigShieldedInstanceConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="enableIntegrityMonitoring")
    def enable_integrity_monitoring(self) -> bool:
        return jsii.get(self, "enableIntegrityMonitoring")

    @builtins.property
    @jsii.member(jsii_name="enableSecureBoot")
    def enable_secure_boot(self) -> bool:
        return jsii.get(self, "enableSecureBoot")


class DataGoogleContainerClusterNodePoolNodeConfigTaint(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodePoolNodeConfigTaint"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodePoolNodeConfigTaint, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="effect")
    def effect(self) -> str:
        return jsii.get(self, "effect")

    @builtins.property
    @jsii.member(jsii_name="key")
    def key(self) -> str:
        return jsii.get(self, "key")

    @builtins.property
    @jsii.member(jsii_name="value")
    def value(self) -> str:
        return jsii.get(self, "value")


class DataGoogleContainerClusterNodePoolNodeConfigWorkloadMetadataConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodePoolNodeConfigWorkloadMetadataConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodePoolNodeConfigWorkloadMetadataConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="nodeMetadata")
    def node_metadata(self) -> str:
        return jsii.get(self, "nodeMetadata")


class DataGoogleContainerClusterNodePoolUpgradeSettings(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterNodePoolUpgradeSettings"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterNodePoolUpgradeSettings, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="maxSurge")
    def max_surge(self) -> jsii.Number:
        return jsii.get(self, "maxSurge")

    @builtins.property
    @jsii.member(jsii_name="maxUnavailable")
    def max_unavailable(self) -> jsii.Number:
        return jsii.get(self, "maxUnavailable")


class DataGoogleContainerClusterPodSecurityPolicyConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterPodSecurityPolicyConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterPodSecurityPolicyConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> bool:
        return jsii.get(self, "enabled")


class DataGoogleContainerClusterPrivateClusterConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterPrivateClusterConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterPrivateClusterConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="enablePrivateEndpoint")
    def enable_private_endpoint(self) -> bool:
        return jsii.get(self, "enablePrivateEndpoint")

    @builtins.property
    @jsii.member(jsii_name="enablePrivateNodes")
    def enable_private_nodes(self) -> bool:
        return jsii.get(self, "enablePrivateNodes")

    @builtins.property
    @jsii.member(jsii_name="masterIpv4CidrBlock")
    def master_ipv4_cidr_block(self) -> str:
        return jsii.get(self, "masterIpv4CidrBlock")

    @builtins.property
    @jsii.member(jsii_name="peeringName")
    def peering_name(self) -> str:
        return jsii.get(self, "peeringName")

    @builtins.property
    @jsii.member(jsii_name="privateEndpoint")
    def private_endpoint(self) -> str:
        return jsii.get(self, "privateEndpoint")

    @builtins.property
    @jsii.member(jsii_name="publicEndpoint")
    def public_endpoint(self) -> str:
        return jsii.get(self, "publicEndpoint")


class DataGoogleContainerClusterReleaseChannel(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterReleaseChannel"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterReleaseChannel, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="channel")
    def channel(self) -> str:
        return jsii.get(self, "channel")


class DataGoogleContainerClusterResourceUsageExportConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterResourceUsageExportConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterResourceUsageExportConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="bigqueryDestination")
    def bigquery_destination(self) -> typing.Any:
        return jsii.get(self, "bigqueryDestination")

    @builtins.property
    @jsii.member(jsii_name="enableNetworkEgressMetering")
    def enable_network_egress_metering(self) -> bool:
        return jsii.get(self, "enableNetworkEgressMetering")

    @builtins.property
    @jsii.member(jsii_name="enableResourceConsumptionMetering")
    def enable_resource_consumption_metering(self) -> bool:
        return jsii.get(self, "enableResourceConsumptionMetering")


class DataGoogleContainerClusterResourceUsageExportConfigBigqueryDestination(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterResourceUsageExportConfigBigqueryDestination"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterResourceUsageExportConfigBigqueryDestination, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="datasetId")
    def dataset_id(self) -> str:
        return jsii.get(self, "datasetId")


class DataGoogleContainerClusterVerticalPodAutoscaling(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterVerticalPodAutoscaling"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterVerticalPodAutoscaling, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> bool:
        return jsii.get(self, "enabled")


class DataGoogleContainerClusterWorkloadIdentityConfig(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerClusterWorkloadIdentityConfig"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleContainerClusterWorkloadIdentityConfig, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="identityNamespace")
    def identity_namespace(self) -> str:
        return jsii.get(self, "identityNamespace")


class DataGoogleContainerEngineVersions(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerEngineVersions"):
    def __init__(self, scope: constructs.Construct, id: str, *, location: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, version_prefix: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param location: 
        :param project: 
        :param region: 
        :param version_prefix: 
        :param zone: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleContainerEngineVersionsConfig(location=location, project=project, region=region, version_prefix=version_prefix, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleContainerEngineVersions, self, [scope, id, config])

    @jsii.member(jsii_name="releaseChannelDefaultVersion")
    def release_channel_default_version(self, key: str) -> str:
        """
        :param key: -
        """
        return jsii.invoke(self, "releaseChannelDefaultVersion", [key])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="defaultClusterVersion")
    def default_cluster_version(self) -> str:
        return jsii.get(self, "defaultClusterVersion")

    @builtins.property
    @jsii.member(jsii_name="latestMasterVersion")
    def latest_master_version(self) -> str:
        return jsii.get(self, "latestMasterVersion")

    @builtins.property
    @jsii.member(jsii_name="latestNodeVersion")
    def latest_node_version(self) -> str:
        return jsii.get(self, "latestNodeVersion")

    @builtins.property
    @jsii.member(jsii_name="validMasterVersions")
    def valid_master_versions(self) -> typing.List[str]:
        return jsii.get(self, "validMasterVersions")

    @builtins.property
    @jsii.member(jsii_name="validNodeVersions")
    def valid_node_versions(self) -> typing.List[str]:
        return jsii.get(self, "validNodeVersions")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="versionPrefix")
    def version_prefix(self) -> typing.Optional[str]:
        return jsii.get(self, "versionPrefix")

    @version_prefix.setter
    def version_prefix(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "versionPrefix", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleContainerEngineVersionsConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'location': 'location', 'project': 'project', 'region': 'region', 'version_prefix': 'versionPrefix', 'zone': 'zone'})
class DataGoogleContainerEngineVersionsConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, version_prefix: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: 
        :param project: 
        :param region: 
        :param version_prefix: 
        :param zone: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if version_prefix is not None: self._values["version_prefix"] = version_prefix
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    @builtins.property
    def version_prefix(self) -> typing.Optional[str]:
        return self._values.get('version_prefix')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleContainerEngineVersionsConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleContainerRegistryImage(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerRegistryImage"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, digest: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, tag: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: 
        :param digest: 
        :param project: 
        :param region: 
        :param tag: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleContainerRegistryImageConfig(name=name, digest=digest, project=project, region=region, tag=tag, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleContainerRegistryImage, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="imageUrl")
    def image_url(self) -> str:
        return jsii.get(self, "imageUrl")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="digest")
    def digest(self) -> typing.Optional[str]:
        return jsii.get(self, "digest")

    @digest.setter
    def digest(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "digest", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="tag")
    def tag(self) -> typing.Optional[str]:
        return jsii.get(self, "tag")

    @tag.setter
    def tag(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "tag", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleContainerRegistryImageConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'digest': 'digest', 'project': 'project', 'region': 'region', 'tag': 'tag'})
class DataGoogleContainerRegistryImageConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, digest: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, tag: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: 
        :param digest: 
        :param project: 
        :param region: 
        :param tag: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if digest is not None: self._values["digest"] = digest
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if tag is not None: self._values["tag"] = tag

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        return self._values.get('name')

    @builtins.property
    def digest(self) -> typing.Optional[str]:
        return self._values.get('digest')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    @builtins.property
    def tag(self) -> typing.Optional[str]:
        return self._values.get('tag')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleContainerRegistryImageConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleContainerRegistryRepository(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleContainerRegistryRepository"):
    def __init__(self, scope: constructs.Construct, id: str, *, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleContainerRegistryRepositoryConfig(project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleContainerRegistryRepository, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="repositoryUrl")
    def repository_url(self) -> str:
        return jsii.get(self, "repositoryUrl")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleContainerRegistryRepositoryConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'project': 'project', 'region': 'region'})
class DataGoogleContainerRegistryRepositoryConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleContainerRegistryRepositoryConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleDnsKeys(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleDnsKeys"):
    def __init__(self, scope: constructs.Construct, id: str, *, managed_zone: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param managed_zone: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleDnsKeysConfig(managed_zone=managed_zone, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleDnsKeys, self, [scope, id, config])

    @jsii.member(jsii_name="keySigningKeys")
    def key_signing_keys(self, index: str) -> "DataGoogleDnsKeysKeySigningKeys":
        """
        :param index: -
        """
        return jsii.invoke(self, "keySigningKeys", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="zoneSigningKeys")
    def zone_signing_keys(self, index: str) -> "DataGoogleDnsKeysZoneSigningKeys":
        """
        :param index: -
        """
        return jsii.invoke(self, "zoneSigningKeys", [index])

    @builtins.property
    @jsii.member(jsii_name="managedZone")
    def managed_zone(self) -> str:
        return jsii.get(self, "managedZone")

    @managed_zone.setter
    def managed_zone(self, value: str) -> None:
        jsii.set(self, "managedZone", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleDnsKeysConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'managed_zone': 'managedZone', 'project': 'project'})
class DataGoogleDnsKeysConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, managed_zone: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param managed_zone: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'managed_zone': managed_zone,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def managed_zone(self) -> str:
        return self._values.get('managed_zone')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleDnsKeysConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleDnsKeysKeySigningKeys(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleDnsKeysKeySigningKeys"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleDnsKeysKeySigningKeys, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="algorithm")
    def algorithm(self) -> str:
        return jsii.get(self, "algorithm")

    @builtins.property
    @jsii.member(jsii_name="creationTime")
    def creation_time(self) -> str:
        return jsii.get(self, "creationTime")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="digests")
    def digests(self) -> typing.Any:
        return jsii.get(self, "digests")

    @builtins.property
    @jsii.member(jsii_name="dsRecord")
    def ds_record(self) -> str:
        return jsii.get(self, "dsRecord")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> str:
        return jsii.get(self, "id")

    @builtins.property
    @jsii.member(jsii_name="isActive")
    def is_active(self) -> bool:
        return jsii.get(self, "isActive")

    @builtins.property
    @jsii.member(jsii_name="keyLength")
    def key_length(self) -> jsii.Number:
        return jsii.get(self, "keyLength")

    @builtins.property
    @jsii.member(jsii_name="keyTag")
    def key_tag(self) -> jsii.Number:
        return jsii.get(self, "keyTag")

    @builtins.property
    @jsii.member(jsii_name="publicKey")
    def public_key(self) -> str:
        return jsii.get(self, "publicKey")


class DataGoogleDnsKeysKeySigningKeysDigests(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleDnsKeysKeySigningKeysDigests"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleDnsKeysKeySigningKeysDigests, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="digest")
    def digest(self) -> str:
        return jsii.get(self, "digest")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")


class DataGoogleDnsKeysZoneSigningKeys(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleDnsKeysZoneSigningKeys"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleDnsKeysZoneSigningKeys, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="algorithm")
    def algorithm(self) -> str:
        return jsii.get(self, "algorithm")

    @builtins.property
    @jsii.member(jsii_name="creationTime")
    def creation_time(self) -> str:
        return jsii.get(self, "creationTime")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="digests")
    def digests(self) -> typing.Any:
        return jsii.get(self, "digests")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> str:
        return jsii.get(self, "id")

    @builtins.property
    @jsii.member(jsii_name="isActive")
    def is_active(self) -> bool:
        return jsii.get(self, "isActive")

    @builtins.property
    @jsii.member(jsii_name="keyLength")
    def key_length(self) -> jsii.Number:
        return jsii.get(self, "keyLength")

    @builtins.property
    @jsii.member(jsii_name="keyTag")
    def key_tag(self) -> jsii.Number:
        return jsii.get(self, "keyTag")

    @builtins.property
    @jsii.member(jsii_name="publicKey")
    def public_key(self) -> str:
        return jsii.get(self, "publicKey")


class DataGoogleDnsKeysZoneSigningKeysDigests(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleDnsKeysZoneSigningKeysDigests"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleDnsKeysZoneSigningKeysDigests, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="digest")
    def digest(self) -> str:
        return jsii.get(self, "digest")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")


class DataGoogleDnsManagedZone(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleDnsManagedZone"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleDnsManagedZoneConfig(name=name, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleDnsManagedZone, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="dnsName")
    def dns_name(self) -> str:
        return jsii.get(self, "dnsName")

    @builtins.property
    @jsii.member(jsii_name="nameServers")
    def name_servers(self) -> typing.List[str]:
        return jsii.get(self, "nameServers")

    @builtins.property
    @jsii.member(jsii_name="visibility")
    def visibility(self) -> str:
        return jsii.get(self, "visibility")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleDnsManagedZoneConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project'})
class DataGoogleDnsManagedZoneConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleDnsManagedZoneConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleFolder(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleFolder"):
    def __init__(self, scope: constructs.Construct, id: str, *, folder: str, lookup_organization: typing.Optional[bool]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param folder: 
        :param lookup_organization: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleFolderConfig(folder=folder, lookup_organization=lookup_organization, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleFolder, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @builtins.property
    @jsii.member(jsii_name="folderId")
    def folder_id(self) -> str:
        return jsii.get(self, "folderId")

    @builtins.property
    @jsii.member(jsii_name="lifecycleState")
    def lifecycle_state(self) -> str:
        return jsii.get(self, "lifecycleState")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="organization")
    def organization(self) -> str:
        return jsii.get(self, "organization")

    @builtins.property
    @jsii.member(jsii_name="parent")
    def parent(self) -> str:
        return jsii.get(self, "parent")

    @builtins.property
    @jsii.member(jsii_name="folder")
    def folder(self) -> str:
        return jsii.get(self, "folder")

    @folder.setter
    def folder(self, value: str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="lookupOrganization")
    def lookup_organization(self) -> typing.Optional[bool]:
        return jsii.get(self, "lookupOrganization")

    @lookup_organization.setter
    def lookup_organization(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "lookupOrganization", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleFolderConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'folder': 'folder', 'lookup_organization': 'lookupOrganization'})
class DataGoogleFolderConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, folder: str, lookup_organization: typing.Optional[bool]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param folder: 
        :param lookup_organization: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'folder': folder,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if lookup_organization is not None: self._values["lookup_organization"] = lookup_organization

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def folder(self) -> str:
        return self._values.get('folder')

    @builtins.property
    def lookup_organization(self) -> typing.Optional[bool]:
        return self._values.get('lookup_organization')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleFolderConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleFolderOrganizationPolicy(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleFolderOrganizationPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, constraint: str, folder: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param constraint: The name of the Constraint the Policy is configuring, for example, serviceuser.services.
        :param folder: The resource name of the folder to set the policy for. Its format is folders/{folder_id}.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleFolderOrganizationPolicyConfig(constraint=constraint, folder=folder, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleFolderOrganizationPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="booleanPolicy")
    def boolean_policy(self, index: str) -> "DataGoogleFolderOrganizationPolicyBooleanPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "booleanPolicy", [index])

    @jsii.member(jsii_name="listPolicy")
    def list_policy(self, index: str) -> "DataGoogleFolderOrganizationPolicyListPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "listPolicy", [index])

    @jsii.member(jsii_name="restorePolicy")
    def restore_policy(self, index: str) -> "DataGoogleFolderOrganizationPolicyRestorePolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "restorePolicy", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="updateTime")
    def update_time(self) -> str:
        return jsii.get(self, "updateTime")

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> jsii.Number:
        return jsii.get(self, "version")

    @builtins.property
    @jsii.member(jsii_name="constraint")
    def constraint(self) -> str:
        return jsii.get(self, "constraint")

    @constraint.setter
    def constraint(self, value: str) -> None:
        jsii.set(self, "constraint", value)

    @builtins.property
    @jsii.member(jsii_name="folder")
    def folder(self) -> str:
        return jsii.get(self, "folder")

    @folder.setter
    def folder(self, value: str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


class DataGoogleFolderOrganizationPolicyBooleanPolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleFolderOrganizationPolicyBooleanPolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleFolderOrganizationPolicyBooleanPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="enforced")
    def enforced(self) -> bool:
        return jsii.get(self, "enforced")


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleFolderOrganizationPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'constraint': 'constraint', 'folder': 'folder'})
class DataGoogleFolderOrganizationPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, constraint: str, folder: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param constraint: The name of the Constraint the Policy is configuring, for example, serviceuser.services.
        :param folder: The resource name of the folder to set the policy for. Its format is folders/{folder_id}.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'constraint': constraint,
            'folder': folder,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def constraint(self) -> str:
        """The name of the Constraint the Policy is configuring, for example, serviceuser.services."""
        return self._values.get('constraint')

    @builtins.property
    def folder(self) -> str:
        """The resource name of the folder to set the policy for.

        Its format is folders/{folder_id}.
        """
        return self._values.get('folder')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleFolderOrganizationPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleFolderOrganizationPolicyListPolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleFolderOrganizationPolicyListPolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleFolderOrganizationPolicyListPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="allow")
    def allow(self) -> typing.Any:
        return jsii.get(self, "allow")

    @builtins.property
    @jsii.member(jsii_name="deny")
    def deny(self) -> typing.Any:
        return jsii.get(self, "deny")

    @builtins.property
    @jsii.member(jsii_name="inheritFromParent")
    def inherit_from_parent(self) -> bool:
        return jsii.get(self, "inheritFromParent")

    @builtins.property
    @jsii.member(jsii_name="suggestedValue")
    def suggested_value(self) -> str:
        return jsii.get(self, "suggestedValue")


class DataGoogleFolderOrganizationPolicyListPolicyAllow(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleFolderOrganizationPolicyListPolicyAllow"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleFolderOrganizationPolicyListPolicyAllow, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="all")
    def all(self) -> bool:
        return jsii.get(self, "all")

    @builtins.property
    @jsii.member(jsii_name="values")
    def values(self) -> typing.List[str]:
        return jsii.get(self, "values")


class DataGoogleFolderOrganizationPolicyListPolicyDeny(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleFolderOrganizationPolicyListPolicyDeny"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleFolderOrganizationPolicyListPolicyDeny, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="all")
    def all(self) -> bool:
        return jsii.get(self, "all")

    @builtins.property
    @jsii.member(jsii_name="values")
    def values(self) -> typing.List[str]:
        return jsii.get(self, "values")


class DataGoogleFolderOrganizationPolicyRestorePolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleFolderOrganizationPolicyRestorePolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleFolderOrganizationPolicyRestorePolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="default")
    def default(self) -> bool:
        return jsii.get(self, "default")


class DataGoogleGameServicesGameServerDeploymentRollout(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleGameServicesGameServerDeploymentRollout"):
    def __init__(self, scope: constructs.Construct, id: str, *, deployment_id: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param deployment_id: The deployment to rollout the new config to. Only 1 rollout must be associated with each deployment.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleGameServicesGameServerDeploymentRolloutConfig(deployment_id=deployment_id, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleGameServicesGameServerDeploymentRollout, self, [scope, id, config])

    @jsii.member(jsii_name="gameServerConfigOverrides")
    def game_server_config_overrides(self, index: str) -> "DataGoogleGameServicesGameServerDeploymentRolloutGameServerConfigOverrides":
        """
        :param index: -
        """
        return jsii.invoke(self, "gameServerConfigOverrides", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="defaultGameServerConfig")
    def default_game_server_config(self) -> str:
        return jsii.get(self, "defaultGameServerConfig")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> str:
        return jsii.get(self, "project")

    @builtins.property
    @jsii.member(jsii_name="deploymentId")
    def deployment_id(self) -> str:
        return jsii.get(self, "deploymentId")

    @deployment_id.setter
    def deployment_id(self, value: str) -> None:
        jsii.set(self, "deploymentId", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleGameServicesGameServerDeploymentRolloutConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'deployment_id': 'deploymentId'})
class DataGoogleGameServicesGameServerDeploymentRolloutConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, deployment_id: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param deployment_id: The deployment to rollout the new config to. Only 1 rollout must be associated with each deployment.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'deployment_id': deployment_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def deployment_id(self) -> str:
        """The deployment to rollout the new config to.

        Only 1 rollout must be associated with each deployment.
        """
        return self._values.get('deployment_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleGameServicesGameServerDeploymentRolloutConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleGameServicesGameServerDeploymentRolloutGameServerConfigOverrides(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleGameServicesGameServerDeploymentRolloutGameServerConfigOverrides"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleGameServicesGameServerDeploymentRolloutGameServerConfigOverrides, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="configVersion")
    def config_version(self) -> str:
        return jsii.get(self, "configVersion")

    @builtins.property
    @jsii.member(jsii_name="realmsSelector")
    def realms_selector(self) -> typing.Any:
        return jsii.get(self, "realmsSelector")


class DataGoogleGameServicesGameServerDeploymentRolloutGameServerConfigOverridesRealmsSelector(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleGameServicesGameServerDeploymentRolloutGameServerConfigOverridesRealmsSelector"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleGameServicesGameServerDeploymentRolloutGameServerConfigOverridesRealmsSelector, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="realms")
    def realms(self) -> typing.List[str]:
        return jsii.get(self, "realms")


class DataGoogleIamPolicy(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, audit_config: typing.Optional[typing.List["DataGoogleIamPolicyAuditConfig"]]=None, binding: typing.Optional[typing.List["DataGoogleIamPolicyBinding"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param audit_config: audit_config block.
        :param binding: binding block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleIamPolicyConfig(audit_config=audit_config, binding=binding, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @builtins.property
    @jsii.member(jsii_name="auditConfig")
    def audit_config(self) -> typing.Optional[typing.List["DataGoogleIamPolicyAuditConfig"]]:
        return jsii.get(self, "auditConfig")

    @audit_config.setter
    def audit_config(self, value: typing.Optional[typing.List["DataGoogleIamPolicyAuditConfig"]]) -> None:
        jsii.set(self, "auditConfig", value)

    @builtins.property
    @jsii.member(jsii_name="binding")
    def binding(self) -> typing.Optional[typing.List["DataGoogleIamPolicyBinding"]]:
        return jsii.get(self, "binding")

    @binding.setter
    def binding(self, value: typing.Optional[typing.List["DataGoogleIamPolicyBinding"]]) -> None:
        jsii.set(self, "binding", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleIamPolicyAuditConfig", jsii_struct_bases=[], name_mapping={'audit_log_configs': 'auditLogConfigs', 'service': 'service'})
class DataGoogleIamPolicyAuditConfig():
    def __init__(self, *, audit_log_configs: typing.List["DataGoogleIamPolicyAuditConfigAuditLogConfigs"], service: str) -> None:
        """
        :param audit_log_configs: audit_log_configs block.
        :param service: 
        """
        self._values = {
            'audit_log_configs': audit_log_configs,
            'service': service,
        }

    @builtins.property
    def audit_log_configs(self) -> typing.List["DataGoogleIamPolicyAuditConfigAuditLogConfigs"]:
        """audit_log_configs block."""
        return self._values.get('audit_log_configs')

    @builtins.property
    def service(self) -> str:
        return self._values.get('service')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleIamPolicyAuditConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleIamPolicyAuditConfigAuditLogConfigs", jsii_struct_bases=[], name_mapping={'log_type': 'logType', 'exempted_members': 'exemptedMembers'})
class DataGoogleIamPolicyAuditConfigAuditLogConfigs():
    def __init__(self, *, log_type: str, exempted_members: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param log_type: 
        :param exempted_members: 
        """
        self._values = {
            'log_type': log_type,
        }
        if exempted_members is not None: self._values["exempted_members"] = exempted_members

    @builtins.property
    def log_type(self) -> str:
        return self._values.get('log_type')

    @builtins.property
    def exempted_members(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('exempted_members')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleIamPolicyAuditConfigAuditLogConfigs(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleIamPolicyBinding", jsii_struct_bases=[], name_mapping={'members': 'members', 'role': 'role', 'condition': 'condition'})
class DataGoogleIamPolicyBinding():
    def __init__(self, *, members: typing.List[str], role: str, condition: typing.Optional[typing.List["DataGoogleIamPolicyBindingCondition"]]=None) -> None:
        """
        :param members: 
        :param role: 
        :param condition: condition block.
        """
        self._values = {
            'members': members,
            'role': role,
        }
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["DataGoogleIamPolicyBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleIamPolicyBinding(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleIamPolicyBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class DataGoogleIamPolicyBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleIamPolicyBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'audit_config': 'auditConfig', 'binding': 'binding'})
class DataGoogleIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, audit_config: typing.Optional[typing.List["DataGoogleIamPolicyAuditConfig"]]=None, binding: typing.Optional[typing.List["DataGoogleIamPolicyBinding"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param audit_config: audit_config block.
        :param binding: binding block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if audit_config is not None: self._values["audit_config"] = audit_config
        if binding is not None: self._values["binding"] = binding

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def audit_config(self) -> typing.Optional[typing.List["DataGoogleIamPolicyAuditConfig"]]:
        """audit_config block."""
        return self._values.get('audit_config')

    @builtins.property
    def binding(self) -> typing.Optional[typing.List["DataGoogleIamPolicyBinding"]]:
        """binding block."""
        return self._values.get('binding')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleIamRole(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleIamRole"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleIamRoleConfig(name=name, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleIamRole, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="includedPermissions")
    def included_permissions(self) -> typing.List[str]:
        return jsii.get(self, "includedPermissions")

    @builtins.property
    @jsii.member(jsii_name="stage")
    def stage(self) -> str:
        return jsii.get(self, "stage")

    @builtins.property
    @jsii.member(jsii_name="title")
    def title(self) -> str:
        return jsii.get(self, "title")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleIamRoleConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name'})
class DataGoogleIamRoleConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleIamRoleConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleIamTestablePermissions(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleIamTestablePermissions"):
    def __init__(self, scope: constructs.Construct, id: str, *, full_resource_name: str, custom_support_level: typing.Optional[str]=None, stages: typing.Optional[typing.List[str]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param full_resource_name: 
        :param custom_support_level: 
        :param stages: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleIamTestablePermissionsConfig(full_resource_name=full_resource_name, custom_support_level=custom_support_level, stages=stages, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleIamTestablePermissions, self, [scope, id, config])

    @jsii.member(jsii_name="permissions")
    def permissions(self, index: str) -> "DataGoogleIamTestablePermissionsPermissions":
        """
        :param index: -
        """
        return jsii.invoke(self, "permissions", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="fullResourceName")
    def full_resource_name(self) -> str:
        return jsii.get(self, "fullResourceName")

    @full_resource_name.setter
    def full_resource_name(self, value: str) -> None:
        jsii.set(self, "fullResourceName", value)

    @builtins.property
    @jsii.member(jsii_name="customSupportLevel")
    def custom_support_level(self) -> typing.Optional[str]:
        return jsii.get(self, "customSupportLevel")

    @custom_support_level.setter
    def custom_support_level(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "customSupportLevel", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="stages")
    def stages(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "stages")

    @stages.setter
    def stages(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "stages", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleIamTestablePermissionsConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'full_resource_name': 'fullResourceName', 'custom_support_level': 'customSupportLevel', 'stages': 'stages'})
class DataGoogleIamTestablePermissionsConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, full_resource_name: str, custom_support_level: typing.Optional[str]=None, stages: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param full_resource_name: 
        :param custom_support_level: 
        :param stages: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'full_resource_name': full_resource_name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if custom_support_level is not None: self._values["custom_support_level"] = custom_support_level
        if stages is not None: self._values["stages"] = stages

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def full_resource_name(self) -> str:
        return self._values.get('full_resource_name')

    @builtins.property
    def custom_support_level(self) -> typing.Optional[str]:
        return self._values.get('custom_support_level')

    @builtins.property
    def stages(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('stages')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleIamTestablePermissionsConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleIamTestablePermissionsPermissions(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleIamTestablePermissionsPermissions"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleIamTestablePermissionsPermissions, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="apiDisabled")
    def api_disabled(self) -> bool:
        return jsii.get(self, "apiDisabled")

    @builtins.property
    @jsii.member(jsii_name="customSupportLevel")
    def custom_support_level(self) -> str:
        return jsii.get(self, "customSupportLevel")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="stage")
    def stage(self) -> str:
        return jsii.get(self, "stage")

    @builtins.property
    @jsii.member(jsii_name="title")
    def title(self) -> str:
        return jsii.get(self, "title")


class DataGoogleKmsCryptoKey(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleKmsCryptoKey"):
    def __init__(self, scope: constructs.Construct, id: str, *, key_ring: str, name: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param key_ring: The KeyRing that this key belongs to. Format: ''projects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}''.
        :param name: The resource name for the CryptoKey.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleKmsCryptoKeyConfig(key_ring=key_ring, name=name, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleKmsCryptoKey, self, [scope, id, config])

    @jsii.member(jsii_name="labels")
    def labels(self, key: str) -> str:
        """
        :param key: -
        """
        return jsii.invoke(self, "labels", [key])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="versionTemplate")
    def version_template(self, index: str) -> "DataGoogleKmsCryptoKeyVersionTemplate":
        """
        :param index: -
        """
        return jsii.invoke(self, "versionTemplate", [index])

    @builtins.property
    @jsii.member(jsii_name="purpose")
    def purpose(self) -> str:
        return jsii.get(self, "purpose")

    @builtins.property
    @jsii.member(jsii_name="rotationPeriod")
    def rotation_period(self) -> str:
        return jsii.get(self, "rotationPeriod")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="keyRing")
    def key_ring(self) -> str:
        return jsii.get(self, "keyRing")

    @key_ring.setter
    def key_ring(self, value: str) -> None:
        jsii.set(self, "keyRing", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleKmsCryptoKeyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'key_ring': 'keyRing', 'name': 'name'})
class DataGoogleKmsCryptoKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, key_ring: str, name: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_ring: The KeyRing that this key belongs to. Format: ''projects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}''.
        :param name: The resource name for the CryptoKey.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'key_ring': key_ring,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def key_ring(self) -> str:
        """The KeyRing that this key belongs to.

        Format: ''projects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}''.
        """
        return self._values.get('key_ring')

    @builtins.property
    def name(self) -> str:
        """The resource name for the CryptoKey."""
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleKmsCryptoKeyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleKmsCryptoKeyVersion(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleKmsCryptoKeyVersion"):
    def __init__(self, scope: constructs.Construct, id: str, *, crypto_key: str, version: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param crypto_key: 
        :param version: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleKmsCryptoKeyVersionConfig(crypto_key=crypto_key, version=version, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleKmsCryptoKeyVersion, self, [scope, id, config])

    @jsii.member(jsii_name="publicKey")
    def public_key(self, index: str) -> "DataGoogleKmsCryptoKeyVersionPublicKey":
        """
        :param index: -
        """
        return jsii.invoke(self, "publicKey", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="algorithm")
    def algorithm(self) -> str:
        return jsii.get(self, "algorithm")

    @builtins.property
    @jsii.member(jsii_name="protectionLevel")
    def protection_level(self) -> str:
        return jsii.get(self, "protectionLevel")

    @builtins.property
    @jsii.member(jsii_name="state")
    def state(self) -> str:
        return jsii.get(self, "state")

    @builtins.property
    @jsii.member(jsii_name="cryptoKey")
    def crypto_key(self) -> str:
        return jsii.get(self, "cryptoKey")

    @crypto_key.setter
    def crypto_key(self, value: str) -> None:
        jsii.set(self, "cryptoKey", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "version")

    @version.setter
    def version(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleKmsCryptoKeyVersionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'crypto_key': 'cryptoKey', 'version': 'version'})
class DataGoogleKmsCryptoKeyVersionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, crypto_key: str, version: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param crypto_key: 
        :param version: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'crypto_key': crypto_key,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if version is not None: self._values["version"] = version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def crypto_key(self) -> str:
        return self._values.get('crypto_key')

    @builtins.property
    def version(self) -> typing.Optional[jsii.Number]:
        return self._values.get('version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleKmsCryptoKeyVersionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleKmsCryptoKeyVersionPublicKey(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleKmsCryptoKeyVersionPublicKey"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleKmsCryptoKeyVersionPublicKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="algorithm")
    def algorithm(self) -> str:
        return jsii.get(self, "algorithm")

    @builtins.property
    @jsii.member(jsii_name="pem")
    def pem(self) -> str:
        return jsii.get(self, "pem")


class DataGoogleKmsCryptoKeyVersionTemplate(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleKmsCryptoKeyVersionTemplate"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleKmsCryptoKeyVersionTemplate, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="algorithm")
    def algorithm(self) -> str:
        return jsii.get(self, "algorithm")

    @builtins.property
    @jsii.member(jsii_name="protectionLevel")
    def protection_level(self) -> str:
        return jsii.get(self, "protectionLevel")


class DataGoogleKmsKeyRing(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleKmsKeyRing"):
    def __init__(self, scope: constructs.Construct, id: str, *, location: str, name: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param location: The location for the KeyRing. A full list of valid locations can be found by running 'gcloud kms locations list'.
        :param name: The resource name for the KeyRing.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleKmsKeyRingConfig(location=location, name=name, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleKmsKeyRing, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: str) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleKmsKeyRingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'location': 'location', 'name': 'name', 'project': 'project'})
class DataGoogleKmsKeyRingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, location: str, name: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: The location for the KeyRing. A full list of valid locations can be found by running 'gcloud kms locations list'.
        :param name: The resource name for the KeyRing.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'location': location,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def location(self) -> str:
        """The location for the KeyRing.

        A full list of valid locations can be found by running 'gcloud kms locations list'.
        """
        return self._values.get('location')

    @builtins.property
    def name(self) -> str:
        """The resource name for the KeyRing."""
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleKmsKeyRingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleKmsSecret(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleKmsSecret"):
    def __init__(self, scope: constructs.Construct, id: str, *, ciphertext: str, crypto_key: str, additional_authenticated_data: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param ciphertext: 
        :param crypto_key: 
        :param additional_authenticated_data: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleKmsSecretConfig(ciphertext=ciphertext, crypto_key=crypto_key, additional_authenticated_data=additional_authenticated_data, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleKmsSecret, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="plaintext")
    def plaintext(self) -> str:
        return jsii.get(self, "plaintext")

    @builtins.property
    @jsii.member(jsii_name="ciphertext")
    def ciphertext(self) -> str:
        return jsii.get(self, "ciphertext")

    @ciphertext.setter
    def ciphertext(self, value: str) -> None:
        jsii.set(self, "ciphertext", value)

    @builtins.property
    @jsii.member(jsii_name="cryptoKey")
    def crypto_key(self) -> str:
        return jsii.get(self, "cryptoKey")

    @crypto_key.setter
    def crypto_key(self, value: str) -> None:
        jsii.set(self, "cryptoKey", value)

    @builtins.property
    @jsii.member(jsii_name="additionalAuthenticatedData")
    def additional_authenticated_data(self) -> typing.Optional[str]:
        return jsii.get(self, "additionalAuthenticatedData")

    @additional_authenticated_data.setter
    def additional_authenticated_data(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "additionalAuthenticatedData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


class DataGoogleKmsSecretCiphertext(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleKmsSecretCiphertext"):
    def __init__(self, scope: constructs.Construct, id: str, *, crypto_key: str, plaintext: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param crypto_key: 
        :param plaintext: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleKmsSecretCiphertextConfig(crypto_key=crypto_key, plaintext=plaintext, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleKmsSecretCiphertext, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="ciphertext")
    def ciphertext(self) -> str:
        return jsii.get(self, "ciphertext")

    @builtins.property
    @jsii.member(jsii_name="cryptoKey")
    def crypto_key(self) -> str:
        return jsii.get(self, "cryptoKey")

    @crypto_key.setter
    def crypto_key(self, value: str) -> None:
        jsii.set(self, "cryptoKey", value)

    @builtins.property
    @jsii.member(jsii_name="plaintext")
    def plaintext(self) -> str:
        return jsii.get(self, "plaintext")

    @plaintext.setter
    def plaintext(self, value: str) -> None:
        jsii.set(self, "plaintext", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleKmsSecretCiphertextConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'crypto_key': 'cryptoKey', 'plaintext': 'plaintext'})
class DataGoogleKmsSecretCiphertextConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, crypto_key: str, plaintext: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param crypto_key: 
        :param plaintext: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'crypto_key': crypto_key,
            'plaintext': plaintext,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def crypto_key(self) -> str:
        return self._values.get('crypto_key')

    @builtins.property
    def plaintext(self) -> str:
        return self._values.get('plaintext')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleKmsSecretCiphertextConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleKmsSecretConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'ciphertext': 'ciphertext', 'crypto_key': 'cryptoKey', 'additional_authenticated_data': 'additionalAuthenticatedData'})
class DataGoogleKmsSecretConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, ciphertext: str, crypto_key: str, additional_authenticated_data: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param ciphertext: 
        :param crypto_key: 
        :param additional_authenticated_data: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'ciphertext': ciphertext,
            'crypto_key': crypto_key,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if additional_authenticated_data is not None: self._values["additional_authenticated_data"] = additional_authenticated_data

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def ciphertext(self) -> str:
        return self._values.get('ciphertext')

    @builtins.property
    def crypto_key(self) -> str:
        return self._values.get('crypto_key')

    @builtins.property
    def additional_authenticated_data(self) -> typing.Optional[str]:
        return self._values.get('additional_authenticated_data')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleKmsSecretConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleMonitoringAppEngineService(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleMonitoringAppEngineService"):
    def __init__(self, scope: constructs.Construct, id: str, *, module_id: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param module_id: The ID of the App Engine module underlying this service. Corresponds to the 'moduleId' resource label for a 'gae_app' monitored resource(see https://cloud.google.com/monitoring/api/resources#tag_gae_app)
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleMonitoringAppEngineServiceConfig(module_id=module_id, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleMonitoringAppEngineService, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="telemetry")
    def telemetry(self, index: str) -> "DataGoogleMonitoringAppEngineServiceTelemetry":
        """
        :param index: -
        """
        return jsii.invoke(self, "telemetry", [index])

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="serviceId")
    def service_id(self) -> str:
        return jsii.get(self, "serviceId")

    @builtins.property
    @jsii.member(jsii_name="moduleId")
    def module_id(self) -> str:
        return jsii.get(self, "moduleId")

    @module_id.setter
    def module_id(self, value: str) -> None:
        jsii.set(self, "moduleId", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleMonitoringAppEngineServiceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'module_id': 'moduleId', 'project': 'project'})
class DataGoogleMonitoringAppEngineServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, module_id: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param module_id: The ID of the App Engine module underlying this service. Corresponds to the 'moduleId' resource label for a 'gae_app' monitored resource(see https://cloud.google.com/monitoring/api/resources#tag_gae_app)
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'module_id': module_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def module_id(self) -> str:
        """The ID of the App Engine module underlying this service.

        Corresponds to the 'moduleId' resource label for a 'gae_app'
        monitored resource(see https://cloud.google.com/monitoring/api/resources#tag_gae_app)
        """
        return self._values.get('module_id')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleMonitoringAppEngineServiceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleMonitoringAppEngineServiceTelemetry(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleMonitoringAppEngineServiceTelemetry"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleMonitoringAppEngineServiceTelemetry, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="resourceName")
    def resource_name(self) -> str:
        return jsii.get(self, "resourceName")


class DataGoogleMonitoringNotificationChannel(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleMonitoringNotificationChannel"):
    def __init__(self, scope: constructs.Construct, id: str, *, display_name: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, type: typing.Optional[str]=None, user_labels: typing.Optional[typing.Mapping[str, str]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: An optional human-readable name for this notification channel. It is recommended that you specify a non-empty and unique name in order to make it easier to identify the channels in your project, though this is not enforced. The display name is limited to 512 Unicode characters.
        :param labels: Configuration fields that define the channel and its behavior. The permissible and required labels are specified in the NotificationChannelDescriptor corresponding to the type field. Labels with sensitive data are obfuscated by the API and therefore Terraform cannot determine if there are upstream changes to these fields. They can also be configured via the sensitive_labels block, but cannot be configured in both places.
        :param project: 
        :param type: The type of the notification channel. This field matches the value of the NotificationChannelDescriptor.type field. See https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.notificationChannelDescriptors/list to get the list of valid values such as "email", "slack", etc...
        :param user_labels: User-supplied key/value data that does not need to conform to the corresponding NotificationChannelDescriptor's schema, unlike the labels field. This field is intended to be used for organizing and identifying the NotificationChannel objects.The field can contain up to 64 entries. Each key and value is limited to 63 Unicode characters or 128 bytes, whichever is smaller. Labels and values can contain only lowercase letters, numerals, underscores, and dashes. Keys must begin with a letter.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleMonitoringNotificationChannelConfig(display_name=display_name, labels=labels, project=project, type=type, user_labels=user_labels, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleMonitoringNotificationChannel, self, [scope, id, config])

    @jsii.member(jsii_name="sensitiveLabels")
    def sensitive_labels(self, index: str) -> "DataGoogleMonitoringNotificationChannelSensitiveLabels":
        """
        :param index: -
        """
        return jsii.invoke(self, "sensitiveLabels", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> bool:
        return jsii.get(self, "enabled")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="verificationStatus")
    def verification_status(self) -> str:
        return jsii.get(self, "verificationStatus")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> typing.Optional[str]:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> typing.Optional[str]:
        return jsii.get(self, "type")

    @type.setter
    def type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "type", value)

    @builtins.property
    @jsii.member(jsii_name="userLabels")
    def user_labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "userLabels")

    @user_labels.setter
    def user_labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "userLabels", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleMonitoringNotificationChannelConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'display_name': 'displayName', 'labels': 'labels', 'project': 'project', 'type': 'type', 'user_labels': 'userLabels'})
class DataGoogleMonitoringNotificationChannelConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, display_name: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, type: typing.Optional[str]=None, user_labels: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: An optional human-readable name for this notification channel. It is recommended that you specify a non-empty and unique name in order to make it easier to identify the channels in your project, though this is not enforced. The display name is limited to 512 Unicode characters.
        :param labels: Configuration fields that define the channel and its behavior. The permissible and required labels are specified in the NotificationChannelDescriptor corresponding to the type field. Labels with sensitive data are obfuscated by the API and therefore Terraform cannot determine if there are upstream changes to these fields. They can also be configured via the sensitive_labels block, but cannot be configured in both places.
        :param project: 
        :param type: The type of the notification channel. This field matches the value of the NotificationChannelDescriptor.type field. See https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.notificationChannelDescriptors/list to get the list of valid values such as "email", "slack", etc...
        :param user_labels: User-supplied key/value data that does not need to conform to the corresponding NotificationChannelDescriptor's schema, unlike the labels field. This field is intended to be used for organizing and identifying the NotificationChannel objects.The field can contain up to 64 entries. Each key and value is limited to 63 Unicode characters or 128 bytes, whichever is smaller. Labels and values can contain only lowercase letters, numerals, underscores, and dashes. Keys must begin with a letter.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if display_name is not None: self._values["display_name"] = display_name
        if labels is not None: self._values["labels"] = labels
        if project is not None: self._values["project"] = project
        if type is not None: self._values["type"] = type
        if user_labels is not None: self._values["user_labels"] = user_labels

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """An optional human-readable name for this notification channel.

        It is recommended that you specify a non-empty and unique name in order to make it easier to identify the channels in your project, though this is not enforced. The display name is limited to 512 Unicode characters.
        """
        return self._values.get('display_name')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Configuration fields that define the channel and its behavior.

        The
        permissible and required labels are specified in the
        NotificationChannelDescriptor corresponding to the type field.

        Labels with sensitive data are obfuscated by the API and therefore Terraform cannot
        determine if there are upstream changes to these fields. They can also be configured via
        the sensitive_labels block, but cannot be configured in both places.
        """
        return self._values.get('labels')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        """The type of the notification channel.

        This field matches the value of the NotificationChannelDescriptor.type field. See https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.notificationChannelDescriptors/list to get the list of valid values such as "email", "slack", etc...
        """
        return self._values.get('type')

    @builtins.property
    def user_labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """User-supplied key/value data that does not need to conform to the corresponding NotificationChannelDescriptor's schema, unlike the labels field.

        This field is intended to be used for organizing and identifying the NotificationChannel objects.The field can contain up to 64 entries. Each key and value is limited to 63 Unicode characters or 128 bytes, whichever is smaller. Labels and values can contain only lowercase letters, numerals, underscores, and dashes. Keys must begin with a letter.
        """
        return self._values.get('user_labels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleMonitoringNotificationChannelConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleMonitoringNotificationChannelSensitiveLabels(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleMonitoringNotificationChannelSensitiveLabels"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleMonitoringNotificationChannelSensitiveLabels, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="authToken")
    def auth_token(self) -> str:
        return jsii.get(self, "authToken")

    @builtins.property
    @jsii.member(jsii_name="password")
    def password(self) -> str:
        return jsii.get(self, "password")

    @builtins.property
    @jsii.member(jsii_name="serviceKey")
    def service_key(self) -> str:
        return jsii.get(self, "serviceKey")


class DataGoogleMonitoringUptimeCheckIps(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleMonitoringUptimeCheckIps"):
    def __init__(self, scope: constructs.Construct, id: str, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleMonitoringUptimeCheckIpsConfig(count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleMonitoringUptimeCheckIps, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @jsii.member(jsii_name="uptimeCheckIps")
    def uptime_check_ips(self, index: str) -> "DataGoogleMonitoringUptimeCheckIpsUptimeCheckIps":
        """
        :param index: -
        """
        return jsii.invoke(self, "uptimeCheckIps", [index])

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleMonitoringUptimeCheckIpsConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider'})
class DataGoogleMonitoringUptimeCheckIpsConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleMonitoringUptimeCheckIpsConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleMonitoringUptimeCheckIpsUptimeCheckIps(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleMonitoringUptimeCheckIpsUptimeCheckIps"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleMonitoringUptimeCheckIpsUptimeCheckIps, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> str:
        return jsii.get(self, "ipAddress")

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> str:
        return jsii.get(self, "region")


class DataGoogleNetblockIpRanges(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleNetblockIpRanges"):
    def __init__(self, scope: constructs.Construct, id: str, *, range_type: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param range_type: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleNetblockIpRangesConfig(range_type=range_type, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleNetblockIpRanges, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="cidrBlocks")
    def cidr_blocks(self) -> typing.List[str]:
        return jsii.get(self, "cidrBlocks")

    @builtins.property
    @jsii.member(jsii_name="cidrBlocksIpv4")
    def cidr_blocks_ipv4(self) -> typing.List[str]:
        return jsii.get(self, "cidrBlocksIpv4")

    @builtins.property
    @jsii.member(jsii_name="cidrBlocksIpv6")
    def cidr_blocks_ipv6(self) -> typing.List[str]:
        return jsii.get(self, "cidrBlocksIpv6")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="rangeType")
    def range_type(self) -> typing.Optional[str]:
        return jsii.get(self, "rangeType")

    @range_type.setter
    def range_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "rangeType", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleNetblockIpRangesConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'range_type': 'rangeType'})
class DataGoogleNetblockIpRangesConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, range_type: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param range_type: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if range_type is not None: self._values["range_type"] = range_type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def range_type(self) -> typing.Optional[str]:
        return self._values.get('range_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleNetblockIpRangesConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleOrganization(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleOrganization"):
    def __init__(self, scope: constructs.Construct, id: str, *, domain: typing.Optional[str]=None, organization: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param domain: 
        :param organization: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleOrganizationConfig(domain=domain, organization=organization, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleOrganization, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="directoryCustomerId")
    def directory_customer_id(self) -> str:
        return jsii.get(self, "directoryCustomerId")

    @builtins.property
    @jsii.member(jsii_name="lifecycleState")
    def lifecycle_state(self) -> str:
        return jsii.get(self, "lifecycleState")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> str:
        return jsii.get(self, "orgId")

    @builtins.property
    @jsii.member(jsii_name="domain")
    def domain(self) -> typing.Optional[str]:
        return jsii.get(self, "domain")

    @domain.setter
    def domain(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "domain", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="organization")
    def organization(self) -> typing.Optional[str]:
        return jsii.get(self, "organization")

    @organization.setter
    def organization(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "organization", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleOrganizationConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'domain': 'domain', 'organization': 'organization'})
class DataGoogleOrganizationConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, domain: typing.Optional[str]=None, organization: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param domain: 
        :param organization: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if domain is not None: self._values["domain"] = domain
        if organization is not None: self._values["organization"] = organization

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def domain(self) -> typing.Optional[str]:
        return self._values.get('domain')

    @builtins.property
    def organization(self) -> typing.Optional[str]:
        return self._values.get('organization')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleOrganizationConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleProject(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleProject"):
    def __init__(self, scope: constructs.Construct, id: str, *, project_id: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param project_id: The project ID. Changing this forces a new project to be created.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleProjectConfig(project_id=project_id, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleProject, self, [scope, id, config])

    @jsii.member(jsii_name="labels")
    def labels(self, key: str) -> str:
        """
        :param key: -
        """
        return jsii.invoke(self, "labels", [key])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="autoCreateNetwork")
    def auto_create_network(self) -> bool:
        return jsii.get(self, "autoCreateNetwork")

    @builtins.property
    @jsii.member(jsii_name="billingAccount")
    def billing_account(self) -> str:
        return jsii.get(self, "billingAccount")

    @builtins.property
    @jsii.member(jsii_name="folderId")
    def folder_id(self) -> str:
        return jsii.get(self, "folderId")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="number")
    def number(self) -> str:
        return jsii.get(self, "number")

    @builtins.property
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> str:
        return jsii.get(self, "orgId")

    @builtins.property
    @jsii.member(jsii_name="skipDelete")
    def skip_delete(self) -> bool:
        return jsii.get(self, "skipDelete")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="projectId")
    def project_id(self) -> typing.Optional[str]:
        return jsii.get(self, "projectId")

    @project_id.setter
    def project_id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "projectId", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleProjectConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'project_id': 'projectId'})
class DataGoogleProjectConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, project_id: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param project_id: The project ID. Changing this forces a new project to be created.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project_id is not None: self._values["project_id"] = project_id

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def project_id(self) -> typing.Optional[str]:
        """The project ID.

        Changing this forces a new project to be created.
        """
        return self._values.get('project_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleProjectConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleProjectOrganizationPolicy(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleProjectOrganizationPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, constraint: str, project: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param constraint: The name of the Constraint the Policy is configuring, for example, serviceuser.services.
        :param project: The project ID.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleProjectOrganizationPolicyConfig(constraint=constraint, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleProjectOrganizationPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="booleanPolicy")
    def boolean_policy(self, index: str) -> "DataGoogleProjectOrganizationPolicyBooleanPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "booleanPolicy", [index])

    @jsii.member(jsii_name="listPolicy")
    def list_policy(self, index: str) -> "DataGoogleProjectOrganizationPolicyListPolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "listPolicy", [index])

    @jsii.member(jsii_name="restorePolicy")
    def restore_policy(self, index: str) -> "DataGoogleProjectOrganizationPolicyRestorePolicy":
        """
        :param index: -
        """
        return jsii.invoke(self, "restorePolicy", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="updateTime")
    def update_time(self) -> str:
        return jsii.get(self, "updateTime")

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> jsii.Number:
        return jsii.get(self, "version")

    @builtins.property
    @jsii.member(jsii_name="constraint")
    def constraint(self) -> str:
        return jsii.get(self, "constraint")

    @constraint.setter
    def constraint(self, value: str) -> None:
        jsii.set(self, "constraint", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> str:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: str) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


class DataGoogleProjectOrganizationPolicyBooleanPolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleProjectOrganizationPolicyBooleanPolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleProjectOrganizationPolicyBooleanPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="enforced")
    def enforced(self) -> bool:
        return jsii.get(self, "enforced")


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleProjectOrganizationPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'constraint': 'constraint', 'project': 'project'})
class DataGoogleProjectOrganizationPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, constraint: str, project: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param constraint: The name of the Constraint the Policy is configuring, for example, serviceuser.services.
        :param project: The project ID.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'constraint': constraint,
            'project': project,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def constraint(self) -> str:
        """The name of the Constraint the Policy is configuring, for example, serviceuser.services."""
        return self._values.get('constraint')

    @builtins.property
    def project(self) -> str:
        """The project ID."""
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleProjectOrganizationPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleProjectOrganizationPolicyListPolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleProjectOrganizationPolicyListPolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleProjectOrganizationPolicyListPolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="allow")
    def allow(self) -> typing.Any:
        return jsii.get(self, "allow")

    @builtins.property
    @jsii.member(jsii_name="deny")
    def deny(self) -> typing.Any:
        return jsii.get(self, "deny")

    @builtins.property
    @jsii.member(jsii_name="inheritFromParent")
    def inherit_from_parent(self) -> bool:
        return jsii.get(self, "inheritFromParent")

    @builtins.property
    @jsii.member(jsii_name="suggestedValue")
    def suggested_value(self) -> str:
        return jsii.get(self, "suggestedValue")


class DataGoogleProjectOrganizationPolicyListPolicyAllow(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleProjectOrganizationPolicyListPolicyAllow"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleProjectOrganizationPolicyListPolicyAllow, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="all")
    def all(self) -> bool:
        return jsii.get(self, "all")

    @builtins.property
    @jsii.member(jsii_name="values")
    def values(self) -> typing.List[str]:
        return jsii.get(self, "values")


class DataGoogleProjectOrganizationPolicyListPolicyDeny(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleProjectOrganizationPolicyListPolicyDeny"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleProjectOrganizationPolicyListPolicyDeny, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="all")
    def all(self) -> bool:
        return jsii.get(self, "all")

    @builtins.property
    @jsii.member(jsii_name="values")
    def values(self) -> typing.List[str]:
        return jsii.get(self, "values")


class DataGoogleProjectOrganizationPolicyRestorePolicy(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleProjectOrganizationPolicyRestorePolicy"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleProjectOrganizationPolicyRestorePolicy, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="default")
    def default(self) -> bool:
        return jsii.get(self, "default")


class DataGoogleProjects(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleProjects"):
    def __init__(self, scope: constructs.Construct, id: str, *, filter: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param filter: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleProjectsConfig(filter=filter, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleProjects, self, [scope, id, config])

    @jsii.member(jsii_name="projects")
    def projects(self, index: str) -> "DataGoogleProjectsProjects":
        """
        :param index: -
        """
        return jsii.invoke(self, "projects", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="filter")
    def filter(self) -> str:
        return jsii.get(self, "filter")

    @filter.setter
    def filter(self, value: str) -> None:
        jsii.set(self, "filter", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleProjectsConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'filter': 'filter'})
class DataGoogleProjectsConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, filter: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param filter: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'filter': filter,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def filter(self) -> str:
        return self._values.get('filter')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleProjectsConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleProjectsProjects(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleProjectsProjects"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleProjectsProjects, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="projectId")
    def project_id(self) -> str:
        return jsii.get(self, "projectId")


class DataGoogleRedisInstance(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleRedisInstance"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The ID of the instance or a fully qualified identifier for the instance.
        :param project: 
        :param region: The name of the Redis region of the instance.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleRedisInstanceConfig(name=name, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleRedisInstance, self, [scope, id, config])

    @jsii.member(jsii_name="labels")
    def labels(self, key: str) -> str:
        """
        :param key: -
        """
        return jsii.invoke(self, "labels", [key])

    @jsii.member(jsii_name="redisConfigs")
    def redis_configs(self, key: str) -> str:
        """
        :param key: -
        """
        return jsii.invoke(self, "redisConfigs", [key])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="alternativeLocationId")
    def alternative_location_id(self) -> str:
        return jsii.get(self, "alternativeLocationId")

    @builtins.property
    @jsii.member(jsii_name="authorizedNetwork")
    def authorized_network(self) -> str:
        return jsii.get(self, "authorizedNetwork")

    @builtins.property
    @jsii.member(jsii_name="connectMode")
    def connect_mode(self) -> str:
        return jsii.get(self, "connectMode")

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="currentLocationId")
    def current_location_id(self) -> str:
        return jsii.get(self, "currentLocationId")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @builtins.property
    @jsii.member(jsii_name="host")
    def host(self) -> str:
        return jsii.get(self, "host")

    @builtins.property
    @jsii.member(jsii_name="locationId")
    def location_id(self) -> str:
        return jsii.get(self, "locationId")

    @builtins.property
    @jsii.member(jsii_name="memorySizeGb")
    def memory_size_gb(self) -> jsii.Number:
        return jsii.get(self, "memorySizeGb")

    @builtins.property
    @jsii.member(jsii_name="persistenceIamIdentity")
    def persistence_iam_identity(self) -> str:
        return jsii.get(self, "persistenceIamIdentity")

    @builtins.property
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")

    @builtins.property
    @jsii.member(jsii_name="redisVersion")
    def redis_version(self) -> str:
        return jsii.get(self, "redisVersion")

    @builtins.property
    @jsii.member(jsii_name="reservedIpRange")
    def reserved_ip_range(self) -> str:
        return jsii.get(self, "reservedIpRange")

    @builtins.property
    @jsii.member(jsii_name="tier")
    def tier(self) -> str:
        return jsii.get(self, "tier")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleRedisInstanceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project', 'region': 'region'})
class DataGoogleRedisInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The ID of the instance or a fully qualified identifier for the instance.
        :param project: 
        :param region: The name of the Redis region of the instance.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The ID of the instance or a fully qualified identifier for the instance."""
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The name of the Redis region of the instance."""
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleRedisInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleSecretManagerSecretVersion(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSecretManagerSecretVersion"):
    def __init__(self, scope: constructs.Construct, id: str, *, secret: str, project: typing.Optional[str]=None, version: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param secret: 
        :param project: 
        :param version: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleSecretManagerSecretVersionConfig(secret=secret, project=project, version=version, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleSecretManagerSecretVersion, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="destroyTime")
    def destroy_time(self) -> str:
        return jsii.get(self, "destroyTime")

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> bool:
        return jsii.get(self, "enabled")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="secretData")
    def secret_data(self) -> str:
        return jsii.get(self, "secretData")

    @builtins.property
    @jsii.member(jsii_name="secret")
    def secret(self) -> str:
        return jsii.get(self, "secret")

    @secret.setter
    def secret(self, value: str) -> None:
        jsii.set(self, "secret", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> typing.Optional[str]:
        return jsii.get(self, "version")

    @version.setter
    def version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleSecretManagerSecretVersionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'secret': 'secret', 'project': 'project', 'version': 'version'})
class DataGoogleSecretManagerSecretVersionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, secret: str, project: typing.Optional[str]=None, version: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param secret: 
        :param project: 
        :param version: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'secret': secret,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if version is not None: self._values["version"] = version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def secret(self) -> str:
        return self._values.get('secret')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def version(self) -> typing.Optional[str]:
        return self._values.get('version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleSecretManagerSecretVersionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleServiceAccount(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleServiceAccount"):
    def __init__(self, scope: constructs.Construct, id: str, *, account_id: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param account_id: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleServiceAccountConfig(account_id=account_id, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleServiceAccount, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @builtins.property
    @jsii.member(jsii_name="email")
    def email(self) -> str:
        return jsii.get(self, "email")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="uniqueId")
    def unique_id(self) -> str:
        return jsii.get(self, "uniqueId")

    @builtins.property
    @jsii.member(jsii_name="accountId")
    def account_id(self) -> str:
        return jsii.get(self, "accountId")

    @account_id.setter
    def account_id(self, value: str) -> None:
        jsii.set(self, "accountId", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


class DataGoogleServiceAccountAccessToken(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleServiceAccountAccessToken"):
    def __init__(self, scope: constructs.Construct, id: str, *, scopes: typing.List[str], target_service_account: str, delegates: typing.Optional[typing.List[str]]=None, lifetime: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param scopes: 
        :param target_service_account: 
        :param delegates: 
        :param lifetime: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleServiceAccountAccessTokenConfig(scopes=scopes, target_service_account=target_service_account, delegates=delegates, lifetime=lifetime, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleServiceAccountAccessToken, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="accessToken")
    def access_token(self) -> str:
        return jsii.get(self, "accessToken")

    @builtins.property
    @jsii.member(jsii_name="scopes")
    def scopes(self) -> typing.List[str]:
        return jsii.get(self, "scopes")

    @scopes.setter
    def scopes(self, value: typing.List[str]) -> None:
        jsii.set(self, "scopes", value)

    @builtins.property
    @jsii.member(jsii_name="targetServiceAccount")
    def target_service_account(self) -> str:
        return jsii.get(self, "targetServiceAccount")

    @target_service_account.setter
    def target_service_account(self, value: str) -> None:
        jsii.set(self, "targetServiceAccount", value)

    @builtins.property
    @jsii.member(jsii_name="delegates")
    def delegates(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "delegates")

    @delegates.setter
    def delegates(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "delegates", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="lifetime")
    def lifetime(self) -> typing.Optional[str]:
        return jsii.get(self, "lifetime")

    @lifetime.setter
    def lifetime(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "lifetime", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleServiceAccountAccessTokenConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'scopes': 'scopes', 'target_service_account': 'targetServiceAccount', 'delegates': 'delegates', 'lifetime': 'lifetime'})
class DataGoogleServiceAccountAccessTokenConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, scopes: typing.List[str], target_service_account: str, delegates: typing.Optional[typing.List[str]]=None, lifetime: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param scopes: 
        :param target_service_account: 
        :param delegates: 
        :param lifetime: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'scopes': scopes,
            'target_service_account': target_service_account,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if delegates is not None: self._values["delegates"] = delegates
        if lifetime is not None: self._values["lifetime"] = lifetime

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def scopes(self) -> typing.List[str]:
        return self._values.get('scopes')

    @builtins.property
    def target_service_account(self) -> str:
        return self._values.get('target_service_account')

    @builtins.property
    def delegates(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('delegates')

    @builtins.property
    def lifetime(self) -> typing.Optional[str]:
        return self._values.get('lifetime')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleServiceAccountAccessTokenConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleServiceAccountConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'account_id': 'accountId', 'project': 'project'})
class DataGoogleServiceAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, account_id: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_id: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'account_id': account_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def account_id(self) -> str:
        return self._values.get('account_id')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleServiceAccountConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleServiceAccountIdToken(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleServiceAccountIdToken"):
    def __init__(self, scope: constructs.Construct, id: str, *, target_audience: str, delegates: typing.Optional[typing.List[str]]=None, include_email: typing.Optional[bool]=None, target_service_account: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param target_audience: 
        :param delegates: 
        :param include_email: 
        :param target_service_account: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleServiceAccountIdTokenConfig(target_audience=target_audience, delegates=delegates, include_email=include_email, target_service_account=target_service_account, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleServiceAccountIdToken, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="idToken")
    def id_token(self) -> str:
        return jsii.get(self, "idToken")

    @builtins.property
    @jsii.member(jsii_name="targetAudience")
    def target_audience(self) -> str:
        return jsii.get(self, "targetAudience")

    @target_audience.setter
    def target_audience(self, value: str) -> None:
        jsii.set(self, "targetAudience", value)

    @builtins.property
    @jsii.member(jsii_name="delegates")
    def delegates(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "delegates")

    @delegates.setter
    def delegates(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "delegates", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="includeEmail")
    def include_email(self) -> typing.Optional[bool]:
        return jsii.get(self, "includeEmail")

    @include_email.setter
    def include_email(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "includeEmail", value)

    @builtins.property
    @jsii.member(jsii_name="targetServiceAccount")
    def target_service_account(self) -> typing.Optional[str]:
        return jsii.get(self, "targetServiceAccount")

    @target_service_account.setter
    def target_service_account(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "targetServiceAccount", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleServiceAccountIdTokenConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'target_audience': 'targetAudience', 'delegates': 'delegates', 'include_email': 'includeEmail', 'target_service_account': 'targetServiceAccount'})
class DataGoogleServiceAccountIdTokenConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, target_audience: str, delegates: typing.Optional[typing.List[str]]=None, include_email: typing.Optional[bool]=None, target_service_account: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param target_audience: 
        :param delegates: 
        :param include_email: 
        :param target_service_account: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'target_audience': target_audience,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if delegates is not None: self._values["delegates"] = delegates
        if include_email is not None: self._values["include_email"] = include_email
        if target_service_account is not None: self._values["target_service_account"] = target_service_account

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def target_audience(self) -> str:
        return self._values.get('target_audience')

    @builtins.property
    def delegates(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('delegates')

    @builtins.property
    def include_email(self) -> typing.Optional[bool]:
        return self._values.get('include_email')

    @builtins.property
    def target_service_account(self) -> typing.Optional[str]:
        return self._values.get('target_service_account')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleServiceAccountIdTokenConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleServiceAccountKey(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleServiceAccountKey"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, public_key_type: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: 
        :param project: 
        :param public_key_type: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleServiceAccountKeyConfig(name=name, project=project, public_key_type=public_key_type, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleServiceAccountKey, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="keyAlgorithm")
    def key_algorithm(self) -> str:
        return jsii.get(self, "keyAlgorithm")

    @builtins.property
    @jsii.member(jsii_name="publicKey")
    def public_key(self) -> str:
        return jsii.get(self, "publicKey")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="publicKeyType")
    def public_key_type(self) -> typing.Optional[str]:
        return jsii.get(self, "publicKeyType")

    @public_key_type.setter
    def public_key_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "publicKeyType", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleServiceAccountKeyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project', 'public_key_type': 'publicKeyType'})
class DataGoogleServiceAccountKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None, public_key_type: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: 
        :param project: 
        :param public_key_type: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if public_key_type is not None: self._values["public_key_type"] = public_key_type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def public_key_type(self) -> typing.Optional[str]:
        return self._values.get('public_key_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleServiceAccountKeyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleSqlCaCerts(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlCaCerts"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleSqlCaCertsConfig(instance=instance, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleSqlCaCerts, self, [scope, id, config])

    @jsii.member(jsii_name="certs")
    def certs(self, index: str) -> "DataGoogleSqlCaCertsCerts":
        """
        :param index: -
        """
        return jsii.invoke(self, "certs", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="activeVersion")
    def active_version(self) -> str:
        return jsii.get(self, "activeVersion")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


class DataGoogleSqlCaCertsCerts(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlCaCertsCerts"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleSqlCaCertsCerts, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="cert")
    def cert(self) -> str:
        return jsii.get(self, "cert")

    @builtins.property
    @jsii.member(jsii_name="commonName")
    def common_name(self) -> str:
        return jsii.get(self, "commonName")

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="expirationTime")
    def expiration_time(self) -> str:
        return jsii.get(self, "expirationTime")

    @builtins.property
    @jsii.member(jsii_name="sha1Fingerprint")
    def sha1_fingerprint(self) -> str:
        return jsii.get(self, "sha1Fingerprint")


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleSqlCaCertsConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'project': 'project'})
class DataGoogleSqlCaCertsConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance': instance,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleSqlCaCertsConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleSqlDatabaseInstance(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlDatabaseInstance"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the instance. If the name is left blank, Terraform will randomly generate one when the instance is first created. This is done because after a name is used, it cannot be reused for up to one week.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleSqlDatabaseInstanceConfig(name=name, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleSqlDatabaseInstance, self, [scope, id, config])

    @jsii.member(jsii_name="ipAddress")
    def ip_address(self, index: str) -> "DataGoogleSqlDatabaseInstanceIpAddress":
        """
        :param index: -
        """
        return jsii.invoke(self, "ipAddress", [index])

    @jsii.member(jsii_name="replicaConfiguration")
    def replica_configuration(self, index: str) -> "DataGoogleSqlDatabaseInstanceReplicaConfiguration":
        """
        :param index: -
        """
        return jsii.invoke(self, "replicaConfiguration", [index])

    @jsii.member(jsii_name="serverCaCert")
    def server_ca_cert(self, index: str) -> "DataGoogleSqlDatabaseInstanceServerCaCert":
        """
        :param index: -
        """
        return jsii.invoke(self, "serverCaCert", [index])

    @jsii.member(jsii_name="settings")
    def settings(self, index: str) -> "DataGoogleSqlDatabaseInstanceSettings":
        """
        :param index: -
        """
        return jsii.invoke(self, "settings", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="connectionName")
    def connection_name(self) -> str:
        return jsii.get(self, "connectionName")

    @builtins.property
    @jsii.member(jsii_name="databaseVersion")
    def database_version(self) -> str:
        return jsii.get(self, "databaseVersion")

    @builtins.property
    @jsii.member(jsii_name="firstIpAddress")
    def first_ip_address(self) -> str:
        return jsii.get(self, "firstIpAddress")

    @builtins.property
    @jsii.member(jsii_name="masterInstanceName")
    def master_instance_name(self) -> str:
        return jsii.get(self, "masterInstanceName")

    @builtins.property
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> str:
        return jsii.get(self, "project")

    @builtins.property
    @jsii.member(jsii_name="publicIpAddress")
    def public_ip_address(self) -> str:
        return jsii.get(self, "publicIpAddress")

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> str:
        return jsii.get(self, "region")

    @builtins.property
    @jsii.member(jsii_name="rootPassword")
    def root_password(self) -> str:
        return jsii.get(self, "rootPassword")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="serviceAccountEmailAddress")
    def service_account_email_address(self) -> str:
        return jsii.get(self, "serviceAccountEmailAddress")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleSqlDatabaseInstanceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name'})
class DataGoogleSqlDatabaseInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the instance. If the name is left blank, Terraform will randomly generate one when the instance is first created. This is done because after a name is used, it cannot be reused for up to one week.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name of the instance.

        If the name is left blank, Terraform will randomly generate one when the instance is first created. This is done because after a name is used, it cannot be reused for up to one week.
        """
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleSqlDatabaseInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleSqlDatabaseInstanceIpAddress(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlDatabaseInstanceIpAddress"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleSqlDatabaseInstanceIpAddress, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> str:
        return jsii.get(self, "ipAddress")

    @builtins.property
    @jsii.member(jsii_name="timeToRetire")
    def time_to_retire(self) -> str:
        return jsii.get(self, "timeToRetire")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")


class DataGoogleSqlDatabaseInstanceReplicaConfiguration(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlDatabaseInstanceReplicaConfiguration"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleSqlDatabaseInstanceReplicaConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="caCertificate")
    def ca_certificate(self) -> str:
        return jsii.get(self, "caCertificate")

    @builtins.property
    @jsii.member(jsii_name="clientCertificate")
    def client_certificate(self) -> str:
        return jsii.get(self, "clientCertificate")

    @builtins.property
    @jsii.member(jsii_name="clientKey")
    def client_key(self) -> str:
        return jsii.get(self, "clientKey")

    @builtins.property
    @jsii.member(jsii_name="connectRetryInterval")
    def connect_retry_interval(self) -> jsii.Number:
        return jsii.get(self, "connectRetryInterval")

    @builtins.property
    @jsii.member(jsii_name="dumpFilePath")
    def dump_file_path(self) -> str:
        return jsii.get(self, "dumpFilePath")

    @builtins.property
    @jsii.member(jsii_name="failoverTarget")
    def failover_target(self) -> bool:
        return jsii.get(self, "failoverTarget")

    @builtins.property
    @jsii.member(jsii_name="masterHeartbeatPeriod")
    def master_heartbeat_period(self) -> jsii.Number:
        return jsii.get(self, "masterHeartbeatPeriod")

    @builtins.property
    @jsii.member(jsii_name="password")
    def password(self) -> str:
        return jsii.get(self, "password")

    @builtins.property
    @jsii.member(jsii_name="sslCipher")
    def ssl_cipher(self) -> str:
        return jsii.get(self, "sslCipher")

    @builtins.property
    @jsii.member(jsii_name="username")
    def username(self) -> str:
        return jsii.get(self, "username")

    @builtins.property
    @jsii.member(jsii_name="verifyServerCertificate")
    def verify_server_certificate(self) -> bool:
        return jsii.get(self, "verifyServerCertificate")


class DataGoogleSqlDatabaseInstanceServerCaCert(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlDatabaseInstanceServerCaCert"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleSqlDatabaseInstanceServerCaCert, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="cert")
    def cert(self) -> str:
        return jsii.get(self, "cert")

    @builtins.property
    @jsii.member(jsii_name="commonName")
    def common_name(self) -> str:
        return jsii.get(self, "commonName")

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="expirationTime")
    def expiration_time(self) -> str:
        return jsii.get(self, "expirationTime")

    @builtins.property
    @jsii.member(jsii_name="sha1Fingerprint")
    def sha1_fingerprint(self) -> str:
        return jsii.get(self, "sha1Fingerprint")


class DataGoogleSqlDatabaseInstanceSettings(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlDatabaseInstanceSettings"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleSqlDatabaseInstanceSettings, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="activationPolicy")
    def activation_policy(self) -> str:
        return jsii.get(self, "activationPolicy")

    @builtins.property
    @jsii.member(jsii_name="authorizedGaeApplications")
    def authorized_gae_applications(self) -> typing.List[str]:
        return jsii.get(self, "authorizedGaeApplications")

    @builtins.property
    @jsii.member(jsii_name="availabilityType")
    def availability_type(self) -> str:
        return jsii.get(self, "availabilityType")

    @builtins.property
    @jsii.member(jsii_name="backupConfiguration")
    def backup_configuration(self) -> typing.Any:
        return jsii.get(self, "backupConfiguration")

    @builtins.property
    @jsii.member(jsii_name="crashSafeReplication")
    def crash_safe_replication(self) -> bool:
        return jsii.get(self, "crashSafeReplication")

    @builtins.property
    @jsii.member(jsii_name="databaseFlags")
    def database_flags(self) -> typing.Any:
        return jsii.get(self, "databaseFlags")

    @builtins.property
    @jsii.member(jsii_name="diskAutoresize")
    def disk_autoresize(self) -> bool:
        return jsii.get(self, "diskAutoresize")

    @builtins.property
    @jsii.member(jsii_name="diskSize")
    def disk_size(self) -> jsii.Number:
        return jsii.get(self, "diskSize")

    @builtins.property
    @jsii.member(jsii_name="diskType")
    def disk_type(self) -> str:
        return jsii.get(self, "diskType")

    @builtins.property
    @jsii.member(jsii_name="ipConfiguration")
    def ip_configuration(self) -> typing.Any:
        return jsii.get(self, "ipConfiguration")

    @builtins.property
    @jsii.member(jsii_name="locationPreference")
    def location_preference(self) -> typing.Any:
        return jsii.get(self, "locationPreference")

    @builtins.property
    @jsii.member(jsii_name="maintenanceWindow")
    def maintenance_window(self) -> typing.Any:
        return jsii.get(self, "maintenanceWindow")

    @builtins.property
    @jsii.member(jsii_name="pricingPlan")
    def pricing_plan(self) -> str:
        return jsii.get(self, "pricingPlan")

    @builtins.property
    @jsii.member(jsii_name="replicationType")
    def replication_type(self) -> str:
        return jsii.get(self, "replicationType")

    @builtins.property
    @jsii.member(jsii_name="tier")
    def tier(self) -> str:
        return jsii.get(self, "tier")

    @builtins.property
    @jsii.member(jsii_name="userLabels")
    def user_labels(self) -> typing.Any:
        return jsii.get(self, "userLabels")

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> jsii.Number:
        return jsii.get(self, "version")


class DataGoogleSqlDatabaseInstanceSettingsBackupConfiguration(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlDatabaseInstanceSettingsBackupConfiguration"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleSqlDatabaseInstanceSettingsBackupConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="binaryLogEnabled")
    def binary_log_enabled(self) -> bool:
        return jsii.get(self, "binaryLogEnabled")

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> bool:
        return jsii.get(self, "enabled")

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @builtins.property
    @jsii.member(jsii_name="pointInTimeRecoveryEnabled")
    def point_in_time_recovery_enabled(self) -> bool:
        return jsii.get(self, "pointInTimeRecoveryEnabled")

    @builtins.property
    @jsii.member(jsii_name="startTime")
    def start_time(self) -> str:
        return jsii.get(self, "startTime")


class DataGoogleSqlDatabaseInstanceSettingsDatabaseFlags(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlDatabaseInstanceSettingsDatabaseFlags"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleSqlDatabaseInstanceSettingsDatabaseFlags, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="value")
    def value(self) -> str:
        return jsii.get(self, "value")


class DataGoogleSqlDatabaseInstanceSettingsIpConfiguration(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlDatabaseInstanceSettingsIpConfiguration"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleSqlDatabaseInstanceSettingsIpConfiguration, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="authorizedNetworks")
    def authorized_networks(self) -> typing.Any:
        return jsii.get(self, "authorizedNetworks")

    @builtins.property
    @jsii.member(jsii_name="ipv4Enabled")
    def ipv4_enabled(self) -> bool:
        return jsii.get(self, "ipv4Enabled")

    @builtins.property
    @jsii.member(jsii_name="privateNetwork")
    def private_network(self) -> str:
        return jsii.get(self, "privateNetwork")

    @builtins.property
    @jsii.member(jsii_name="requireSsl")
    def require_ssl(self) -> bool:
        return jsii.get(self, "requireSsl")


class DataGoogleSqlDatabaseInstanceSettingsIpConfigurationAuthorizedNetworks(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlDatabaseInstanceSettingsIpConfigurationAuthorizedNetworks"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleSqlDatabaseInstanceSettingsIpConfigurationAuthorizedNetworks, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="expirationTime")
    def expiration_time(self) -> str:
        return jsii.get(self, "expirationTime")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="value")
    def value(self) -> str:
        return jsii.get(self, "value")


class DataGoogleSqlDatabaseInstanceSettingsLocationPreference(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlDatabaseInstanceSettingsLocationPreference"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleSqlDatabaseInstanceSettingsLocationPreference, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="followGaeApplication")
    def follow_gae_application(self) -> str:
        return jsii.get(self, "followGaeApplication")

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> str:
        return jsii.get(self, "zone")


class DataGoogleSqlDatabaseInstanceSettingsMaintenanceWindow(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleSqlDatabaseInstanceSettingsMaintenanceWindow"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataGoogleSqlDatabaseInstanceSettingsMaintenanceWindow, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="day")
    def day(self) -> jsii.Number:
        return jsii.get(self, "day")

    @builtins.property
    @jsii.member(jsii_name="hour")
    def hour(self) -> jsii.Number:
        return jsii.get(self, "hour")

    @builtins.property
    @jsii.member(jsii_name="updateTrack")
    def update_track(self) -> str:
        return jsii.get(self, "updateTrack")


class DataGoogleStorageBucketObject(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleStorageBucketObject"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: typing.Optional[str]=None, name: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: The name of the containing bucket.
        :param name: The name of the object. If you're interpolating the name of this object, see output_name instead.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleStorageBucketObjectConfig(bucket=bucket, name=name, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleStorageBucketObject, self, [scope, id, config])

    @jsii.member(jsii_name="metadata")
    def metadata(self, key: str) -> str:
        """
        :param key: -
        """
        return jsii.invoke(self, "metadata", [key])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="cacheControl")
    def cache_control(self) -> str:
        return jsii.get(self, "cacheControl")

    @builtins.property
    @jsii.member(jsii_name="content")
    def content(self) -> str:
        return jsii.get(self, "content")

    @builtins.property
    @jsii.member(jsii_name="contentDisposition")
    def content_disposition(self) -> str:
        return jsii.get(self, "contentDisposition")

    @builtins.property
    @jsii.member(jsii_name="contentEncoding")
    def content_encoding(self) -> str:
        return jsii.get(self, "contentEncoding")

    @builtins.property
    @jsii.member(jsii_name="contentLanguage")
    def content_language(self) -> str:
        return jsii.get(self, "contentLanguage")

    @builtins.property
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> str:
        return jsii.get(self, "contentType")

    @builtins.property
    @jsii.member(jsii_name="crc32C")
    def crc32_c(self) -> str:
        return jsii.get(self, "crc32C")

    @builtins.property
    @jsii.member(jsii_name="detectMd5Hash")
    def detect_md5_hash(self) -> str:
        return jsii.get(self, "detectMd5Hash")

    @builtins.property
    @jsii.member(jsii_name="md5Hash")
    def md5_hash(self) -> str:
        return jsii.get(self, "md5Hash")

    @builtins.property
    @jsii.member(jsii_name="mediaLink")
    def media_link(self) -> str:
        return jsii.get(self, "mediaLink")

    @builtins.property
    @jsii.member(jsii_name="outputName")
    def output_name(self) -> str:
        return jsii.get(self, "outputName")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="source")
    def source(self) -> str:
        return jsii.get(self, "source")

    @builtins.property
    @jsii.member(jsii_name="storageClass")
    def storage_class(self) -> str:
        return jsii.get(self, "storageClass")

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> typing.Optional[str]:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleStorageBucketObjectConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'name': 'name'})
class DataGoogleStorageBucketObjectConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: typing.Optional[str]=None, name: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: The name of the containing bucket.
        :param name: The name of the object. If you're interpolating the name of this object, see output_name instead.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if bucket is not None: self._values["bucket"] = bucket
        if name is not None: self._values["name"] = name

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> typing.Optional[str]:
        """The name of the containing bucket."""
        return self._values.get('bucket')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """The name of the object.

        If you're interpolating the name of this object, see output_name instead.
        """
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleStorageBucketObjectConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleStorageObjectSignedUrl(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleStorageObjectSignedUrl"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: str, path: str, content_md5: typing.Optional[str]=None, content_type: typing.Optional[str]=None, credentials: typing.Optional[str]=None, duration: typing.Optional[str]=None, extension_headers: typing.Optional[typing.Mapping[str, str]]=None, http_method: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: 
        :param path: 
        :param content_md5: 
        :param content_type: 
        :param credentials: 
        :param duration: 
        :param extension_headers: 
        :param http_method: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleStorageObjectSignedUrlConfig(bucket=bucket, path=path, content_md5=content_md5, content_type=content_type, credentials=credentials, duration=duration, extension_headers=extension_headers, http_method=http_method, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleStorageObjectSignedUrl, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="signedUrl")
    def signed_url(self) -> str:
        return jsii.get(self, "signedUrl")

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> str:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: str) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="path")
    def path(self) -> str:
        return jsii.get(self, "path")

    @path.setter
    def path(self, value: str) -> None:
        jsii.set(self, "path", value)

    @builtins.property
    @jsii.member(jsii_name="contentMd5")
    def content_md5(self) -> typing.Optional[str]:
        return jsii.get(self, "contentMd5")

    @content_md5.setter
    def content_md5(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "contentMd5", value)

    @builtins.property
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> typing.Optional[str]:
        return jsii.get(self, "contentType")

    @content_type.setter
    def content_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "contentType", value)

    @builtins.property
    @jsii.member(jsii_name="credentials")
    def credentials(self) -> typing.Optional[str]:
        return jsii.get(self, "credentials")

    @credentials.setter
    def credentials(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "credentials", value)

    @builtins.property
    @jsii.member(jsii_name="duration")
    def duration(self) -> typing.Optional[str]:
        return jsii.get(self, "duration")

    @duration.setter
    def duration(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "duration", value)

    @builtins.property
    @jsii.member(jsii_name="extensionHeaders")
    def extension_headers(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "extensionHeaders")

    @extension_headers.setter
    def extension_headers(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "extensionHeaders", value)

    @builtins.property
    @jsii.member(jsii_name="httpMethod")
    def http_method(self) -> typing.Optional[str]:
        return jsii.get(self, "httpMethod")

    @http_method.setter
    def http_method(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "httpMethod", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleStorageObjectSignedUrlConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'path': 'path', 'content_md5': 'contentMd5', 'content_type': 'contentType', 'credentials': 'credentials', 'duration': 'duration', 'extension_headers': 'extensionHeaders', 'http_method': 'httpMethod'})
class DataGoogleStorageObjectSignedUrlConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: str, path: str, content_md5: typing.Optional[str]=None, content_type: typing.Optional[str]=None, credentials: typing.Optional[str]=None, duration: typing.Optional[str]=None, extension_headers: typing.Optional[typing.Mapping[str, str]]=None, http_method: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: 
        :param path: 
        :param content_md5: 
        :param content_type: 
        :param credentials: 
        :param duration: 
        :param extension_headers: 
        :param http_method: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'bucket': bucket,
            'path': path,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if content_md5 is not None: self._values["content_md5"] = content_md5
        if content_type is not None: self._values["content_type"] = content_type
        if credentials is not None: self._values["credentials"] = credentials
        if duration is not None: self._values["duration"] = duration
        if extension_headers is not None: self._values["extension_headers"] = extension_headers
        if http_method is not None: self._values["http_method"] = http_method

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> str:
        return self._values.get('bucket')

    @builtins.property
    def path(self) -> str:
        return self._values.get('path')

    @builtins.property
    def content_md5(self) -> typing.Optional[str]:
        return self._values.get('content_md5')

    @builtins.property
    def content_type(self) -> typing.Optional[str]:
        return self._values.get('content_type')

    @builtins.property
    def credentials(self) -> typing.Optional[str]:
        return self._values.get('credentials')

    @builtins.property
    def duration(self) -> typing.Optional[str]:
        return self._values.get('duration')

    @builtins.property
    def extension_headers(self) -> typing.Optional[typing.Mapping[str, str]]:
        return self._values.get('extension_headers')

    @builtins.property
    def http_method(self) -> typing.Optional[str]:
        return self._values.get('http_method')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleStorageObjectSignedUrlConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleStorageProjectServiceAccount(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleStorageProjectServiceAccount"):
    def __init__(self, scope: constructs.Construct, id: str, *, project: typing.Optional[str]=None, user_project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param project: 
        :param user_project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleStorageProjectServiceAccountConfig(project=project, user_project=user_project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleStorageProjectServiceAccount, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="emailAddress")
    def email_address(self) -> str:
        return jsii.get(self, "emailAddress")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="userProject")
    def user_project(self) -> typing.Optional[str]:
        return jsii.get(self, "userProject")

    @user_project.setter
    def user_project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "userProject", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleStorageProjectServiceAccountConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'project': 'project', 'user_project': 'userProject'})
class DataGoogleStorageProjectServiceAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, project: typing.Optional[str]=None, user_project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param project: 
        :param user_project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if user_project is not None: self._values["user_project"] = user_project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def user_project(self) -> typing.Optional[str]:
        return self._values.get('user_project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleStorageProjectServiceAccountConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleStorageTransferProjectServiceAccount(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleStorageTransferProjectServiceAccount"):
    def __init__(self, scope: constructs.Construct, id: str, *, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleStorageTransferProjectServiceAccountConfig(project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleStorageTransferProjectServiceAccount, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="email")
    def email(self) -> str:
        return jsii.get(self, "email")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleStorageTransferProjectServiceAccountConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'project': 'project'})
class DataGoogleStorageTransferProjectServiceAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleStorageTransferProjectServiceAccountConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataGoogleTpuTensorflowVersions(cdktf.TerraformDataSource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataGoogleTpuTensorflowVersions"):
    def __init__(self, scope: constructs.Construct, id: str, *, project: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param project: 
        :param zone: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataGoogleTpuTensorflowVersionsConfig(project=project, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataGoogleTpuTensorflowVersions, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="versions")
    def versions(self) -> typing.List[str]:
        return jsii.get(self, "versions")

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataGoogleTpuTensorflowVersionsConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'project': 'project', 'zone': 'zone'})
class DataGoogleTpuTensorflowVersionsConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, project: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param project: 
        :param zone: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataGoogleTpuTensorflowVersionsConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataflowJob(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataflowJob"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, temp_gcs_location: str, template_gcs_path: str, additional_experiments: typing.Optional[typing.List[str]]=None, ip_configuration: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, machine_type: typing.Optional[str]=None, max_workers: typing.Optional[jsii.Number]=None, network: typing.Optional[str]=None, on_delete: typing.Optional[str]=None, parameters: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, service_account_email: typing.Optional[str]=None, subnetwork: typing.Optional[str]=None, timeouts: typing.Optional["DataflowJobTimeouts"]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: A unique name for the resource, required by Dataflow.
        :param temp_gcs_location: A writeable location on GCS for the Dataflow job to dump its temporary data.
        :param template_gcs_path: The GCS path to the Dataflow job template.
        :param additional_experiments: List of experiments that should be used by the job. An example value is ["enable_stackdriver_agent_metrics"].
        :param ip_configuration: The configuration for VM IPs. Options are "WORKER_IP_PUBLIC" or "WORKER_IP_PRIVATE".
        :param labels: User labels to be specified for the job. Keys and values should follow the restrictions specified in the labeling restrictions page. NOTE: Google-provided Dataflow templates often provide default labels that begin with goog-dataflow-provided. Unless explicitly set in config, these labels will be ignored to prevent diffs on re-apply.
        :param machine_type: The machine type to use for the job.
        :param max_workers: The number of workers permitted to work on the job. More workers may improve processing speed at additional cost.
        :param network: The network to which VMs will be assigned. If it is not provided, "default" will be used.
        :param on_delete: One of "drain" or "cancel". Specifies behavior of deletion during terraform destroy.
        :param parameters: Key/Value pairs to be passed to the Dataflow job (as used in the template).
        :param project: The project in which the resource belongs.
        :param region: The region in which the created job should run.
        :param service_account_email: The Service Account email used to create the job.
        :param subnetwork: The subnetwork to which VMs will be assigned. Should be of the form "regions/REGION/subnetworks/SUBNETWORK".
        :param timeouts: timeouts block.
        :param zone: The zone in which the created job should run. If it is not provided, the provider zone is used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataflowJobConfig(name=name, temp_gcs_location=temp_gcs_location, template_gcs_path=template_gcs_path, additional_experiments=additional_experiments, ip_configuration=ip_configuration, labels=labels, machine_type=machine_type, max_workers=max_workers, network=network, on_delete=on_delete, parameters=parameters, project=project, region=region, service_account_email=service_account_email, subnetwork=subnetwork, timeouts=timeouts, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataflowJob, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="jobId")
    def job_id(self) -> str:
        return jsii.get(self, "jobId")

    @builtins.property
    @jsii.member(jsii_name="state")
    def state(self) -> str:
        return jsii.get(self, "state")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="tempGcsLocation")
    def temp_gcs_location(self) -> str:
        return jsii.get(self, "tempGcsLocation")

    @temp_gcs_location.setter
    def temp_gcs_location(self, value: str) -> None:
        jsii.set(self, "tempGcsLocation", value)

    @builtins.property
    @jsii.member(jsii_name="templateGcsPath")
    def template_gcs_path(self) -> str:
        return jsii.get(self, "templateGcsPath")

    @template_gcs_path.setter
    def template_gcs_path(self, value: str) -> None:
        jsii.set(self, "templateGcsPath", value)

    @builtins.property
    @jsii.member(jsii_name="additionalExperiments")
    def additional_experiments(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "additionalExperiments")

    @additional_experiments.setter
    def additional_experiments(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "additionalExperiments", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="ipConfiguration")
    def ip_configuration(self) -> typing.Optional[str]:
        return jsii.get(self, "ipConfiguration")

    @ip_configuration.setter
    def ip_configuration(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "ipConfiguration", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="machineType")
    def machine_type(self) -> typing.Optional[str]:
        return jsii.get(self, "machineType")

    @machine_type.setter
    def machine_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "machineType", value)

    @builtins.property
    @jsii.member(jsii_name="maxWorkers")
    def max_workers(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxWorkers")

    @max_workers.setter
    def max_workers(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "maxWorkers", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> typing.Optional[str]:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="onDelete")
    def on_delete(self) -> typing.Optional[str]:
        return jsii.get(self, "onDelete")

    @on_delete.setter
    def on_delete(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "onDelete", value)

    @builtins.property
    @jsii.member(jsii_name="parameters")
    def parameters(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "parameters")

    @parameters.setter
    def parameters(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "parameters", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="serviceAccountEmail")
    def service_account_email(self) -> typing.Optional[str]:
        return jsii.get(self, "serviceAccountEmail")

    @service_account_email.setter
    def service_account_email(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "serviceAccountEmail", value)

    @builtins.property
    @jsii.member(jsii_name="subnetwork")
    def subnetwork(self) -> typing.Optional[str]:
        return jsii.get(self, "subnetwork")

    @subnetwork.setter
    def subnetwork(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "subnetwork", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DataflowJobTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DataflowJobTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataflowJobConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'temp_gcs_location': 'tempGcsLocation', 'template_gcs_path': 'templateGcsPath', 'additional_experiments': 'additionalExperiments', 'ip_configuration': 'ipConfiguration', 'labels': 'labels', 'machine_type': 'machineType', 'max_workers': 'maxWorkers', 'network': 'network', 'on_delete': 'onDelete', 'parameters': 'parameters', 'project': 'project', 'region': 'region', 'service_account_email': 'serviceAccountEmail', 'subnetwork': 'subnetwork', 'timeouts': 'timeouts', 'zone': 'zone'})
class DataflowJobConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, temp_gcs_location: str, template_gcs_path: str, additional_experiments: typing.Optional[typing.List[str]]=None, ip_configuration: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, machine_type: typing.Optional[str]=None, max_workers: typing.Optional[jsii.Number]=None, network: typing.Optional[str]=None, on_delete: typing.Optional[str]=None, parameters: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, service_account_email: typing.Optional[str]=None, subnetwork: typing.Optional[str]=None, timeouts: typing.Optional["DataflowJobTimeouts"]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: A unique name for the resource, required by Dataflow.
        :param temp_gcs_location: A writeable location on GCS for the Dataflow job to dump its temporary data.
        :param template_gcs_path: The GCS path to the Dataflow job template.
        :param additional_experiments: List of experiments that should be used by the job. An example value is ["enable_stackdriver_agent_metrics"].
        :param ip_configuration: The configuration for VM IPs. Options are "WORKER_IP_PUBLIC" or "WORKER_IP_PRIVATE".
        :param labels: User labels to be specified for the job. Keys and values should follow the restrictions specified in the labeling restrictions page. NOTE: Google-provided Dataflow templates often provide default labels that begin with goog-dataflow-provided. Unless explicitly set in config, these labels will be ignored to prevent diffs on re-apply.
        :param machine_type: The machine type to use for the job.
        :param max_workers: The number of workers permitted to work on the job. More workers may improve processing speed at additional cost.
        :param network: The network to which VMs will be assigned. If it is not provided, "default" will be used.
        :param on_delete: One of "drain" or "cancel". Specifies behavior of deletion during terraform destroy.
        :param parameters: Key/Value pairs to be passed to the Dataflow job (as used in the template).
        :param project: The project in which the resource belongs.
        :param region: The region in which the created job should run.
        :param service_account_email: The Service Account email used to create the job.
        :param subnetwork: The subnetwork to which VMs will be assigned. Should be of the form "regions/REGION/subnetworks/SUBNETWORK".
        :param timeouts: timeouts block.
        :param zone: The zone in which the created job should run. If it is not provided, the provider zone is used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DataflowJobTimeouts(**timeouts)
        self._values = {
            'name': name,
            'temp_gcs_location': temp_gcs_location,
            'template_gcs_path': template_gcs_path,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if additional_experiments is not None: self._values["additional_experiments"] = additional_experiments
        if ip_configuration is not None: self._values["ip_configuration"] = ip_configuration
        if labels is not None: self._values["labels"] = labels
        if machine_type is not None: self._values["machine_type"] = machine_type
        if max_workers is not None: self._values["max_workers"] = max_workers
        if network is not None: self._values["network"] = network
        if on_delete is not None: self._values["on_delete"] = on_delete
        if parameters is not None: self._values["parameters"] = parameters
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if service_account_email is not None: self._values["service_account_email"] = service_account_email
        if subnetwork is not None: self._values["subnetwork"] = subnetwork
        if timeouts is not None: self._values["timeouts"] = timeouts
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """A unique name for the resource, required by Dataflow."""
        return self._values.get('name')

    @builtins.property
    def temp_gcs_location(self) -> str:
        """A writeable location on GCS for the Dataflow job to dump its temporary data."""
        return self._values.get('temp_gcs_location')

    @builtins.property
    def template_gcs_path(self) -> str:
        """The GCS path to the Dataflow job template."""
        return self._values.get('template_gcs_path')

    @builtins.property
    def additional_experiments(self) -> typing.Optional[typing.List[str]]:
        """List of experiments that should be used by the job.

        An example value is ["enable_stackdriver_agent_metrics"].
        """
        return self._values.get('additional_experiments')

    @builtins.property
    def ip_configuration(self) -> typing.Optional[str]:
        """The configuration for VM IPs.

        Options are "WORKER_IP_PUBLIC" or "WORKER_IP_PRIVATE".
        """
        return self._values.get('ip_configuration')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """User labels to be specified for the job.

        Keys and values should follow the restrictions specified in the labeling restrictions page. NOTE: Google-provided Dataflow templates often provide default labels that begin with goog-dataflow-provided. Unless explicitly set in config, these labels will be ignored to prevent diffs on re-apply.
        """
        return self._values.get('labels')

    @builtins.property
    def machine_type(self) -> typing.Optional[str]:
        """The machine type to use for the job."""
        return self._values.get('machine_type')

    @builtins.property
    def max_workers(self) -> typing.Optional[jsii.Number]:
        """The number of workers permitted to work on the job.

        More workers may improve processing speed at additional cost.
        """
        return self._values.get('max_workers')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """The network to which VMs will be assigned.

        If it is not provided, "default" will be used.
        """
        return self._values.get('network')

    @builtins.property
    def on_delete(self) -> typing.Optional[str]:
        """One of "drain" or "cancel".

        Specifies behavior of deletion during terraform destroy.
        """
        return self._values.get('on_delete')

    @builtins.property
    def parameters(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Key/Value pairs to be passed to the Dataflow job (as used in the template)."""
        return self._values.get('parameters')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The project in which the resource belongs."""
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The region in which the created job should run."""
        return self._values.get('region')

    @builtins.property
    def service_account_email(self) -> typing.Optional[str]:
        """The Service Account email used to create the job."""
        return self._values.get('service_account_email')

    @builtins.property
    def subnetwork(self) -> typing.Optional[str]:
        """The subnetwork to which VMs will be assigned.

        Should be of the form "regions/REGION/subnetworks/SUBNETWORK".
        """
        return self._values.get('subnetwork')

    @builtins.property
    def timeouts(self) -> typing.Optional["DataflowJobTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The zone in which the created job should run.

        If it is not provided, the provider zone is used.
        """
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataflowJobConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataflowJobTimeouts", jsii_struct_bases=[], name_mapping={'update': 'update'})
class DataflowJobTimeouts():
    def __init__(self, *, update: typing.Optional[str]=None) -> None:
        """
        :param update: 
        """
        self._values = {
        }
        if update is not None: self._values["update"] = update

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataflowJobTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataprocAutoscalingPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataprocAutoscalingPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_id: str, basic_algorithm: typing.Optional[typing.List["DataprocAutoscalingPolicyBasicAlgorithm"]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, secondary_worker_config: typing.Optional[typing.List["DataprocAutoscalingPolicySecondaryWorkerConfig"]]=None, timeouts: typing.Optional["DataprocAutoscalingPolicyTimeouts"]=None, worker_config: typing.Optional[typing.List["DataprocAutoscalingPolicyWorkerConfig"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_id: The policy id. The id must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), and hyphens (-). Cannot begin or end with underscore or hyphen. Must consist of between 3 and 50 characters.
        :param basic_algorithm: basic_algorithm block.
        :param location: The location where the autoscaling poicy should reside. The default value is 'global'.
        :param project: 
        :param secondary_worker_config: secondary_worker_config block.
        :param timeouts: timeouts block.
        :param worker_config: worker_config block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataprocAutoscalingPolicyConfig(policy_id=policy_id, basic_algorithm=basic_algorithm, location=location, project=project, secondary_worker_config=secondary_worker_config, timeouts=timeouts, worker_config=worker_config, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataprocAutoscalingPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="policyId")
    def policy_id(self) -> str:
        return jsii.get(self, "policyId")

    @policy_id.setter
    def policy_id(self, value: str) -> None:
        jsii.set(self, "policyId", value)

    @builtins.property
    @jsii.member(jsii_name="basicAlgorithm")
    def basic_algorithm(self) -> typing.Optional[typing.List["DataprocAutoscalingPolicyBasicAlgorithm"]]:
        return jsii.get(self, "basicAlgorithm")

    @basic_algorithm.setter
    def basic_algorithm(self, value: typing.Optional[typing.List["DataprocAutoscalingPolicyBasicAlgorithm"]]) -> None:
        jsii.set(self, "basicAlgorithm", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="secondaryWorkerConfig")
    def secondary_worker_config(self) -> typing.Optional[typing.List["DataprocAutoscalingPolicySecondaryWorkerConfig"]]:
        return jsii.get(self, "secondaryWorkerConfig")

    @secondary_worker_config.setter
    def secondary_worker_config(self, value: typing.Optional[typing.List["DataprocAutoscalingPolicySecondaryWorkerConfig"]]) -> None:
        jsii.set(self, "secondaryWorkerConfig", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DataprocAutoscalingPolicyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DataprocAutoscalingPolicyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="workerConfig")
    def worker_config(self) -> typing.Optional[typing.List["DataprocAutoscalingPolicyWorkerConfig"]]:
        return jsii.get(self, "workerConfig")

    @worker_config.setter
    def worker_config(self, value: typing.Optional[typing.List["DataprocAutoscalingPolicyWorkerConfig"]]) -> None:
        jsii.set(self, "workerConfig", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocAutoscalingPolicyBasicAlgorithm", jsii_struct_bases=[], name_mapping={'yarn_config': 'yarnConfig', 'cooldown_period': 'cooldownPeriod'})
class DataprocAutoscalingPolicyBasicAlgorithm():
    def __init__(self, *, yarn_config: typing.List["DataprocAutoscalingPolicyBasicAlgorithmYarnConfig"], cooldown_period: typing.Optional[str]=None) -> None:
        """
        :param yarn_config: yarn_config block.
        :param cooldown_period: Duration between scaling events. A scaling period starts after the update operation from the previous event has completed. Bounds: [2m, 1d]. Default: 2m.
        """
        self._values = {
            'yarn_config': yarn_config,
        }
        if cooldown_period is not None: self._values["cooldown_period"] = cooldown_period

    @builtins.property
    def yarn_config(self) -> typing.List["DataprocAutoscalingPolicyBasicAlgorithmYarnConfig"]:
        """yarn_config block."""
        return self._values.get('yarn_config')

    @builtins.property
    def cooldown_period(self) -> typing.Optional[str]:
        """Duration between scaling events. A scaling period starts after the update operation from the previous event has completed.

        Bounds: [2m, 1d]. Default: 2m.
        """
        return self._values.get('cooldown_period')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocAutoscalingPolicyBasicAlgorithm(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocAutoscalingPolicyBasicAlgorithmYarnConfig", jsii_struct_bases=[], name_mapping={'graceful_decommission_timeout': 'gracefulDecommissionTimeout', 'scale_down_factor': 'scaleDownFactor', 'scale_up_factor': 'scaleUpFactor', 'scale_down_min_worker_fraction': 'scaleDownMinWorkerFraction', 'scale_up_min_worker_fraction': 'scaleUpMinWorkerFraction'})
class DataprocAutoscalingPolicyBasicAlgorithmYarnConfig():
    def __init__(self, *, graceful_decommission_timeout: str, scale_down_factor: jsii.Number, scale_up_factor: jsii.Number, scale_down_min_worker_fraction: typing.Optional[jsii.Number]=None, scale_up_min_worker_fraction: typing.Optional[jsii.Number]=None) -> None:
        """
        :param graceful_decommission_timeout: Timeout for YARN graceful decommissioning of Node Managers. Specifies the duration to wait for jobs to complete before forcefully removing workers (and potentially interrupting jobs). Only applicable to downscaling operations. Bounds: [0s, 1d].
        :param scale_down_factor: Fraction of average pending memory in the last cooldown period for which to remove workers. A scale-down factor of 1 will result in scaling down so that there is no available memory remaining after the update (more aggressive scaling). A scale-down factor of 0 disables removing workers, which can be beneficial for autoscaling a single job. Bounds: [0.0, 1.0].
        :param scale_up_factor: Fraction of average pending memory in the last cooldown period for which to add workers. A scale-up factor of 1.0 will result in scaling up so that there is no pending memory remaining after the update (more aggressive scaling). A scale-up factor closer to 0 will result in a smaller magnitude of scaling up (less aggressive scaling). Bounds: [0.0, 1.0].
        :param scale_down_min_worker_fraction: Minimum scale-down threshold as a fraction of total cluster size before scaling occurs. For example, in a 20-worker cluster, a threshold of 0.1 means the autoscaler must recommend at least a 2 worker scale-down for the cluster to scale. A threshold of 0 means the autoscaler will scale down on any recommended change. Bounds: [0.0, 1.0]. Default: 0.0.
        :param scale_up_min_worker_fraction: Minimum scale-up threshold as a fraction of total cluster size before scaling occurs. For example, in a 20-worker cluster, a threshold of 0.1 means the autoscaler must recommend at least a 2-worker scale-up for the cluster to scale. A threshold of 0 means the autoscaler will scale up on any recommended change. Bounds: [0.0, 1.0]. Default: 0.0.
        """
        self._values = {
            'graceful_decommission_timeout': graceful_decommission_timeout,
            'scale_down_factor': scale_down_factor,
            'scale_up_factor': scale_up_factor,
        }
        if scale_down_min_worker_fraction is not None: self._values["scale_down_min_worker_fraction"] = scale_down_min_worker_fraction
        if scale_up_min_worker_fraction is not None: self._values["scale_up_min_worker_fraction"] = scale_up_min_worker_fraction

    @builtins.property
    def graceful_decommission_timeout(self) -> str:
        """Timeout for YARN graceful decommissioning of Node Managers.

        Specifies the
        duration to wait for jobs to complete before forcefully removing workers
        (and potentially interrupting jobs). Only applicable to downscaling operations.

        Bounds: [0s, 1d].
        """
        return self._values.get('graceful_decommission_timeout')

    @builtins.property
    def scale_down_factor(self) -> jsii.Number:
        """Fraction of average pending memory in the last cooldown period for which to remove workers.

        A scale-down factor of 1 will result in scaling down so that there
        is no available memory remaining after the update (more aggressive scaling).
        A scale-down factor of 0 disables removing workers, which can be beneficial for
        autoscaling a single job.

        Bounds: [0.0, 1.0].
        """
        return self._values.get('scale_down_factor')

    @builtins.property
    def scale_up_factor(self) -> jsii.Number:
        """Fraction of average pending memory in the last cooldown period for which to add workers.

        A scale-up factor of 1.0 will result in scaling up so that there
        is no pending memory remaining after the update (more aggressive scaling).
        A scale-up factor closer to 0 will result in a smaller magnitude of scaling up
        (less aggressive scaling).

        Bounds: [0.0, 1.0].
        """
        return self._values.get('scale_up_factor')

    @builtins.property
    def scale_down_min_worker_fraction(self) -> typing.Optional[jsii.Number]:
        """Minimum scale-down threshold as a fraction of total cluster size before scaling occurs.

        For example, in a 20-worker cluster, a threshold of 0.1 means the autoscaler must
        recommend at least a 2 worker scale-down for the cluster to scale. A threshold of 0
        means the autoscaler will scale down on any recommended change.

        Bounds: [0.0, 1.0]. Default: 0.0.
        """
        return self._values.get('scale_down_min_worker_fraction')

    @builtins.property
    def scale_up_min_worker_fraction(self) -> typing.Optional[jsii.Number]:
        """Minimum scale-up threshold as a fraction of total cluster size before scaling occurs.

        For example, in a 20-worker cluster, a threshold of 0.1 means the autoscaler
        must recommend at least a 2-worker scale-up for the cluster to scale. A threshold of
        0 means the autoscaler will scale up on any recommended change.

        Bounds: [0.0, 1.0]. Default: 0.0.
        """
        return self._values.get('scale_up_min_worker_fraction')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocAutoscalingPolicyBasicAlgorithmYarnConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocAutoscalingPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_id': 'policyId', 'basic_algorithm': 'basicAlgorithm', 'location': 'location', 'project': 'project', 'secondary_worker_config': 'secondaryWorkerConfig', 'timeouts': 'timeouts', 'worker_config': 'workerConfig'})
class DataprocAutoscalingPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_id: str, basic_algorithm: typing.Optional[typing.List["DataprocAutoscalingPolicyBasicAlgorithm"]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, secondary_worker_config: typing.Optional[typing.List["DataprocAutoscalingPolicySecondaryWorkerConfig"]]=None, timeouts: typing.Optional["DataprocAutoscalingPolicyTimeouts"]=None, worker_config: typing.Optional[typing.List["DataprocAutoscalingPolicyWorkerConfig"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_id: The policy id. The id must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), and hyphens (-). Cannot begin or end with underscore or hyphen. Must consist of between 3 and 50 characters.
        :param basic_algorithm: basic_algorithm block.
        :param location: The location where the autoscaling poicy should reside. The default value is 'global'.
        :param project: 
        :param secondary_worker_config: secondary_worker_config block.
        :param timeouts: timeouts block.
        :param worker_config: worker_config block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DataprocAutoscalingPolicyTimeouts(**timeouts)
        self._values = {
            'policy_id': policy_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if basic_algorithm is not None: self._values["basic_algorithm"] = basic_algorithm
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project
        if secondary_worker_config is not None: self._values["secondary_worker_config"] = secondary_worker_config
        if timeouts is not None: self._values["timeouts"] = timeouts
        if worker_config is not None: self._values["worker_config"] = worker_config

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_id(self) -> str:
        """The policy id.

        The id must contain only letters (a-z, A-Z), numbers (0-9), underscores (_),
        and hyphens (-). Cannot begin or end with underscore or hyphen. Must consist of between
        3 and 50 characters.
        """
        return self._values.get('policy_id')

    @builtins.property
    def basic_algorithm(self) -> typing.Optional[typing.List["DataprocAutoscalingPolicyBasicAlgorithm"]]:
        """basic_algorithm block."""
        return self._values.get('basic_algorithm')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """The  location where the autoscaling poicy should reside.

        The default value is 'global'.
        """
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def secondary_worker_config(self) -> typing.Optional[typing.List["DataprocAutoscalingPolicySecondaryWorkerConfig"]]:
        """secondary_worker_config block."""
        return self._values.get('secondary_worker_config')

    @builtins.property
    def timeouts(self) -> typing.Optional["DataprocAutoscalingPolicyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def worker_config(self) -> typing.Optional[typing.List["DataprocAutoscalingPolicyWorkerConfig"]]:
        """worker_config block."""
        return self._values.get('worker_config')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocAutoscalingPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocAutoscalingPolicySecondaryWorkerConfig", jsii_struct_bases=[], name_mapping={'max_instances': 'maxInstances', 'min_instances': 'minInstances', 'weight': 'weight'})
class DataprocAutoscalingPolicySecondaryWorkerConfig():
    def __init__(self, *, max_instances: typing.Optional[jsii.Number]=None, min_instances: typing.Optional[jsii.Number]=None, weight: typing.Optional[jsii.Number]=None) -> None:
        """
        :param max_instances: Maximum number of instances for this group. Note that by default, clusters will not use secondary workers. Required for secondary workers if the minimum secondary instances is set. Bounds: [minInstances, ). Defaults to 0.
        :param min_instances: Minimum number of instances for this group. Bounds: [0, maxInstances]. Defaults to 0.
        :param weight: Weight for the instance group, which is used to determine the fraction of total workers in the cluster from this instance group. For example, if primary workers have weight 2, and secondary workers have weight 1, the cluster will have approximately 2 primary workers for each secondary worker. The cluster may not reach the specified balance if constrained by min/max bounds or other autoscaling settings. For example, if maxInstances for secondary workers is 0, then only primary workers will be added. The cluster can also be out of balance when created. If weight is not set on any instance group, the cluster will default to equal weight for all groups: the cluster will attempt to maintain an equal number of workers in each group within the configured size bounds for each group. If weight is set for one group only, the cluster will default to zero weight on the unset group. For example if weight is set only on primary workers, the cluster will use primary workers only and no secondary workers.
        """
        self._values = {
        }
        if max_instances is not None: self._values["max_instances"] = max_instances
        if min_instances is not None: self._values["min_instances"] = min_instances
        if weight is not None: self._values["weight"] = weight

    @builtins.property
    def max_instances(self) -> typing.Optional[jsii.Number]:
        """Maximum number of instances for this group.

        Note that by default, clusters will not use
        secondary workers. Required for secondary workers if the minimum secondary instances is set.
        Bounds: [minInstances, ). Defaults to 0.
        """
        return self._values.get('max_instances')

    @builtins.property
    def min_instances(self) -> typing.Optional[jsii.Number]:
        """Minimum number of instances for this group.

        Bounds: [0, maxInstances]. Defaults to 0.
        """
        return self._values.get('min_instances')

    @builtins.property
    def weight(self) -> typing.Optional[jsii.Number]:
        """Weight for the instance group, which is used to determine the fraction of total workers in the cluster from this instance group.

        For example, if primary workers have weight 2,
        and secondary workers have weight 1, the cluster will have approximately 2 primary workers
        for each secondary worker.

        The cluster may not reach the specified balance if constrained by min/max bounds or other
        autoscaling settings. For example, if maxInstances for secondary workers is 0, then only
        primary workers will be added. The cluster can also be out of balance when created.

        If weight is not set on any instance group, the cluster will default to equal weight for
        all groups: the cluster will attempt to maintain an equal number of workers in each group
        within the configured size bounds for each group. If weight is set for one group only,
        the cluster will default to zero weight on the unset group. For example if weight is set
        only on primary workers, the cluster will use primary workers only and no secondary workers.
        """
        return self._values.get('weight')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocAutoscalingPolicySecondaryWorkerConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocAutoscalingPolicyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class DataprocAutoscalingPolicyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocAutoscalingPolicyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocAutoscalingPolicyWorkerConfig", jsii_struct_bases=[], name_mapping={'max_instances': 'maxInstances', 'min_instances': 'minInstances', 'weight': 'weight'})
class DataprocAutoscalingPolicyWorkerConfig():
    def __init__(self, *, max_instances: jsii.Number, min_instances: typing.Optional[jsii.Number]=None, weight: typing.Optional[jsii.Number]=None) -> None:
        """
        :param max_instances: Maximum number of instances for this group.
        :param min_instances: Minimum number of instances for this group. Bounds: [2, maxInstances]. Defaults to 2.
        :param weight: Weight for the instance group, which is used to determine the fraction of total workers in the cluster from this instance group. For example, if primary workers have weight 2, and secondary workers have weight 1, the cluster will have approximately 2 primary workers for each secondary worker. The cluster may not reach the specified balance if constrained by min/max bounds or other autoscaling settings. For example, if maxInstances for secondary workers is 0, then only primary workers will be added. The cluster can also be out of balance when created. If weight is not set on any instance group, the cluster will default to equal weight for all groups: the cluster will attempt to maintain an equal number of workers in each group within the configured size bounds for each group. If weight is set for one group only, the cluster will default to zero weight on the unset group. For example if weight is set only on primary workers, the cluster will use primary workers only and no secondary workers.
        """
        self._values = {
            'max_instances': max_instances,
        }
        if min_instances is not None: self._values["min_instances"] = min_instances
        if weight is not None: self._values["weight"] = weight

    @builtins.property
    def max_instances(self) -> jsii.Number:
        """Maximum number of instances for this group."""
        return self._values.get('max_instances')

    @builtins.property
    def min_instances(self) -> typing.Optional[jsii.Number]:
        """Minimum number of instances for this group.

        Bounds: [2, maxInstances]. Defaults to 2.
        """
        return self._values.get('min_instances')

    @builtins.property
    def weight(self) -> typing.Optional[jsii.Number]:
        """Weight for the instance group, which is used to determine the fraction of total workers in the cluster from this instance group.

        For example, if primary workers have weight 2,
        and secondary workers have weight 1, the cluster will have approximately 2 primary workers
        for each secondary worker.

        The cluster may not reach the specified balance if constrained by min/max bounds or other
        autoscaling settings. For example, if maxInstances for secondary workers is 0, then only
        primary workers will be added. The cluster can also be out of balance when created.

        If weight is not set on any instance group, the cluster will default to equal weight for
        all groups: the cluster will attempt to maintain an equal number of workers in each group
        within the configured size bounds for each group. If weight is set for one group only,
        the cluster will default to zero weight on the unset group. For example if weight is set
        only on primary workers, the cluster will use primary workers only and no secondary workers.
        """
        return self._values.get('weight')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocAutoscalingPolicyWorkerConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataprocCluster(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataprocCluster"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, cluster_config: typing.Optional[typing.List["DataprocClusterClusterConfig"]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["DataprocClusterTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the cluster, unique within the project and zone.
        :param cluster_config: cluster_config block.
        :param labels: The list of labels (key/value pairs) to be applied to instances in the cluster. GCP generates some itself including goog-dataproc-cluster-name which is the name of the cluster.
        :param project: The ID of the project in which the cluster will exist. If it is not provided, the provider project is used.
        :param region: The region in which the cluster and associated nodes will be created in. Defaults to global.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataprocClusterConfig(name=name, cluster_config=cluster_config, labels=labels, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataprocCluster, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="clusterConfig")
    def cluster_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfig"]]:
        return jsii.get(self, "clusterConfig")

    @cluster_config.setter
    def cluster_config(self, value: typing.Optional[typing.List["DataprocClusterClusterConfig"]]) -> None:
        jsii.set(self, "clusterConfig", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DataprocClusterTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DataprocClusterTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfig", jsii_struct_bases=[], name_mapping={'autoscaling_config': 'autoscalingConfig', 'encryption_config': 'encryptionConfig', 'gce_cluster_config': 'gceClusterConfig', 'initialization_action': 'initializationAction', 'master_config': 'masterConfig', 'preemptible_worker_config': 'preemptibleWorkerConfig', 'security_config': 'securityConfig', 'software_config': 'softwareConfig', 'staging_bucket': 'stagingBucket', 'worker_config': 'workerConfig'})
class DataprocClusterClusterConfig():
    def __init__(self, *, autoscaling_config: typing.Optional[typing.List["DataprocClusterClusterConfigAutoscalingConfig"]]=None, encryption_config: typing.Optional[typing.List["DataprocClusterClusterConfigEncryptionConfig"]]=None, gce_cluster_config: typing.Optional[typing.List["DataprocClusterClusterConfigGceClusterConfig"]]=None, initialization_action: typing.Optional[typing.List["DataprocClusterClusterConfigInitializationAction"]]=None, master_config: typing.Optional[typing.List["DataprocClusterClusterConfigMasterConfig"]]=None, preemptible_worker_config: typing.Optional[typing.List["DataprocClusterClusterConfigPreemptibleWorkerConfig"]]=None, security_config: typing.Optional[typing.List["DataprocClusterClusterConfigSecurityConfig"]]=None, software_config: typing.Optional[typing.List["DataprocClusterClusterConfigSoftwareConfig"]]=None, staging_bucket: typing.Optional[str]=None, worker_config: typing.Optional[typing.List["DataprocClusterClusterConfigWorkerConfig"]]=None) -> None:
        """
        :param autoscaling_config: autoscaling_config block.
        :param encryption_config: encryption_config block.
        :param gce_cluster_config: gce_cluster_config block.
        :param initialization_action: initialization_action block.
        :param master_config: master_config block.
        :param preemptible_worker_config: preemptible_worker_config block.
        :param security_config: security_config block.
        :param software_config: software_config block.
        :param staging_bucket: The Cloud Storage staging bucket used to stage files, such as Hadoop jars, between client machines and the cluster. Note: If you don't explicitly specify a staging_bucket then GCP will auto create / assign one for you. However, you are not guaranteed an auto generated bucket which is solely dedicated to your cluster; it may be shared with other clusters in the same region/zone also choosing to use the auto generation option.
        :param worker_config: worker_config block.
        """
        self._values = {
        }
        if autoscaling_config is not None: self._values["autoscaling_config"] = autoscaling_config
        if encryption_config is not None: self._values["encryption_config"] = encryption_config
        if gce_cluster_config is not None: self._values["gce_cluster_config"] = gce_cluster_config
        if initialization_action is not None: self._values["initialization_action"] = initialization_action
        if master_config is not None: self._values["master_config"] = master_config
        if preemptible_worker_config is not None: self._values["preemptible_worker_config"] = preemptible_worker_config
        if security_config is not None: self._values["security_config"] = security_config
        if software_config is not None: self._values["software_config"] = software_config
        if staging_bucket is not None: self._values["staging_bucket"] = staging_bucket
        if worker_config is not None: self._values["worker_config"] = worker_config

    @builtins.property
    def autoscaling_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigAutoscalingConfig"]]:
        """autoscaling_config block."""
        return self._values.get('autoscaling_config')

    @builtins.property
    def encryption_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigEncryptionConfig"]]:
        """encryption_config block."""
        return self._values.get('encryption_config')

    @builtins.property
    def gce_cluster_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigGceClusterConfig"]]:
        """gce_cluster_config block."""
        return self._values.get('gce_cluster_config')

    @builtins.property
    def initialization_action(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigInitializationAction"]]:
        """initialization_action block."""
        return self._values.get('initialization_action')

    @builtins.property
    def master_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigMasterConfig"]]:
        """master_config block."""
        return self._values.get('master_config')

    @builtins.property
    def preemptible_worker_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigPreemptibleWorkerConfig"]]:
        """preemptible_worker_config block."""
        return self._values.get('preemptible_worker_config')

    @builtins.property
    def security_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigSecurityConfig"]]:
        """security_config block."""
        return self._values.get('security_config')

    @builtins.property
    def software_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigSoftwareConfig"]]:
        """software_config block."""
        return self._values.get('software_config')

    @builtins.property
    def staging_bucket(self) -> typing.Optional[str]:
        """The Cloud Storage staging bucket used to stage files, such as Hadoop jars, between client machines and the cluster.

        Note: If you don't explicitly specify a staging_bucket then GCP will auto create / assign one for you. However, you are not guaranteed an auto generated bucket which is solely dedicated to your cluster; it may be shared with other clusters in the same region/zone also choosing to use the auto generation option.
        """
        return self._values.get('staging_bucket')

    @builtins.property
    def worker_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigWorkerConfig"]]:
        """worker_config block."""
        return self._values.get('worker_config')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigAutoscalingConfig", jsii_struct_bases=[], name_mapping={'policy_uri': 'policyUri'})
class DataprocClusterClusterConfigAutoscalingConfig():
    def __init__(self, *, policy_uri: str) -> None:
        """
        :param policy_uri: The autoscaling policy used by the cluster.
        """
        self._values = {
            'policy_uri': policy_uri,
        }

    @builtins.property
    def policy_uri(self) -> str:
        """The autoscaling policy used by the cluster."""
        return self._values.get('policy_uri')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigAutoscalingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigEncryptionConfig", jsii_struct_bases=[], name_mapping={'kms_key_name': 'kmsKeyName'})
class DataprocClusterClusterConfigEncryptionConfig():
    def __init__(self, *, kms_key_name: str) -> None:
        """
        :param kms_key_name: The Cloud KMS key name to use for PD disk encryption for all instances in the cluster.
        """
        self._values = {
            'kms_key_name': kms_key_name,
        }

    @builtins.property
    def kms_key_name(self) -> str:
        """The Cloud KMS key name to use for PD disk encryption for all instances in the cluster."""
        return self._values.get('kms_key_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigEncryptionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigGceClusterConfig", jsii_struct_bases=[], name_mapping={'internal_ip_only': 'internalIpOnly', 'metadata': 'metadata', 'network': 'network', 'service_account': 'serviceAccount', 'service_account_scopes': 'serviceAccountScopes', 'subnetwork': 'subnetwork', 'tags': 'tags', 'zone': 'zone'})
class DataprocClusterClusterConfigGceClusterConfig():
    def __init__(self, *, internal_ip_only: typing.Optional[bool]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, network: typing.Optional[str]=None, service_account: typing.Optional[str]=None, service_account_scopes: typing.Optional[typing.List[str]]=None, subnetwork: typing.Optional[str]=None, tags: typing.Optional[typing.List[str]]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param internal_ip_only: By default, clusters are not restricted to internal IP addresses, and will have ephemeral external IP addresses assigned to each instance. If set to true, all instances in the cluster will only have internal IP addresses. Note: Private Google Access (also known as privateIpGoogleAccess) must be enabled on the subnetwork that the cluster will be launched in.
        :param metadata: A map of the Compute Engine metadata entries to add to all instances.
        :param network: The name or self_link of the Google Compute Engine network to the cluster will be part of. Conflicts with subnetwork. If neither is specified, this defaults to the "default" network.
        :param service_account: The service account to be used by the Node VMs. If not specified, the "default" service account is used.
        :param service_account_scopes: The set of Google API scopes to be made available on all of the node VMs under the service_account specified. These can be either FQDNs, or scope aliases.
        :param subnetwork: The name or self_link of the Google Compute Engine subnetwork the cluster will be part of. Conflicts with network.
        :param tags: The list of instance tags applied to instances in the cluster. Tags are used to identify valid sources or targets for network firewalls.
        :param zone: The GCP zone where your data is stored and used (i.e. where the master and the worker nodes will be created in). If region is set to 'global' (default) then zone is mandatory, otherwise GCP is able to make use of Auto Zone Placement to determine this automatically for you. Note: This setting additionally determines and restricts which computing resources are available for use with other configs such as cluster_config.master_config.machine_type and cluster_config.worker_config.machine_type.
        """
        self._values = {
        }
        if internal_ip_only is not None: self._values["internal_ip_only"] = internal_ip_only
        if metadata is not None: self._values["metadata"] = metadata
        if network is not None: self._values["network"] = network
        if service_account is not None: self._values["service_account"] = service_account
        if service_account_scopes is not None: self._values["service_account_scopes"] = service_account_scopes
        if subnetwork is not None: self._values["subnetwork"] = subnetwork
        if tags is not None: self._values["tags"] = tags
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def internal_ip_only(self) -> typing.Optional[bool]:
        """By default, clusters are not restricted to internal IP addresses, and will have ephemeral external IP addresses assigned to each instance.

        If set to true, all instances in the cluster will only have internal IP addresses. Note: Private Google Access (also known as privateIpGoogleAccess) must be enabled on the subnetwork that the cluster will be launched in.
        """
        return self._values.get('internal_ip_only')

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A map of the Compute Engine metadata entries to add to all instances."""
        return self._values.get('metadata')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """The name or self_link of the Google Compute Engine network to the cluster will be part of.

        Conflicts with subnetwork. If neither is specified, this defaults to the "default" network.
        """
        return self._values.get('network')

    @builtins.property
    def service_account(self) -> typing.Optional[str]:
        """The service account to be used by the Node VMs.

        If not specified, the "default" service account is used.
        """
        return self._values.get('service_account')

    @builtins.property
    def service_account_scopes(self) -> typing.Optional[typing.List[str]]:
        """The set of Google API scopes to be made available on all of the node VMs under the service_account specified.

        These can be either FQDNs, or scope aliases.
        """
        return self._values.get('service_account_scopes')

    @builtins.property
    def subnetwork(self) -> typing.Optional[str]:
        """The name or self_link of the Google Compute Engine subnetwork the cluster will be part of.

        Conflicts with network.
        """
        return self._values.get('subnetwork')

    @builtins.property
    def tags(self) -> typing.Optional[typing.List[str]]:
        """The list of instance tags applied to instances in the cluster.

        Tags are used to identify valid sources or targets for network firewalls.
        """
        return self._values.get('tags')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The GCP zone where your data is stored and used (i.e. where the master and the worker nodes will be created in). If region is set to 'global' (default) then zone is mandatory, otherwise GCP is able to make use of Auto Zone Placement to determine this automatically for you. Note: This setting additionally determines and restricts which computing resources are available for use with other configs such as cluster_config.master_config.machine_type and cluster_config.worker_config.machine_type."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigGceClusterConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigInitializationAction", jsii_struct_bases=[], name_mapping={'script': 'script', 'timeout_sec': 'timeoutSec'})
class DataprocClusterClusterConfigInitializationAction():
    def __init__(self, *, script: str, timeout_sec: typing.Optional[jsii.Number]=None) -> None:
        """
        :param script: The script to be executed during initialization of the cluster. The script must be a GCS file with a gs:// prefix.
        :param timeout_sec: The maximum duration (in seconds) which script is allowed to take to execute its action. GCP will default to a predetermined computed value if not set (currently 300).
        """
        self._values = {
            'script': script,
        }
        if timeout_sec is not None: self._values["timeout_sec"] = timeout_sec

    @builtins.property
    def script(self) -> str:
        """The script to be executed during initialization of the cluster.

        The script must be a GCS file with a gs:// prefix.
        """
        return self._values.get('script')

    @builtins.property
    def timeout_sec(self) -> typing.Optional[jsii.Number]:
        """The maximum duration (in seconds) which script is allowed to take to execute its action.

        GCP will default to a predetermined computed value if not set (currently 300).
        """
        return self._values.get('timeout_sec')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigInitializationAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigMasterConfig", jsii_struct_bases=[], name_mapping={'accelerators': 'accelerators', 'disk_config': 'diskConfig', 'image_uri': 'imageUri', 'machine_type': 'machineType', 'min_cpu_platform': 'minCpuPlatform', 'num_instances': 'numInstances'})
class DataprocClusterClusterConfigMasterConfig():
    def __init__(self, *, accelerators: typing.Optional[typing.List["DataprocClusterClusterConfigMasterConfigAccelerators"]]=None, disk_config: typing.Optional[typing.List["DataprocClusterClusterConfigMasterConfigDiskConfig"]]=None, image_uri: typing.Optional[str]=None, machine_type: typing.Optional[str]=None, min_cpu_platform: typing.Optional[str]=None, num_instances: typing.Optional[jsii.Number]=None) -> None:
        """
        :param accelerators: accelerators block.
        :param disk_config: disk_config block.
        :param image_uri: The URI for the image to use for this master/worker.
        :param machine_type: The name of a Google Compute Engine machine type to create for the master/worker.
        :param min_cpu_platform: The name of a minimum generation of CPU family for the master/worker. If not specified, GCP will default to a predetermined computed value for each zone.
        :param num_instances: Specifies the number of master/worker nodes to create. If not specified, GCP will default to a predetermined computed value.
        """
        self._values = {
        }
        if accelerators is not None: self._values["accelerators"] = accelerators
        if disk_config is not None: self._values["disk_config"] = disk_config
        if image_uri is not None: self._values["image_uri"] = image_uri
        if machine_type is not None: self._values["machine_type"] = machine_type
        if min_cpu_platform is not None: self._values["min_cpu_platform"] = min_cpu_platform
        if num_instances is not None: self._values["num_instances"] = num_instances

    @builtins.property
    def accelerators(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigMasterConfigAccelerators"]]:
        """accelerators block."""
        return self._values.get('accelerators')

    @builtins.property
    def disk_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigMasterConfigDiskConfig"]]:
        """disk_config block."""
        return self._values.get('disk_config')

    @builtins.property
    def image_uri(self) -> typing.Optional[str]:
        """The URI for the image to use for this master/worker."""
        return self._values.get('image_uri')

    @builtins.property
    def machine_type(self) -> typing.Optional[str]:
        """The name of a Google Compute Engine machine type to create for the master/worker."""
        return self._values.get('machine_type')

    @builtins.property
    def min_cpu_platform(self) -> typing.Optional[str]:
        """The name of a minimum generation of CPU family for the master/worker.

        If not specified, GCP will default to a predetermined computed value for each zone.
        """
        return self._values.get('min_cpu_platform')

    @builtins.property
    def num_instances(self) -> typing.Optional[jsii.Number]:
        """Specifies the number of master/worker nodes to create.

        If not specified, GCP will default to a predetermined computed value.
        """
        return self._values.get('num_instances')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigMasterConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigMasterConfigAccelerators", jsii_struct_bases=[], name_mapping={'accelerator_count': 'acceleratorCount', 'accelerator_type': 'acceleratorType'})
class DataprocClusterClusterConfigMasterConfigAccelerators():
    def __init__(self, *, accelerator_count: jsii.Number, accelerator_type: str) -> None:
        """
        :param accelerator_count: The number of the accelerator cards of this type exposed to this instance. Often restricted to one of 1, 2, 4, or 8.
        :param accelerator_type: The short name of the accelerator type to expose to this instance. For example, nvidia-tesla-k80.
        """
        self._values = {
            'accelerator_count': accelerator_count,
            'accelerator_type': accelerator_type,
        }

    @builtins.property
    def accelerator_count(self) -> jsii.Number:
        """The number of the accelerator cards of this type exposed to this instance.

        Often restricted to one of 1, 2, 4, or 8.
        """
        return self._values.get('accelerator_count')

    @builtins.property
    def accelerator_type(self) -> str:
        """The short name of the accelerator type to expose to this instance.

        For example, nvidia-tesla-k80.
        """
        return self._values.get('accelerator_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigMasterConfigAccelerators(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigMasterConfigDiskConfig", jsii_struct_bases=[], name_mapping={'boot_disk_size_gb': 'bootDiskSizeGb', 'boot_disk_type': 'bootDiskType', 'num_local_ssds': 'numLocalSsds'})
class DataprocClusterClusterConfigMasterConfigDiskConfig():
    def __init__(self, *, boot_disk_size_gb: typing.Optional[jsii.Number]=None, boot_disk_type: typing.Optional[str]=None, num_local_ssds: typing.Optional[jsii.Number]=None) -> None:
        """
        :param boot_disk_size_gb: Size of the primary disk attached to each node, specified in GB. The primary disk contains the boot volume and system libraries, and the smallest allowed disk size is 10GB. GCP will default to a predetermined computed value if not set (currently 500GB). Note: If SSDs are not attached, it also contains the HDFS data blocks and Hadoop working directories.
        :param boot_disk_type: The disk type of the primary disk attached to each node. One of "pd-ssd" or "pd-standard". Defaults to "pd-standard".
        :param num_local_ssds: The amount of local SSD disks that will be attached to each master cluster node. Defaults to 0.
        """
        self._values = {
        }
        if boot_disk_size_gb is not None: self._values["boot_disk_size_gb"] = boot_disk_size_gb
        if boot_disk_type is not None: self._values["boot_disk_type"] = boot_disk_type
        if num_local_ssds is not None: self._values["num_local_ssds"] = num_local_ssds

    @builtins.property
    def boot_disk_size_gb(self) -> typing.Optional[jsii.Number]:
        """Size of the primary disk attached to each node, specified in GB.

        The primary disk contains the boot volume and system libraries, and the smallest allowed disk size is 10GB. GCP will default to a predetermined computed value if not set (currently 500GB). Note: If SSDs are not attached, it also contains the HDFS data blocks and Hadoop working directories.
        """
        return self._values.get('boot_disk_size_gb')

    @builtins.property
    def boot_disk_type(self) -> typing.Optional[str]:
        """The disk type of the primary disk attached to each node.

        One of "pd-ssd" or "pd-standard". Defaults to "pd-standard".
        """
        return self._values.get('boot_disk_type')

    @builtins.property
    def num_local_ssds(self) -> typing.Optional[jsii.Number]:
        """The amount of local SSD disks that will be attached to each master cluster node.

        Defaults to 0.
        """
        return self._values.get('num_local_ssds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigMasterConfigDiskConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigPreemptibleWorkerConfig", jsii_struct_bases=[], name_mapping={'disk_config': 'diskConfig', 'num_instances': 'numInstances'})
class DataprocClusterClusterConfigPreemptibleWorkerConfig():
    def __init__(self, *, disk_config: typing.Optional[typing.List["DataprocClusterClusterConfigPreemptibleWorkerConfigDiskConfig"]]=None, num_instances: typing.Optional[jsii.Number]=None) -> None:
        """
        :param disk_config: disk_config block.
        :param num_instances: Specifies the number of preemptible nodes to create. Defaults to 0.
        """
        self._values = {
        }
        if disk_config is not None: self._values["disk_config"] = disk_config
        if num_instances is not None: self._values["num_instances"] = num_instances

    @builtins.property
    def disk_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigPreemptibleWorkerConfigDiskConfig"]]:
        """disk_config block."""
        return self._values.get('disk_config')

    @builtins.property
    def num_instances(self) -> typing.Optional[jsii.Number]:
        """Specifies the number of preemptible nodes to create.

        Defaults to 0.
        """
        return self._values.get('num_instances')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigPreemptibleWorkerConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigPreemptibleWorkerConfigDiskConfig", jsii_struct_bases=[], name_mapping={'boot_disk_size_gb': 'bootDiskSizeGb', 'boot_disk_type': 'bootDiskType', 'num_local_ssds': 'numLocalSsds'})
class DataprocClusterClusterConfigPreemptibleWorkerConfigDiskConfig():
    def __init__(self, *, boot_disk_size_gb: typing.Optional[jsii.Number]=None, boot_disk_type: typing.Optional[str]=None, num_local_ssds: typing.Optional[jsii.Number]=None) -> None:
        """
        :param boot_disk_size_gb: Size of the primary disk attached to each preemptible worker node, specified in GB. The smallest allowed disk size is 10GB. GCP will default to a predetermined computed value if not set (currently 500GB). Note: If SSDs are not attached, it also contains the HDFS data blocks and Hadoop working directories.
        :param boot_disk_type: The disk type of the primary disk attached to each preemptible worker node. One of "pd-ssd" or "pd-standard". Defaults to "pd-standard".
        :param num_local_ssds: The amount of local SSD disks that will be attached to each preemptible worker node. Defaults to 0.
        """
        self._values = {
        }
        if boot_disk_size_gb is not None: self._values["boot_disk_size_gb"] = boot_disk_size_gb
        if boot_disk_type is not None: self._values["boot_disk_type"] = boot_disk_type
        if num_local_ssds is not None: self._values["num_local_ssds"] = num_local_ssds

    @builtins.property
    def boot_disk_size_gb(self) -> typing.Optional[jsii.Number]:
        """Size of the primary disk attached to each preemptible worker node, specified in GB.

        The smallest allowed disk size is 10GB. GCP will default to a predetermined computed value if not set (currently 500GB). Note: If SSDs are not attached, it also contains the HDFS data blocks and Hadoop working directories.
        """
        return self._values.get('boot_disk_size_gb')

    @builtins.property
    def boot_disk_type(self) -> typing.Optional[str]:
        """The disk type of the primary disk attached to each preemptible worker node.

        One of "pd-ssd" or "pd-standard". Defaults to "pd-standard".
        """
        return self._values.get('boot_disk_type')

    @builtins.property
    def num_local_ssds(self) -> typing.Optional[jsii.Number]:
        """The amount of local SSD disks that will be attached to each preemptible worker node.

        Defaults to 0.
        """
        return self._values.get('num_local_ssds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigPreemptibleWorkerConfigDiskConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigSecurityConfig", jsii_struct_bases=[], name_mapping={'kerberos_config': 'kerberosConfig'})
class DataprocClusterClusterConfigSecurityConfig():
    def __init__(self, *, kerberos_config: typing.List["DataprocClusterClusterConfigSecurityConfigKerberosConfig"]) -> None:
        """
        :param kerberos_config: kerberos_config block.
        """
        self._values = {
            'kerberos_config': kerberos_config,
        }

    @builtins.property
    def kerberos_config(self) -> typing.List["DataprocClusterClusterConfigSecurityConfigKerberosConfig"]:
        """kerberos_config block."""
        return self._values.get('kerberos_config')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigSecurityConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigSecurityConfigKerberosConfig", jsii_struct_bases=[], name_mapping={'kms_key_uri': 'kmsKeyUri', 'root_principal_password_uri': 'rootPrincipalPasswordUri', 'cross_realm_trust_admin_server': 'crossRealmTrustAdminServer', 'cross_realm_trust_kdc': 'crossRealmTrustKdc', 'cross_realm_trust_realm': 'crossRealmTrustRealm', 'cross_realm_trust_shared_password_uri': 'crossRealmTrustSharedPasswordUri', 'enable_kerberos': 'enableKerberos', 'kdc_db_key_uri': 'kdcDbKeyUri', 'key_password_uri': 'keyPasswordUri', 'keystore_password_uri': 'keystorePasswordUri', 'keystore_uri': 'keystoreUri', 'realm': 'realm', 'tgt_lifetime_hours': 'tgtLifetimeHours', 'truststore_password_uri': 'truststorePasswordUri', 'truststore_uri': 'truststoreUri'})
class DataprocClusterClusterConfigSecurityConfigKerberosConfig():
    def __init__(self, *, kms_key_uri: str, root_principal_password_uri: str, cross_realm_trust_admin_server: typing.Optional[str]=None, cross_realm_trust_kdc: typing.Optional[str]=None, cross_realm_trust_realm: typing.Optional[str]=None, cross_realm_trust_shared_password_uri: typing.Optional[str]=None, enable_kerberos: typing.Optional[bool]=None, kdc_db_key_uri: typing.Optional[str]=None, key_password_uri: typing.Optional[str]=None, keystore_password_uri: typing.Optional[str]=None, keystore_uri: typing.Optional[str]=None, realm: typing.Optional[str]=None, tgt_lifetime_hours: typing.Optional[jsii.Number]=None, truststore_password_uri: typing.Optional[str]=None, truststore_uri: typing.Optional[str]=None) -> None:
        """
        :param kms_key_uri: The uri of the KMS key used to encrypt various sensitive files.
        :param root_principal_password_uri: The cloud Storage URI of a KMS encrypted file containing the root principal password.
        :param cross_realm_trust_admin_server: The admin server (IP or hostname) for the remote trusted realm in a cross realm trust relationship.
        :param cross_realm_trust_kdc: The KDC (IP or hostname) for the remote trusted realm in a cross realm trust relationship.
        :param cross_realm_trust_realm: The remote realm the Dataproc on-cluster KDC will trust, should the user enable cross realm trust.
        :param cross_realm_trust_shared_password_uri: The Cloud Storage URI of a KMS encrypted file containing the shared password between the on-cluster Kerberos realm and the remote trusted realm, in a cross realm trust relationship.
        :param enable_kerberos: Flag to indicate whether to Kerberize the cluster.
        :param kdc_db_key_uri: The Cloud Storage URI of a KMS encrypted file containing the master key of the KDC database.
        :param key_password_uri: The Cloud Storage URI of a KMS encrypted file containing the password to the user provided key. For the self-signed certificate, this password is generated by Dataproc.
        :param keystore_password_uri: The Cloud Storage URI of a KMS encrypted file containing the password to the user provided keystore. For the self-signed certificate, this password is generated by Dataproc
        :param keystore_uri: The Cloud Storage URI of the keystore file used for SSL encryption. If not provided, Dataproc will provide a self-signed certificate.
        :param realm: The name of the on-cluster Kerberos realm. If not specified, the uppercased domain of hostnames will be the realm.
        :param tgt_lifetime_hours: The lifetime of the ticket granting ticket, in hours.
        :param truststore_password_uri: The Cloud Storage URI of a KMS encrypted file containing the password to the user provided truststore. For the self-signed certificate, this password is generated by Dataproc.
        :param truststore_uri: The Cloud Storage URI of the truststore file used for SSL encryption. If not provided, Dataproc will provide a self-signed certificate.
        """
        self._values = {
            'kms_key_uri': kms_key_uri,
            'root_principal_password_uri': root_principal_password_uri,
        }
        if cross_realm_trust_admin_server is not None: self._values["cross_realm_trust_admin_server"] = cross_realm_trust_admin_server
        if cross_realm_trust_kdc is not None: self._values["cross_realm_trust_kdc"] = cross_realm_trust_kdc
        if cross_realm_trust_realm is not None: self._values["cross_realm_trust_realm"] = cross_realm_trust_realm
        if cross_realm_trust_shared_password_uri is not None: self._values["cross_realm_trust_shared_password_uri"] = cross_realm_trust_shared_password_uri
        if enable_kerberos is not None: self._values["enable_kerberos"] = enable_kerberos
        if kdc_db_key_uri is not None: self._values["kdc_db_key_uri"] = kdc_db_key_uri
        if key_password_uri is not None: self._values["key_password_uri"] = key_password_uri
        if keystore_password_uri is not None: self._values["keystore_password_uri"] = keystore_password_uri
        if keystore_uri is not None: self._values["keystore_uri"] = keystore_uri
        if realm is not None: self._values["realm"] = realm
        if tgt_lifetime_hours is not None: self._values["tgt_lifetime_hours"] = tgt_lifetime_hours
        if truststore_password_uri is not None: self._values["truststore_password_uri"] = truststore_password_uri
        if truststore_uri is not None: self._values["truststore_uri"] = truststore_uri

    @builtins.property
    def kms_key_uri(self) -> str:
        """The uri of the KMS key used to encrypt various sensitive files."""
        return self._values.get('kms_key_uri')

    @builtins.property
    def root_principal_password_uri(self) -> str:
        """The cloud Storage URI of a KMS encrypted file containing the root principal password."""
        return self._values.get('root_principal_password_uri')

    @builtins.property
    def cross_realm_trust_admin_server(self) -> typing.Optional[str]:
        """The admin server (IP or hostname) for the remote trusted realm in a cross realm trust relationship."""
        return self._values.get('cross_realm_trust_admin_server')

    @builtins.property
    def cross_realm_trust_kdc(self) -> typing.Optional[str]:
        """The KDC (IP or hostname) for the remote trusted realm in a cross realm trust relationship."""
        return self._values.get('cross_realm_trust_kdc')

    @builtins.property
    def cross_realm_trust_realm(self) -> typing.Optional[str]:
        """The remote realm the Dataproc on-cluster KDC will trust, should the user enable cross realm trust."""
        return self._values.get('cross_realm_trust_realm')

    @builtins.property
    def cross_realm_trust_shared_password_uri(self) -> typing.Optional[str]:
        """The Cloud Storage URI of a KMS encrypted file containing the shared password between the on-cluster Kerberos realm and the remote trusted realm, in a cross realm trust relationship."""
        return self._values.get('cross_realm_trust_shared_password_uri')

    @builtins.property
    def enable_kerberos(self) -> typing.Optional[bool]:
        """Flag to indicate whether to Kerberize the cluster."""
        return self._values.get('enable_kerberos')

    @builtins.property
    def kdc_db_key_uri(self) -> typing.Optional[str]:
        """The Cloud Storage URI of a KMS encrypted file containing the master key of the KDC database."""
        return self._values.get('kdc_db_key_uri')

    @builtins.property
    def key_password_uri(self) -> typing.Optional[str]:
        """The Cloud Storage URI of a KMS encrypted file containing the password to the user provided key.

        For the self-signed certificate, this password is generated by Dataproc.
        """
        return self._values.get('key_password_uri')

    @builtins.property
    def keystore_password_uri(self) -> typing.Optional[str]:
        """The Cloud Storage URI of a KMS encrypted file containing the password to the user provided keystore.

        For the self-signed certificate, this password is generated
        by Dataproc
        """
        return self._values.get('keystore_password_uri')

    @builtins.property
    def keystore_uri(self) -> typing.Optional[str]:
        """The Cloud Storage URI of the keystore file used for SSL encryption.

        If not provided, Dataproc will provide a self-signed certificate.
        """
        return self._values.get('keystore_uri')

    @builtins.property
    def realm(self) -> typing.Optional[str]:
        """The name of the on-cluster Kerberos realm.

        If not specified, the uppercased domain of hostnames will be the realm.
        """
        return self._values.get('realm')

    @builtins.property
    def tgt_lifetime_hours(self) -> typing.Optional[jsii.Number]:
        """The lifetime of the ticket granting ticket, in hours."""
        return self._values.get('tgt_lifetime_hours')

    @builtins.property
    def truststore_password_uri(self) -> typing.Optional[str]:
        """The Cloud Storage URI of a KMS encrypted file containing the password to the user provided truststore.

        For the self-signed certificate, this password is generated by Dataproc.
        """
        return self._values.get('truststore_password_uri')

    @builtins.property
    def truststore_uri(self) -> typing.Optional[str]:
        """The Cloud Storage URI of the truststore file used for SSL encryption.

        If not provided, Dataproc will provide a self-signed certificate.
        """
        return self._values.get('truststore_uri')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigSecurityConfigKerberosConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigSoftwareConfig", jsii_struct_bases=[], name_mapping={'image_version': 'imageVersion', 'optional_components': 'optionalComponents', 'override_properties': 'overrideProperties'})
class DataprocClusterClusterConfigSoftwareConfig():
    def __init__(self, *, image_version: typing.Optional[str]=None, optional_components: typing.Optional[typing.List[str]]=None, override_properties: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param image_version: The Cloud Dataproc image version to use for the cluster - this controls the sets of software versions installed onto the nodes when you create clusters. If not specified, defaults to the latest version.
        :param optional_components: The set of optional components to activate on the cluster.
        :param override_properties: A list of override and additional properties (key/value pairs) used to modify various aspects of the common configuration files used when creating a cluster.
        """
        self._values = {
        }
        if image_version is not None: self._values["image_version"] = image_version
        if optional_components is not None: self._values["optional_components"] = optional_components
        if override_properties is not None: self._values["override_properties"] = override_properties

    @builtins.property
    def image_version(self) -> typing.Optional[str]:
        """The Cloud Dataproc image version to use for the cluster - this controls the sets of software versions installed onto the nodes when you create clusters.

        If not specified, defaults to the latest version.
        """
        return self._values.get('image_version')

    @builtins.property
    def optional_components(self) -> typing.Optional[typing.List[str]]:
        """The set of optional components to activate on the cluster."""
        return self._values.get('optional_components')

    @builtins.property
    def override_properties(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A list of override and additional properties (key/value pairs) used to modify various aspects of the common configuration files used when creating a cluster."""
        return self._values.get('override_properties')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigSoftwareConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigWorkerConfig", jsii_struct_bases=[], name_mapping={'accelerators': 'accelerators', 'disk_config': 'diskConfig', 'image_uri': 'imageUri', 'machine_type': 'machineType', 'min_cpu_platform': 'minCpuPlatform', 'num_instances': 'numInstances'})
class DataprocClusterClusterConfigWorkerConfig():
    def __init__(self, *, accelerators: typing.Optional[typing.List["DataprocClusterClusterConfigWorkerConfigAccelerators"]]=None, disk_config: typing.Optional[typing.List["DataprocClusterClusterConfigWorkerConfigDiskConfig"]]=None, image_uri: typing.Optional[str]=None, machine_type: typing.Optional[str]=None, min_cpu_platform: typing.Optional[str]=None, num_instances: typing.Optional[jsii.Number]=None) -> None:
        """
        :param accelerators: accelerators block.
        :param disk_config: disk_config block.
        :param image_uri: The URI for the image to use for this master/worker.
        :param machine_type: The name of a Google Compute Engine machine type to create for the master/worker.
        :param min_cpu_platform: The name of a minimum generation of CPU family for the master/worker. If not specified, GCP will default to a predetermined computed value for each zone.
        :param num_instances: Specifies the number of master/worker nodes to create. If not specified, GCP will default to a predetermined computed value.
        """
        self._values = {
        }
        if accelerators is not None: self._values["accelerators"] = accelerators
        if disk_config is not None: self._values["disk_config"] = disk_config
        if image_uri is not None: self._values["image_uri"] = image_uri
        if machine_type is not None: self._values["machine_type"] = machine_type
        if min_cpu_platform is not None: self._values["min_cpu_platform"] = min_cpu_platform
        if num_instances is not None: self._values["num_instances"] = num_instances

    @builtins.property
    def accelerators(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigWorkerConfigAccelerators"]]:
        """accelerators block."""
        return self._values.get('accelerators')

    @builtins.property
    def disk_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfigWorkerConfigDiskConfig"]]:
        """disk_config block."""
        return self._values.get('disk_config')

    @builtins.property
    def image_uri(self) -> typing.Optional[str]:
        """The URI for the image to use for this master/worker."""
        return self._values.get('image_uri')

    @builtins.property
    def machine_type(self) -> typing.Optional[str]:
        """The name of a Google Compute Engine machine type to create for the master/worker."""
        return self._values.get('machine_type')

    @builtins.property
    def min_cpu_platform(self) -> typing.Optional[str]:
        """The name of a minimum generation of CPU family for the master/worker.

        If not specified, GCP will default to a predetermined computed value for each zone.
        """
        return self._values.get('min_cpu_platform')

    @builtins.property
    def num_instances(self) -> typing.Optional[jsii.Number]:
        """Specifies the number of master/worker nodes to create.

        If not specified, GCP will default to a predetermined computed value.
        """
        return self._values.get('num_instances')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigWorkerConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigWorkerConfigAccelerators", jsii_struct_bases=[], name_mapping={'accelerator_count': 'acceleratorCount', 'accelerator_type': 'acceleratorType'})
class DataprocClusterClusterConfigWorkerConfigAccelerators():
    def __init__(self, *, accelerator_count: jsii.Number, accelerator_type: str) -> None:
        """
        :param accelerator_count: The number of the accelerator cards of this type exposed to this instance. Often restricted to one of 1, 2, 4, or 8.
        :param accelerator_type: The short name of the accelerator type to expose to this instance. For example, nvidia-tesla-k80.
        """
        self._values = {
            'accelerator_count': accelerator_count,
            'accelerator_type': accelerator_type,
        }

    @builtins.property
    def accelerator_count(self) -> jsii.Number:
        """The number of the accelerator cards of this type exposed to this instance.

        Often restricted to one of 1, 2, 4, or 8.
        """
        return self._values.get('accelerator_count')

    @builtins.property
    def accelerator_type(self) -> str:
        """The short name of the accelerator type to expose to this instance.

        For example, nvidia-tesla-k80.
        """
        return self._values.get('accelerator_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigWorkerConfigAccelerators(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterClusterConfigWorkerConfigDiskConfig", jsii_struct_bases=[], name_mapping={'boot_disk_size_gb': 'bootDiskSizeGb', 'boot_disk_type': 'bootDiskType', 'num_local_ssds': 'numLocalSsds'})
class DataprocClusterClusterConfigWorkerConfigDiskConfig():
    def __init__(self, *, boot_disk_size_gb: typing.Optional[jsii.Number]=None, boot_disk_type: typing.Optional[str]=None, num_local_ssds: typing.Optional[jsii.Number]=None) -> None:
        """
        :param boot_disk_size_gb: Size of the primary disk attached to each node, specified in GB. The primary disk contains the boot volume and system libraries, and the smallest allowed disk size is 10GB. GCP will default to a predetermined computed value if not set (currently 500GB). Note: If SSDs are not attached, it also contains the HDFS data blocks and Hadoop working directories.
        :param boot_disk_type: The disk type of the primary disk attached to each node. One of "pd-ssd" or "pd-standard". Defaults to "pd-standard".
        :param num_local_ssds: The amount of local SSD disks that will be attached to each master cluster node. Defaults to 0.
        """
        self._values = {
        }
        if boot_disk_size_gb is not None: self._values["boot_disk_size_gb"] = boot_disk_size_gb
        if boot_disk_type is not None: self._values["boot_disk_type"] = boot_disk_type
        if num_local_ssds is not None: self._values["num_local_ssds"] = num_local_ssds

    @builtins.property
    def boot_disk_size_gb(self) -> typing.Optional[jsii.Number]:
        """Size of the primary disk attached to each node, specified in GB.

        The primary disk contains the boot volume and system libraries, and the smallest allowed disk size is 10GB. GCP will default to a predetermined computed value if not set (currently 500GB). Note: If SSDs are not attached, it also contains the HDFS data blocks and Hadoop working directories.
        """
        return self._values.get('boot_disk_size_gb')

    @builtins.property
    def boot_disk_type(self) -> typing.Optional[str]:
        """The disk type of the primary disk attached to each node.

        One of "pd-ssd" or "pd-standard". Defaults to "pd-standard".
        """
        return self._values.get('boot_disk_type')

    @builtins.property
    def num_local_ssds(self) -> typing.Optional[jsii.Number]:
        """The amount of local SSD disks that will be attached to each master cluster node.

        Defaults to 0.
        """
        return self._values.get('num_local_ssds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterClusterConfigWorkerConfigDiskConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'cluster_config': 'clusterConfig', 'labels': 'labels', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class DataprocClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, cluster_config: typing.Optional[typing.List["DataprocClusterClusterConfig"]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["DataprocClusterTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the cluster, unique within the project and zone.
        :param cluster_config: cluster_config block.
        :param labels: The list of labels (key/value pairs) to be applied to instances in the cluster. GCP generates some itself including goog-dataproc-cluster-name which is the name of the cluster.
        :param project: The ID of the project in which the cluster will exist. If it is not provided, the provider project is used.
        :param region: The region in which the cluster and associated nodes will be created in. Defaults to global.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DataprocClusterTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if cluster_config is not None: self._values["cluster_config"] = cluster_config
        if labels is not None: self._values["labels"] = labels
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name of the cluster, unique within the project and zone."""
        return self._values.get('name')

    @builtins.property
    def cluster_config(self) -> typing.Optional[typing.List["DataprocClusterClusterConfig"]]:
        """cluster_config block."""
        return self._values.get('cluster_config')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """The list of labels (key/value pairs) to be applied to instances in the cluster.

        GCP generates some itself including goog-dataproc-cluster-name which is the name of the cluster.
        """
        return self._values.get('labels')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the cluster will exist.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The region in which the cluster and associated nodes will be created in.

        Defaults to global.
        """
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["DataprocClusterTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataprocClusterIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataprocClusterIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, cluster: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["DataprocClusterIamBindingCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataprocClusterIamBindingConfig(cluster=cluster, members=members, role=role, condition=condition, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataprocClusterIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="cluster")
    def cluster(self) -> str:
        return jsii.get(self, "cluster")

    @cluster.setter
    def cluster(self, value: str) -> None:
        jsii.set(self, "cluster", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["DataprocClusterIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["DataprocClusterIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class DataprocClusterIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'cluster': 'cluster', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project', 'region': 'region'})
class DataprocClusterIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, cluster: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["DataprocClusterIamBindingCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'cluster': cluster,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def cluster(self) -> str:
        return self._values.get('cluster')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["DataprocClusterIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataprocClusterIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataprocClusterIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, cluster: str, member: str, role: str, condition: typing.Optional[typing.List["DataprocClusterIamMemberCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataprocClusterIamMemberConfig(cluster=cluster, member=member, role=role, condition=condition, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataprocClusterIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="cluster")
    def cluster(self) -> str:
        return jsii.get(self, "cluster")

    @cluster.setter
    def cluster(self, value: str) -> None:
        jsii.set(self, "cluster", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["DataprocClusterIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["DataprocClusterIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class DataprocClusterIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'cluster': 'cluster', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project', 'region': 'region'})
class DataprocClusterIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, cluster: str, member: str, role: str, condition: typing.Optional[typing.List["DataprocClusterIamMemberCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'cluster': cluster,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def cluster(self) -> str:
        return self._values.get('cluster')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["DataprocClusterIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataprocClusterIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataprocClusterIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, cluster: str, policy_data: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster: 
        :param policy_data: 
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataprocClusterIamPolicyConfig(cluster=cluster, policy_data=policy_data, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataprocClusterIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="cluster")
    def cluster(self) -> str:
        return jsii.get(self, "cluster")

    @cluster.setter
    def cluster(self, value: str) -> None:
        jsii.set(self, "cluster", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'cluster': 'cluster', 'policy_data': 'policyData', 'project': 'project', 'region': 'region'})
class DataprocClusterIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, cluster: str, policy_data: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster: 
        :param policy_data: 
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'cluster': cluster,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def cluster(self) -> str:
        return self._values.get('cluster')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocClusterTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class DataprocClusterTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocClusterTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataprocJob(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataprocJob"):
    def __init__(self, scope: constructs.Construct, id: str, *, placement: typing.List["DataprocJobPlacement"], force_delete: typing.Optional[bool]=None, hadoop_config: typing.Optional[typing.List["DataprocJobHadoopConfig"]]=None, hive_config: typing.Optional[typing.List["DataprocJobHiveConfig"]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, pig_config: typing.Optional[typing.List["DataprocJobPigConfig"]]=None, project: typing.Optional[str]=None, pyspark_config: typing.Optional[typing.List["DataprocJobPysparkConfig"]]=None, reference: typing.Optional[typing.List["DataprocJobReference"]]=None, region: typing.Optional[str]=None, scheduling: typing.Optional[typing.List["DataprocJobScheduling"]]=None, spark_config: typing.Optional[typing.List["DataprocJobSparkConfig"]]=None, sparksql_config: typing.Optional[typing.List["DataprocJobSparksqlConfig"]]=None, timeouts: typing.Optional["DataprocJobTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param placement: placement block.
        :param force_delete: By default, you can only delete inactive jobs within Dataproc. Setting this to true, and calling destroy, will ensure that the job is first cancelled before issuing the delete.
        :param hadoop_config: hadoop_config block.
        :param hive_config: hive_config block.
        :param labels: Optional. The labels to associate with this job.
        :param pig_config: pig_config block.
        :param project: The project in which the cluster can be found and jobs subsequently run against. If it is not provided, the provider project is used.
        :param pyspark_config: pyspark_config block.
        :param reference: reference block.
        :param region: The Cloud Dataproc region. This essentially determines which clusters are available for this job to be submitted to. If not specified, defaults to global.
        :param scheduling: scheduling block.
        :param spark_config: spark_config block.
        :param sparksql_config: sparksql_config block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataprocJobConfig(placement=placement, force_delete=force_delete, hadoop_config=hadoop_config, hive_config=hive_config, labels=labels, pig_config=pig_config, project=project, pyspark_config=pyspark_config, reference=reference, region=region, scheduling=scheduling, spark_config=spark_config, sparksql_config=sparksql_config, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataprocJob, self, [scope, id, config])

    @jsii.member(jsii_name="status")
    def status(self, index: str) -> "DataprocJobStatus":
        """
        :param index: -
        """
        return jsii.invoke(self, "status", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="driverControlsFilesUri")
    def driver_controls_files_uri(self) -> str:
        return jsii.get(self, "driverControlsFilesUri")

    @builtins.property
    @jsii.member(jsii_name="driverOutputResourceUri")
    def driver_output_resource_uri(self) -> str:
        return jsii.get(self, "driverOutputResourceUri")

    @builtins.property
    @jsii.member(jsii_name="placement")
    def placement(self) -> typing.List["DataprocJobPlacement"]:
        return jsii.get(self, "placement")

    @placement.setter
    def placement(self, value: typing.List["DataprocJobPlacement"]) -> None:
        jsii.set(self, "placement", value)

    @builtins.property
    @jsii.member(jsii_name="forceDelete")
    def force_delete(self) -> typing.Optional[bool]:
        return jsii.get(self, "forceDelete")

    @force_delete.setter
    def force_delete(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "forceDelete", value)

    @builtins.property
    @jsii.member(jsii_name="hadoopConfig")
    def hadoop_config(self) -> typing.Optional[typing.List["DataprocJobHadoopConfig"]]:
        return jsii.get(self, "hadoopConfig")

    @hadoop_config.setter
    def hadoop_config(self, value: typing.Optional[typing.List["DataprocJobHadoopConfig"]]) -> None:
        jsii.set(self, "hadoopConfig", value)

    @builtins.property
    @jsii.member(jsii_name="hiveConfig")
    def hive_config(self) -> typing.Optional[typing.List["DataprocJobHiveConfig"]]:
        return jsii.get(self, "hiveConfig")

    @hive_config.setter
    def hive_config(self, value: typing.Optional[typing.List["DataprocJobHiveConfig"]]) -> None:
        jsii.set(self, "hiveConfig", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="pigConfig")
    def pig_config(self) -> typing.Optional[typing.List["DataprocJobPigConfig"]]:
        return jsii.get(self, "pigConfig")

    @pig_config.setter
    def pig_config(self, value: typing.Optional[typing.List["DataprocJobPigConfig"]]) -> None:
        jsii.set(self, "pigConfig", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="pysparkConfig")
    def pyspark_config(self) -> typing.Optional[typing.List["DataprocJobPysparkConfig"]]:
        return jsii.get(self, "pysparkConfig")

    @pyspark_config.setter
    def pyspark_config(self, value: typing.Optional[typing.List["DataprocJobPysparkConfig"]]) -> None:
        jsii.set(self, "pysparkConfig", value)

    @builtins.property
    @jsii.member(jsii_name="reference")
    def reference(self) -> typing.Optional[typing.List["DataprocJobReference"]]:
        return jsii.get(self, "reference")

    @reference.setter
    def reference(self, value: typing.Optional[typing.List["DataprocJobReference"]]) -> None:
        jsii.set(self, "reference", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="scheduling")
    def scheduling(self) -> typing.Optional[typing.List["DataprocJobScheduling"]]:
        return jsii.get(self, "scheduling")

    @scheduling.setter
    def scheduling(self, value: typing.Optional[typing.List["DataprocJobScheduling"]]) -> None:
        jsii.set(self, "scheduling", value)

    @builtins.property
    @jsii.member(jsii_name="sparkConfig")
    def spark_config(self) -> typing.Optional[typing.List["DataprocJobSparkConfig"]]:
        return jsii.get(self, "sparkConfig")

    @spark_config.setter
    def spark_config(self, value: typing.Optional[typing.List["DataprocJobSparkConfig"]]) -> None:
        jsii.set(self, "sparkConfig", value)

    @builtins.property
    @jsii.member(jsii_name="sparksqlConfig")
    def sparksql_config(self) -> typing.Optional[typing.List["DataprocJobSparksqlConfig"]]:
        return jsii.get(self, "sparksqlConfig")

    @sparksql_config.setter
    def sparksql_config(self, value: typing.Optional[typing.List["DataprocJobSparksqlConfig"]]) -> None:
        jsii.set(self, "sparksqlConfig", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DataprocJobTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DataprocJobTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'placement': 'placement', 'force_delete': 'forceDelete', 'hadoop_config': 'hadoopConfig', 'hive_config': 'hiveConfig', 'labels': 'labels', 'pig_config': 'pigConfig', 'project': 'project', 'pyspark_config': 'pysparkConfig', 'reference': 'reference', 'region': 'region', 'scheduling': 'scheduling', 'spark_config': 'sparkConfig', 'sparksql_config': 'sparksqlConfig', 'timeouts': 'timeouts'})
class DataprocJobConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, placement: typing.List["DataprocJobPlacement"], force_delete: typing.Optional[bool]=None, hadoop_config: typing.Optional[typing.List["DataprocJobHadoopConfig"]]=None, hive_config: typing.Optional[typing.List["DataprocJobHiveConfig"]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, pig_config: typing.Optional[typing.List["DataprocJobPigConfig"]]=None, project: typing.Optional[str]=None, pyspark_config: typing.Optional[typing.List["DataprocJobPysparkConfig"]]=None, reference: typing.Optional[typing.List["DataprocJobReference"]]=None, region: typing.Optional[str]=None, scheduling: typing.Optional[typing.List["DataprocJobScheduling"]]=None, spark_config: typing.Optional[typing.List["DataprocJobSparkConfig"]]=None, sparksql_config: typing.Optional[typing.List["DataprocJobSparksqlConfig"]]=None, timeouts: typing.Optional["DataprocJobTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param placement: placement block.
        :param force_delete: By default, you can only delete inactive jobs within Dataproc. Setting this to true, and calling destroy, will ensure that the job is first cancelled before issuing the delete.
        :param hadoop_config: hadoop_config block.
        :param hive_config: hive_config block.
        :param labels: Optional. The labels to associate with this job.
        :param pig_config: pig_config block.
        :param project: The project in which the cluster can be found and jobs subsequently run against. If it is not provided, the provider project is used.
        :param pyspark_config: pyspark_config block.
        :param reference: reference block.
        :param region: The Cloud Dataproc region. This essentially determines which clusters are available for this job to be submitted to. If not specified, defaults to global.
        :param scheduling: scheduling block.
        :param spark_config: spark_config block.
        :param sparksql_config: sparksql_config block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DataprocJobTimeouts(**timeouts)
        self._values = {
            'placement': placement,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if force_delete is not None: self._values["force_delete"] = force_delete
        if hadoop_config is not None: self._values["hadoop_config"] = hadoop_config
        if hive_config is not None: self._values["hive_config"] = hive_config
        if labels is not None: self._values["labels"] = labels
        if pig_config is not None: self._values["pig_config"] = pig_config
        if project is not None: self._values["project"] = project
        if pyspark_config is not None: self._values["pyspark_config"] = pyspark_config
        if reference is not None: self._values["reference"] = reference
        if region is not None: self._values["region"] = region
        if scheduling is not None: self._values["scheduling"] = scheduling
        if spark_config is not None: self._values["spark_config"] = spark_config
        if sparksql_config is not None: self._values["sparksql_config"] = sparksql_config
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def placement(self) -> typing.List["DataprocJobPlacement"]:
        """placement block."""
        return self._values.get('placement')

    @builtins.property
    def force_delete(self) -> typing.Optional[bool]:
        """By default, you can only delete inactive jobs within Dataproc.

        Setting this to true, and calling destroy, will ensure that the job is first cancelled before issuing the delete.
        """
        return self._values.get('force_delete')

    @builtins.property
    def hadoop_config(self) -> typing.Optional[typing.List["DataprocJobHadoopConfig"]]:
        """hadoop_config block."""
        return self._values.get('hadoop_config')

    @builtins.property
    def hive_config(self) -> typing.Optional[typing.List["DataprocJobHiveConfig"]]:
        """hive_config block."""
        return self._values.get('hive_config')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Optional.

        The labels to associate with this job.
        """
        return self._values.get('labels')

    @builtins.property
    def pig_config(self) -> typing.Optional[typing.List["DataprocJobPigConfig"]]:
        """pig_config block."""
        return self._values.get('pig_config')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The project in which the cluster can be found and jobs subsequently run against.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def pyspark_config(self) -> typing.Optional[typing.List["DataprocJobPysparkConfig"]]:
        """pyspark_config block."""
        return self._values.get('pyspark_config')

    @builtins.property
    def reference(self) -> typing.Optional[typing.List["DataprocJobReference"]]:
        """reference block."""
        return self._values.get('reference')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The Cloud Dataproc region.

        This essentially determines which clusters are available for this job to be submitted to. If not specified, defaults to global.
        """
        return self._values.get('region')

    @builtins.property
    def scheduling(self) -> typing.Optional[typing.List["DataprocJobScheduling"]]:
        """scheduling block."""
        return self._values.get('scheduling')

    @builtins.property
    def spark_config(self) -> typing.Optional[typing.List["DataprocJobSparkConfig"]]:
        """spark_config block."""
        return self._values.get('spark_config')

    @builtins.property
    def sparksql_config(self) -> typing.Optional[typing.List["DataprocJobSparksqlConfig"]]:
        """sparksql_config block."""
        return self._values.get('sparksql_config')

    @builtins.property
    def timeouts(self) -> typing.Optional["DataprocJobTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobHadoopConfig", jsii_struct_bases=[], name_mapping={'archive_uris': 'archiveUris', 'args': 'args', 'file_uris': 'fileUris', 'jar_file_uris': 'jarFileUris', 'logging_config': 'loggingConfig', 'main_class': 'mainClass', 'main_jar_file_uri': 'mainJarFileUri', 'properties': 'properties'})
class DataprocJobHadoopConfig():
    def __init__(self, *, archive_uris: typing.Optional[typing.List[str]]=None, args: typing.Optional[typing.List[str]]=None, file_uris: typing.Optional[typing.List[str]]=None, jar_file_uris: typing.Optional[typing.List[str]]=None, logging_config: typing.Optional[typing.List["DataprocJobHadoopConfigLoggingConfig"]]=None, main_class: typing.Optional[str]=None, main_jar_file_uri: typing.Optional[str]=None, properties: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param archive_uris: HCFS URIs of archives to be extracted in the working directory of .jar, .tar, .tar.gz, .tgz, and .zip.
        :param args: The arguments to pass to the driver.
        :param file_uris: HCFS URIs of files to be copied to the working directory of Spark drivers and distributed tasks. Useful for naively parallel tasks.
        :param jar_file_uris: HCFS URIs of jar files to add to the CLASSPATHs of the Spark driver and tasks.
        :param logging_config: logging_config block.
        :param main_class: The class containing the main method of the driver. Must be in a provided jar or jar that is already on the classpath. Conflicts with main_jar_file_uri
        :param main_jar_file_uri: The HCFS URI of jar file containing the driver jar. Conflicts with main_class
        :param properties: A mapping of property names to values, used to configure Spark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.
        """
        self._values = {
        }
        if archive_uris is not None: self._values["archive_uris"] = archive_uris
        if args is not None: self._values["args"] = args
        if file_uris is not None: self._values["file_uris"] = file_uris
        if jar_file_uris is not None: self._values["jar_file_uris"] = jar_file_uris
        if logging_config is not None: self._values["logging_config"] = logging_config
        if main_class is not None: self._values["main_class"] = main_class
        if main_jar_file_uri is not None: self._values["main_jar_file_uri"] = main_jar_file_uri
        if properties is not None: self._values["properties"] = properties

    @builtins.property
    def archive_uris(self) -> typing.Optional[typing.List[str]]:
        """HCFS URIs of archives to be extracted in the working directory of .jar, .tar, .tar.gz, .tgz, and .zip."""
        return self._values.get('archive_uris')

    @builtins.property
    def args(self) -> typing.Optional[typing.List[str]]:
        """The arguments to pass to the driver."""
        return self._values.get('args')

    @builtins.property
    def file_uris(self) -> typing.Optional[typing.List[str]]:
        """HCFS URIs of files to be copied to the working directory of Spark drivers and distributed tasks.

        Useful for naively parallel tasks.
        """
        return self._values.get('file_uris')

    @builtins.property
    def jar_file_uris(self) -> typing.Optional[typing.List[str]]:
        """HCFS URIs of jar files to add to the CLASSPATHs of the Spark driver and tasks."""
        return self._values.get('jar_file_uris')

    @builtins.property
    def logging_config(self) -> typing.Optional[typing.List["DataprocJobHadoopConfigLoggingConfig"]]:
        """logging_config block."""
        return self._values.get('logging_config')

    @builtins.property
    def main_class(self) -> typing.Optional[str]:
        """The class containing the main method of the driver.

        Must be in a provided jar or jar that is already on the classpath. Conflicts with main_jar_file_uri
        """
        return self._values.get('main_class')

    @builtins.property
    def main_jar_file_uri(self) -> typing.Optional[str]:
        """The HCFS URI of jar file containing the driver jar.

        Conflicts with main_class
        """
        return self._values.get('main_jar_file_uri')

    @builtins.property
    def properties(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A mapping of property names to values, used to configure Spark.

        Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.
        """
        return self._values.get('properties')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobHadoopConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobHadoopConfigLoggingConfig", jsii_struct_bases=[], name_mapping={'driver_log_levels': 'driverLogLevels'})
class DataprocJobHadoopConfigLoggingConfig():
    def __init__(self, *, driver_log_levels: typing.Mapping[str, str]) -> None:
        """
        :param driver_log_levels: Optional. The per-package log levels for the driver. This may include 'root' package name to configure rootLogger. Examples: 'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'.
        """
        self._values = {
            'driver_log_levels': driver_log_levels,
        }

    @builtins.property
    def driver_log_levels(self) -> typing.Mapping[str, str]:
        """Optional.

        The per-package log levels for the driver. This may include 'root' package name to configure rootLogger. Examples: 'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'.
        """
        return self._values.get('driver_log_levels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobHadoopConfigLoggingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobHiveConfig", jsii_struct_bases=[], name_mapping={'continue_on_failure': 'continueOnFailure', 'jar_file_uris': 'jarFileUris', 'properties': 'properties', 'query_file_uri': 'queryFileUri', 'query_list': 'queryList', 'script_variables': 'scriptVariables'})
class DataprocJobHiveConfig():
    def __init__(self, *, continue_on_failure: typing.Optional[bool]=None, jar_file_uris: typing.Optional[typing.List[str]]=None, properties: typing.Optional[typing.Mapping[str, str]]=None, query_file_uri: typing.Optional[str]=None, query_list: typing.Optional[typing.List[str]]=None, script_variables: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param continue_on_failure: Whether to continue executing queries if a query fails. The default value is false. Setting to true can be useful when executing independent parallel queries. Defaults to false.
        :param jar_file_uris: HCFS URIs of jar files to add to the CLASSPATH of the Hive server and Hadoop MapReduce (MR) tasks. Can contain Hive SerDes and UDFs.
        :param properties: A mapping of property names and values, used to configure Hive. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/hive/conf/hive-site.xml, and classes in user code.
        :param query_file_uri: HCFS URI of file containing Hive script to execute as the job. Conflicts with query_list
        :param query_list: The list of Hive queries or statements to execute as part of the job. Conflicts with query_file_uri
        :param script_variables: Mapping of query variable names to values (equivalent to the Hive command: SET name="value";).
        """
        self._values = {
        }
        if continue_on_failure is not None: self._values["continue_on_failure"] = continue_on_failure
        if jar_file_uris is not None: self._values["jar_file_uris"] = jar_file_uris
        if properties is not None: self._values["properties"] = properties
        if query_file_uri is not None: self._values["query_file_uri"] = query_file_uri
        if query_list is not None: self._values["query_list"] = query_list
        if script_variables is not None: self._values["script_variables"] = script_variables

    @builtins.property
    def continue_on_failure(self) -> typing.Optional[bool]:
        """Whether to continue executing queries if a query fails.

        The default value is false. Setting to true can be useful when executing independent parallel queries. Defaults to false.
        """
        return self._values.get('continue_on_failure')

    @builtins.property
    def jar_file_uris(self) -> typing.Optional[typing.List[str]]:
        """HCFS URIs of jar files to add to the CLASSPATH of the Hive server and Hadoop MapReduce (MR) tasks.

        Can contain Hive SerDes and UDFs.
        """
        return self._values.get('jar_file_uris')

    @builtins.property
    def properties(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A mapping of property names and values, used to configure Hive.

        Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/hive/conf/hive-site.xml, and classes in user code.
        """
        return self._values.get('properties')

    @builtins.property
    def query_file_uri(self) -> typing.Optional[str]:
        """HCFS URI of file containing Hive script to execute as the job.

        Conflicts with query_list
        """
        return self._values.get('query_file_uri')

    @builtins.property
    def query_list(self) -> typing.Optional[typing.List[str]]:
        """The list of Hive queries or statements to execute as part of the job.

        Conflicts with query_file_uri
        """
        return self._values.get('query_list')

    @builtins.property
    def script_variables(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Mapping of query variable names to values (equivalent to the Hive command: SET name="value";)."""
        return self._values.get('script_variables')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobHiveConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataprocJobIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataprocJobIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, job_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["DataprocJobIamBindingCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param job_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataprocJobIamBindingConfig(job_id=job_id, members=members, role=role, condition=condition, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataprocJobIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="jobId")
    def job_id(self) -> str:
        return jsii.get(self, "jobId")

    @job_id.setter
    def job_id(self, value: str) -> None:
        jsii.set(self, "jobId", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["DataprocJobIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["DataprocJobIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class DataprocJobIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'job_id': 'jobId', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project', 'region': 'region'})
class DataprocJobIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, job_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["DataprocJobIamBindingCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param job_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'job_id': job_id,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def job_id(self) -> str:
        return self._values.get('job_id')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["DataprocJobIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataprocJobIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataprocJobIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, job_id: str, member: str, role: str, condition: typing.Optional[typing.List["DataprocJobIamMemberCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param job_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataprocJobIamMemberConfig(job_id=job_id, member=member, role=role, condition=condition, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataprocJobIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="jobId")
    def job_id(self) -> str:
        return jsii.get(self, "jobId")

    @job_id.setter
    def job_id(self, value: str) -> None:
        jsii.set(self, "jobId", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["DataprocJobIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["DataprocJobIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class DataprocJobIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'job_id': 'jobId', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project', 'region': 'region'})
class DataprocJobIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, job_id: str, member: str, role: str, condition: typing.Optional[typing.List["DataprocJobIamMemberCondition"]]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param job_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'job_id': job_id,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def job_id(self) -> str:
        return self._values.get('job_id')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["DataprocJobIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataprocJobIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataprocJobIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, job_id: str, policy_data: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param job_id: 
        :param policy_data: 
        :param project: 
        :param region: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DataprocJobIamPolicyConfig(job_id=job_id, policy_data=policy_data, project=project, region=region, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DataprocJobIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="jobId")
    def job_id(self) -> str:
        return jsii.get(self, "jobId")

    @job_id.setter
    def job_id(self, value: str) -> None:
        jsii.set(self, "jobId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'job_id': 'jobId', 'policy_data': 'policyData', 'project': 'project', 'region': 'region'})
class DataprocJobIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, job_id: str, policy_data: str, project: typing.Optional[str]=None, region: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param job_id: 
        :param policy_data: 
        :param project: 
        :param region: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'job_id': job_id,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def job_id(self) -> str:
        return self._values.get('job_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobPigConfig", jsii_struct_bases=[], name_mapping={'continue_on_failure': 'continueOnFailure', 'jar_file_uris': 'jarFileUris', 'logging_config': 'loggingConfig', 'properties': 'properties', 'query_file_uri': 'queryFileUri', 'query_list': 'queryList', 'script_variables': 'scriptVariables'})
class DataprocJobPigConfig():
    def __init__(self, *, continue_on_failure: typing.Optional[bool]=None, jar_file_uris: typing.Optional[typing.List[str]]=None, logging_config: typing.Optional[typing.List["DataprocJobPigConfigLoggingConfig"]]=None, properties: typing.Optional[typing.Mapping[str, str]]=None, query_file_uri: typing.Optional[str]=None, query_list: typing.Optional[typing.List[str]]=None, script_variables: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param continue_on_failure: Whether to continue executing queries if a query fails. The default value is false. Setting to true can be useful when executing independent parallel queries. Defaults to false.
        :param jar_file_uris: HCFS URIs of jar files to add to the CLASSPATH of the Pig Client and Hadoop MapReduce (MR) tasks. Can contain Pig UDFs.
        :param logging_config: logging_config block.
        :param properties: A mapping of property names to values, used to configure Pig. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/pig/conf/pig.properties, and classes in user code.
        :param query_file_uri: HCFS URI of file containing Hive script to execute as the job. Conflicts with query_list
        :param query_list: The list of Hive queries or statements to execute as part of the job. Conflicts with query_file_uri
        :param script_variables: Mapping of query variable names to values (equivalent to the Pig command: name=[value]).
        """
        self._values = {
        }
        if continue_on_failure is not None: self._values["continue_on_failure"] = continue_on_failure
        if jar_file_uris is not None: self._values["jar_file_uris"] = jar_file_uris
        if logging_config is not None: self._values["logging_config"] = logging_config
        if properties is not None: self._values["properties"] = properties
        if query_file_uri is not None: self._values["query_file_uri"] = query_file_uri
        if query_list is not None: self._values["query_list"] = query_list
        if script_variables is not None: self._values["script_variables"] = script_variables

    @builtins.property
    def continue_on_failure(self) -> typing.Optional[bool]:
        """Whether to continue executing queries if a query fails.

        The default value is false. Setting to true can be useful when executing independent parallel queries. Defaults to false.
        """
        return self._values.get('continue_on_failure')

    @builtins.property
    def jar_file_uris(self) -> typing.Optional[typing.List[str]]:
        """HCFS URIs of jar files to add to the CLASSPATH of the Pig Client and Hadoop MapReduce (MR) tasks.

        Can contain Pig UDFs.
        """
        return self._values.get('jar_file_uris')

    @builtins.property
    def logging_config(self) -> typing.Optional[typing.List["DataprocJobPigConfigLoggingConfig"]]:
        """logging_config block."""
        return self._values.get('logging_config')

    @builtins.property
    def properties(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A mapping of property names to values, used to configure Pig.

        Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/pig/conf/pig.properties, and classes in user code.
        """
        return self._values.get('properties')

    @builtins.property
    def query_file_uri(self) -> typing.Optional[str]:
        """HCFS URI of file containing Hive script to execute as the job.

        Conflicts with query_list
        """
        return self._values.get('query_file_uri')

    @builtins.property
    def query_list(self) -> typing.Optional[typing.List[str]]:
        """The list of Hive queries or statements to execute as part of the job.

        Conflicts with query_file_uri
        """
        return self._values.get('query_list')

    @builtins.property
    def script_variables(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Mapping of query variable names to values (equivalent to the Pig command: name=[value])."""
        return self._values.get('script_variables')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobPigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobPigConfigLoggingConfig", jsii_struct_bases=[], name_mapping={'driver_log_levels': 'driverLogLevels'})
class DataprocJobPigConfigLoggingConfig():
    def __init__(self, *, driver_log_levels: typing.Mapping[str, str]) -> None:
        """
        :param driver_log_levels: Optional. The per-package log levels for the driver. This may include 'root' package name to configure rootLogger. Examples: 'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'.
        """
        self._values = {
            'driver_log_levels': driver_log_levels,
        }

    @builtins.property
    def driver_log_levels(self) -> typing.Mapping[str, str]:
        """Optional.

        The per-package log levels for the driver. This may include 'root' package name to configure rootLogger. Examples: 'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'.
        """
        return self._values.get('driver_log_levels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobPigConfigLoggingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobPlacement", jsii_struct_bases=[], name_mapping={'cluster_name': 'clusterName'})
class DataprocJobPlacement():
    def __init__(self, *, cluster_name: str) -> None:
        """
        :param cluster_name: The name of the cluster where the job will be submitted.
        """
        self._values = {
            'cluster_name': cluster_name,
        }

    @builtins.property
    def cluster_name(self) -> str:
        """The name of the cluster where the job will be submitted."""
        return self._values.get('cluster_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobPlacement(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobPysparkConfig", jsii_struct_bases=[], name_mapping={'main_python_file_uri': 'mainPythonFileUri', 'archive_uris': 'archiveUris', 'args': 'args', 'file_uris': 'fileUris', 'jar_file_uris': 'jarFileUris', 'logging_config': 'loggingConfig', 'properties': 'properties', 'python_file_uris': 'pythonFileUris'})
class DataprocJobPysparkConfig():
    def __init__(self, *, main_python_file_uri: str, archive_uris: typing.Optional[typing.List[str]]=None, args: typing.Optional[typing.List[str]]=None, file_uris: typing.Optional[typing.List[str]]=None, jar_file_uris: typing.Optional[typing.List[str]]=None, logging_config: typing.Optional[typing.List["DataprocJobPysparkConfigLoggingConfig"]]=None, properties: typing.Optional[typing.Mapping[str, str]]=None, python_file_uris: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param main_python_file_uri: Required. The HCFS URI of the main Python file to use as the driver. Must be a .py file
        :param archive_uris: Optional. HCFS URIs of archives to be extracted in the working directory of .jar, .tar, .tar.gz, .tgz, and .zip
        :param args: Optional. The arguments to pass to the driver. Do not include arguments, such as --conf, that can be set as job properties, since a collision may occur that causes an incorrect job submission
        :param file_uris: Optional. HCFS URIs of files to be copied to the working directory of Python drivers and distributed tasks. Useful for naively parallel tasks
        :param jar_file_uris: Optional. HCFS URIs of jar files to add to the CLASSPATHs of the Python driver and tasks
        :param logging_config: logging_config block.
        :param properties: Optional. A mapping of property names to values, used to configure PySpark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code
        :param python_file_uris: Optional. HCFS file URIs of Python files to pass to the PySpark framework. Supported file types: .py, .egg, and .zip
        """
        self._values = {
            'main_python_file_uri': main_python_file_uri,
        }
        if archive_uris is not None: self._values["archive_uris"] = archive_uris
        if args is not None: self._values["args"] = args
        if file_uris is not None: self._values["file_uris"] = file_uris
        if jar_file_uris is not None: self._values["jar_file_uris"] = jar_file_uris
        if logging_config is not None: self._values["logging_config"] = logging_config
        if properties is not None: self._values["properties"] = properties
        if python_file_uris is not None: self._values["python_file_uris"] = python_file_uris

    @builtins.property
    def main_python_file_uri(self) -> str:
        """Required.

        The HCFS URI of the main Python file to use as the driver. Must be a .py file
        """
        return self._values.get('main_python_file_uri')

    @builtins.property
    def archive_uris(self) -> typing.Optional[typing.List[str]]:
        """Optional.

        HCFS URIs of archives to be extracted in the working directory of .jar, .tar, .tar.gz, .tgz, and .zip
        """
        return self._values.get('archive_uris')

    @builtins.property
    def args(self) -> typing.Optional[typing.List[str]]:
        """Optional.

        The arguments to pass to the driver. Do not include arguments, such as --conf, that can be set as job properties, since a collision may occur that causes an incorrect job submission
        """
        return self._values.get('args')

    @builtins.property
    def file_uris(self) -> typing.Optional[typing.List[str]]:
        """Optional.

        HCFS URIs of files to be copied to the working directory of Python drivers and distributed tasks. Useful for naively parallel tasks
        """
        return self._values.get('file_uris')

    @builtins.property
    def jar_file_uris(self) -> typing.Optional[typing.List[str]]:
        """Optional.

        HCFS URIs of jar files to add to the CLASSPATHs of the Python driver and tasks
        """
        return self._values.get('jar_file_uris')

    @builtins.property
    def logging_config(self) -> typing.Optional[typing.List["DataprocJobPysparkConfigLoggingConfig"]]:
        """logging_config block."""
        return self._values.get('logging_config')

    @builtins.property
    def properties(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Optional.

        A mapping of property names to values, used to configure PySpark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code
        """
        return self._values.get('properties')

    @builtins.property
    def python_file_uris(self) -> typing.Optional[typing.List[str]]:
        """Optional.

        HCFS file URIs of Python files to pass to the PySpark framework. Supported file types: .py, .egg, and .zip
        """
        return self._values.get('python_file_uris')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobPysparkConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobPysparkConfigLoggingConfig", jsii_struct_bases=[], name_mapping={'driver_log_levels': 'driverLogLevels'})
class DataprocJobPysparkConfigLoggingConfig():
    def __init__(self, *, driver_log_levels: typing.Mapping[str, str]) -> None:
        """
        :param driver_log_levels: Optional. The per-package log levels for the driver. This may include 'root' package name to configure rootLogger. Examples: 'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'.
        """
        self._values = {
            'driver_log_levels': driver_log_levels,
        }

    @builtins.property
    def driver_log_levels(self) -> typing.Mapping[str, str]:
        """Optional.

        The per-package log levels for the driver. This may include 'root' package name to configure rootLogger. Examples: 'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'.
        """
        return self._values.get('driver_log_levels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobPysparkConfigLoggingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobReference", jsii_struct_bases=[], name_mapping={'job_id': 'jobId'})
class DataprocJobReference():
    def __init__(self, *, job_id: typing.Optional[str]=None) -> None:
        """
        :param job_id: The job ID, which must be unique within the project. The job ID is generated by the server upon job submission or provided by the user as a means to perform retries without creating duplicate jobs
        """
        self._values = {
        }
        if job_id is not None: self._values["job_id"] = job_id

    @builtins.property
    def job_id(self) -> typing.Optional[str]:
        """The job ID, which must be unique within the project.

        The job ID is generated by the server upon job submission or provided by the user as a means to perform retries without creating duplicate jobs
        """
        return self._values.get('job_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobReference(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobScheduling", jsii_struct_bases=[], name_mapping={'max_failures_per_hour': 'maxFailuresPerHour'})
class DataprocJobScheduling():
    def __init__(self, *, max_failures_per_hour: jsii.Number) -> None:
        """
        :param max_failures_per_hour: Maximum number of times per hour a driver may be restarted as a result of driver terminating with non-zero code before job is reported failed.
        """
        self._values = {
            'max_failures_per_hour': max_failures_per_hour,
        }

    @builtins.property
    def max_failures_per_hour(self) -> jsii.Number:
        """Maximum number of times per hour a driver may be restarted as a result of driver terminating with non-zero code before job is reported failed."""
        return self._values.get('max_failures_per_hour')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobScheduling(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobSparkConfig", jsii_struct_bases=[], name_mapping={'archive_uris': 'archiveUris', 'args': 'args', 'file_uris': 'fileUris', 'jar_file_uris': 'jarFileUris', 'logging_config': 'loggingConfig', 'main_class': 'mainClass', 'main_jar_file_uri': 'mainJarFileUri', 'properties': 'properties'})
class DataprocJobSparkConfig():
    def __init__(self, *, archive_uris: typing.Optional[typing.List[str]]=None, args: typing.Optional[typing.List[str]]=None, file_uris: typing.Optional[typing.List[str]]=None, jar_file_uris: typing.Optional[typing.List[str]]=None, logging_config: typing.Optional[typing.List["DataprocJobSparkConfigLoggingConfig"]]=None, main_class: typing.Optional[str]=None, main_jar_file_uri: typing.Optional[str]=None, properties: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param archive_uris: HCFS URIs of archives to be extracted in the working directory of .jar, .tar, .tar.gz, .tgz, and .zip.
        :param args: The arguments to pass to the driver.
        :param file_uris: HCFS URIs of files to be copied to the working directory of Spark drivers and distributed tasks. Useful for naively parallel tasks.
        :param jar_file_uris: HCFS URIs of jar files to add to the CLASSPATHs of the Spark driver and tasks.
        :param logging_config: logging_config block.
        :param main_class: The class containing the main method of the driver. Must be in a provided jar or jar that is already on the classpath. Conflicts with main_jar_file_uri
        :param main_jar_file_uri: The HCFS URI of jar file containing the driver jar. Conflicts with main_class
        :param properties: A mapping of property names to values, used to configure Spark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.
        """
        self._values = {
        }
        if archive_uris is not None: self._values["archive_uris"] = archive_uris
        if args is not None: self._values["args"] = args
        if file_uris is not None: self._values["file_uris"] = file_uris
        if jar_file_uris is not None: self._values["jar_file_uris"] = jar_file_uris
        if logging_config is not None: self._values["logging_config"] = logging_config
        if main_class is not None: self._values["main_class"] = main_class
        if main_jar_file_uri is not None: self._values["main_jar_file_uri"] = main_jar_file_uri
        if properties is not None: self._values["properties"] = properties

    @builtins.property
    def archive_uris(self) -> typing.Optional[typing.List[str]]:
        """HCFS URIs of archives to be extracted in the working directory of .jar, .tar, .tar.gz, .tgz, and .zip."""
        return self._values.get('archive_uris')

    @builtins.property
    def args(self) -> typing.Optional[typing.List[str]]:
        """The arguments to pass to the driver."""
        return self._values.get('args')

    @builtins.property
    def file_uris(self) -> typing.Optional[typing.List[str]]:
        """HCFS URIs of files to be copied to the working directory of Spark drivers and distributed tasks.

        Useful for naively parallel tasks.
        """
        return self._values.get('file_uris')

    @builtins.property
    def jar_file_uris(self) -> typing.Optional[typing.List[str]]:
        """HCFS URIs of jar files to add to the CLASSPATHs of the Spark driver and tasks."""
        return self._values.get('jar_file_uris')

    @builtins.property
    def logging_config(self) -> typing.Optional[typing.List["DataprocJobSparkConfigLoggingConfig"]]:
        """logging_config block."""
        return self._values.get('logging_config')

    @builtins.property
    def main_class(self) -> typing.Optional[str]:
        """The class containing the main method of the driver.

        Must be in a provided jar or jar that is already on the classpath. Conflicts with main_jar_file_uri
        """
        return self._values.get('main_class')

    @builtins.property
    def main_jar_file_uri(self) -> typing.Optional[str]:
        """The HCFS URI of jar file containing the driver jar.

        Conflicts with main_class
        """
        return self._values.get('main_jar_file_uri')

    @builtins.property
    def properties(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A mapping of property names to values, used to configure Spark.

        Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.
        """
        return self._values.get('properties')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobSparkConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobSparkConfigLoggingConfig", jsii_struct_bases=[], name_mapping={'driver_log_levels': 'driverLogLevels'})
class DataprocJobSparkConfigLoggingConfig():
    def __init__(self, *, driver_log_levels: typing.Mapping[str, str]) -> None:
        """
        :param driver_log_levels: Optional. The per-package log levels for the driver. This may include 'root' package name to configure rootLogger. Examples: 'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'.
        """
        self._values = {
            'driver_log_levels': driver_log_levels,
        }

    @builtins.property
    def driver_log_levels(self) -> typing.Mapping[str, str]:
        """Optional.

        The per-package log levels for the driver. This may include 'root' package name to configure rootLogger. Examples: 'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'.
        """
        return self._values.get('driver_log_levels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobSparkConfigLoggingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobSparksqlConfig", jsii_struct_bases=[], name_mapping={'jar_file_uris': 'jarFileUris', 'logging_config': 'loggingConfig', 'properties': 'properties', 'query_file_uri': 'queryFileUri', 'query_list': 'queryList', 'script_variables': 'scriptVariables'})
class DataprocJobSparksqlConfig():
    def __init__(self, *, jar_file_uris: typing.Optional[typing.List[str]]=None, logging_config: typing.Optional[typing.List["DataprocJobSparksqlConfigLoggingConfig"]]=None, properties: typing.Optional[typing.Mapping[str, str]]=None, query_file_uri: typing.Optional[str]=None, query_list: typing.Optional[typing.List[str]]=None, script_variables: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param jar_file_uris: HCFS URIs of jar files to be added to the Spark CLASSPATH.
        :param logging_config: logging_config block.
        :param properties: A mapping of property names to values, used to configure Spark SQL's SparkConf. Properties that conflict with values set by the Cloud Dataproc API may be overwritten.
        :param query_file_uri: The HCFS URI of the script that contains SQL queries. Conflicts with query_list
        :param query_list: The list of SQL queries or statements to execute as part of the job. Conflicts with query_file_uri
        :param script_variables: Mapping of query variable names to values (equivalent to the Spark SQL command: SET name="value";).
        """
        self._values = {
        }
        if jar_file_uris is not None: self._values["jar_file_uris"] = jar_file_uris
        if logging_config is not None: self._values["logging_config"] = logging_config
        if properties is not None: self._values["properties"] = properties
        if query_file_uri is not None: self._values["query_file_uri"] = query_file_uri
        if query_list is not None: self._values["query_list"] = query_list
        if script_variables is not None: self._values["script_variables"] = script_variables

    @builtins.property
    def jar_file_uris(self) -> typing.Optional[typing.List[str]]:
        """HCFS URIs of jar files to be added to the Spark CLASSPATH."""
        return self._values.get('jar_file_uris')

    @builtins.property
    def logging_config(self) -> typing.Optional[typing.List["DataprocJobSparksqlConfigLoggingConfig"]]:
        """logging_config block."""
        return self._values.get('logging_config')

    @builtins.property
    def properties(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A mapping of property names to values, used to configure Spark SQL's SparkConf.

        Properties that conflict with values set by the Cloud Dataproc API may be overwritten.
        """
        return self._values.get('properties')

    @builtins.property
    def query_file_uri(self) -> typing.Optional[str]:
        """The HCFS URI of the script that contains SQL queries.

        Conflicts with query_list
        """
        return self._values.get('query_file_uri')

    @builtins.property
    def query_list(self) -> typing.Optional[typing.List[str]]:
        """The list of SQL queries or statements to execute as part of the job.

        Conflicts with query_file_uri
        """
        return self._values.get('query_list')

    @builtins.property
    def script_variables(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Mapping of query variable names to values (equivalent to the Spark SQL command: SET name="value";)."""
        return self._values.get('script_variables')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobSparksqlConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobSparksqlConfigLoggingConfig", jsii_struct_bases=[], name_mapping={'driver_log_levels': 'driverLogLevels'})
class DataprocJobSparksqlConfigLoggingConfig():
    def __init__(self, *, driver_log_levels: typing.Mapping[str, str]) -> None:
        """
        :param driver_log_levels: Optional. The per-package log levels for the driver. This may include 'root' package name to configure rootLogger. Examples: 'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'.
        """
        self._values = {
            'driver_log_levels': driver_log_levels,
        }

    @builtins.property
    def driver_log_levels(self) -> typing.Mapping[str, str]:
        """Optional.

        The per-package log levels for the driver. This may include 'root' package name to configure rootLogger. Examples: 'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'.
        """
        return self._values.get('driver_log_levels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobSparksqlConfigLoggingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DataprocJobStatus(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DataprocJobStatus"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DataprocJobStatus, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="details")
    def details(self) -> str:
        return jsii.get(self, "details")

    @builtins.property
    @jsii.member(jsii_name="state")
    def state(self) -> str:
        return jsii.get(self, "state")

    @builtins.property
    @jsii.member(jsii_name="stateStartTime")
    def state_start_time(self) -> str:
        return jsii.get(self, "stateStartTime")

    @builtins.property
    @jsii.member(jsii_name="substate")
    def substate(self) -> str:
        return jsii.get(self, "substate")


@jsii.data_type(jsii_type="@cdktf/provider-google.DataprocJobTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class DataprocJobTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DataprocJobTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DatastoreIndex(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DatastoreIndex"):
    def __init__(self, scope: constructs.Construct, id: str, *, kind: str, ancestor: typing.Optional[str]=None, project: typing.Optional[str]=None, properties: typing.Optional[typing.List["DatastoreIndexProperties"]]=None, timeouts: typing.Optional["DatastoreIndexTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param kind: The entity kind which the index applies to.
        :param ancestor: Policy for including ancestors in the index. Default value: "NONE" Possible values: ["NONE", "ALL_ANCESTORS"]
        :param project: 
        :param properties: properties block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DatastoreIndexConfig(kind=kind, ancestor=ancestor, project=project, properties=properties, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DatastoreIndex, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="indexId")
    def index_id(self) -> str:
        return jsii.get(self, "indexId")

    @builtins.property
    @jsii.member(jsii_name="kind")
    def kind(self) -> str:
        return jsii.get(self, "kind")

    @kind.setter
    def kind(self, value: str) -> None:
        jsii.set(self, "kind", value)

    @builtins.property
    @jsii.member(jsii_name="ancestor")
    def ancestor(self) -> typing.Optional[str]:
        return jsii.get(self, "ancestor")

    @ancestor.setter
    def ancestor(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "ancestor", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="properties")
    def properties(self) -> typing.Optional[typing.List["DatastoreIndexProperties"]]:
        return jsii.get(self, "properties")

    @properties.setter
    def properties(self, value: typing.Optional[typing.List["DatastoreIndexProperties"]]) -> None:
        jsii.set(self, "properties", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DatastoreIndexTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DatastoreIndexTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DatastoreIndexConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'kind': 'kind', 'ancestor': 'ancestor', 'project': 'project', 'properties': 'properties', 'timeouts': 'timeouts'})
class DatastoreIndexConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, kind: str, ancestor: typing.Optional[str]=None, project: typing.Optional[str]=None, properties: typing.Optional[typing.List["DatastoreIndexProperties"]]=None, timeouts: typing.Optional["DatastoreIndexTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param kind: The entity kind which the index applies to.
        :param ancestor: Policy for including ancestors in the index. Default value: "NONE" Possible values: ["NONE", "ALL_ANCESTORS"]
        :param project: 
        :param properties: properties block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DatastoreIndexTimeouts(**timeouts)
        self._values = {
            'kind': kind,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if ancestor is not None: self._values["ancestor"] = ancestor
        if project is not None: self._values["project"] = project
        if properties is not None: self._values["properties"] = properties
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def kind(self) -> str:
        """The entity kind which the index applies to."""
        return self._values.get('kind')

    @builtins.property
    def ancestor(self) -> typing.Optional[str]:
        """Policy for including ancestors in the index.

        Default value: "NONE" Possible values: ["NONE", "ALL_ANCESTORS"]
        """
        return self._values.get('ancestor')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def properties(self) -> typing.Optional[typing.List["DatastoreIndexProperties"]]:
        """properties block."""
        return self._values.get('properties')

    @builtins.property
    def timeouts(self) -> typing.Optional["DatastoreIndexTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DatastoreIndexConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DatastoreIndexProperties", jsii_struct_bases=[], name_mapping={'direction': 'direction', 'name': 'name'})
class DatastoreIndexProperties():
    def __init__(self, *, direction: str, name: str) -> None:
        """
        :param direction: The direction the index should optimize for sorting. Possible values: ["ASCENDING", "DESCENDING"]
        :param name: The property name to index.
        """
        self._values = {
            'direction': direction,
            'name': name,
        }

    @builtins.property
    def direction(self) -> str:
        """The direction the index should optimize for sorting.

        Possible values: ["ASCENDING", "DESCENDING"]
        """
        return self._values.get('direction')

    @builtins.property
    def name(self) -> str:
        """The property name to index."""
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DatastoreIndexProperties(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DatastoreIndexTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class DatastoreIndexTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DatastoreIndexTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DeploymentManagerDeployment(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DeploymentManagerDeployment"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, target: typing.List["DeploymentManagerDeploymentTarget"], create_policy: typing.Optional[str]=None, delete_policy: typing.Optional[str]=None, description: typing.Optional[str]=None, labels: typing.Optional[typing.List["DeploymentManagerDeploymentLabels"]]=None, preview: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["DeploymentManagerDeploymentTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Unique name for the deployment.
        :param target: target block.
        :param create_policy: Set the policy to use for creating new resources. Only used on create and update. Valid values are 'CREATE_OR_ACQUIRE' (default) or 'ACQUIRE'. If set to 'ACQUIRE' and resources do not already exist, the deployment will fail. Note that updating this field does not actually affect the deployment, just how it is updated. Default value: "CREATE_OR_ACQUIRE" Possible values: ["ACQUIRE", "CREATE_OR_ACQUIRE"]
        :param delete_policy: Set the policy to use for deleting new resources on update/delete. Valid values are 'DELETE' (default) or 'ABANDON'. If 'DELETE', resource is deleted after removal from Deployment Manager. If 'ABANDON', the resource is only removed from Deployment Manager and is not actually deleted. Note that updating this field does not actually change the deployment, just how it is updated. Default value: "DELETE" Possible values: ["ABANDON", "DELETE"]
        :param description: Optional user-provided description of deployment.
        :param labels: labels block.
        :param preview: If set to true, a deployment is created with "shell" resources that are not actually instantiated. This allows you to preview a deployment. It can be updated to false to actually deploy with real resources. ~>**NOTE:** Deployment Manager does not allow update of a deployment in preview (unless updating to preview=false). Thus, Terraform will force-recreate deployments if either preview is updated to true or if other fields are updated while preview is true.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DeploymentManagerDeploymentConfig(name=name, target=target, create_policy=create_policy, delete_policy=delete_policy, description=description, labels=labels, preview=preview, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DeploymentManagerDeployment, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="deploymentId")
    def deployment_id(self) -> str:
        return jsii.get(self, "deploymentId")

    @builtins.property
    @jsii.member(jsii_name="manifest")
    def manifest(self) -> str:
        return jsii.get(self, "manifest")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="target")
    def target(self) -> typing.List["DeploymentManagerDeploymentTarget"]:
        return jsii.get(self, "target")

    @target.setter
    def target(self, value: typing.List["DeploymentManagerDeploymentTarget"]) -> None:
        jsii.set(self, "target", value)

    @builtins.property
    @jsii.member(jsii_name="createPolicy")
    def create_policy(self) -> typing.Optional[str]:
        return jsii.get(self, "createPolicy")

    @create_policy.setter
    def create_policy(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "createPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="deletePolicy")
    def delete_policy(self) -> typing.Optional[str]:
        return jsii.get(self, "deletePolicy")

    @delete_policy.setter
    def delete_policy(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "deletePolicy", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.List["DeploymentManagerDeploymentLabels"]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.List["DeploymentManagerDeploymentLabels"]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="preview")
    def preview(self) -> typing.Optional[bool]:
        return jsii.get(self, "preview")

    @preview.setter
    def preview(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "preview", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DeploymentManagerDeploymentTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DeploymentManagerDeploymentTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DeploymentManagerDeploymentConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'target': 'target', 'create_policy': 'createPolicy', 'delete_policy': 'deletePolicy', 'description': 'description', 'labels': 'labels', 'preview': 'preview', 'project': 'project', 'timeouts': 'timeouts'})
class DeploymentManagerDeploymentConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, target: typing.List["DeploymentManagerDeploymentTarget"], create_policy: typing.Optional[str]=None, delete_policy: typing.Optional[str]=None, description: typing.Optional[str]=None, labels: typing.Optional[typing.List["DeploymentManagerDeploymentLabels"]]=None, preview: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["DeploymentManagerDeploymentTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Unique name for the deployment.
        :param target: target block.
        :param create_policy: Set the policy to use for creating new resources. Only used on create and update. Valid values are 'CREATE_OR_ACQUIRE' (default) or 'ACQUIRE'. If set to 'ACQUIRE' and resources do not already exist, the deployment will fail. Note that updating this field does not actually affect the deployment, just how it is updated. Default value: "CREATE_OR_ACQUIRE" Possible values: ["ACQUIRE", "CREATE_OR_ACQUIRE"]
        :param delete_policy: Set the policy to use for deleting new resources on update/delete. Valid values are 'DELETE' (default) or 'ABANDON'. If 'DELETE', resource is deleted after removal from Deployment Manager. If 'ABANDON', the resource is only removed from Deployment Manager and is not actually deleted. Note that updating this field does not actually change the deployment, just how it is updated. Default value: "DELETE" Possible values: ["ABANDON", "DELETE"]
        :param description: Optional user-provided description of deployment.
        :param labels: labels block.
        :param preview: If set to true, a deployment is created with "shell" resources that are not actually instantiated. This allows you to preview a deployment. It can be updated to false to actually deploy with real resources. ~>**NOTE:** Deployment Manager does not allow update of a deployment in preview (unless updating to preview=false). Thus, Terraform will force-recreate deployments if either preview is updated to true or if other fields are updated while preview is true.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DeploymentManagerDeploymentTimeouts(**timeouts)
        self._values = {
            'name': name,
            'target': target,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if create_policy is not None: self._values["create_policy"] = create_policy
        if delete_policy is not None: self._values["delete_policy"] = delete_policy
        if description is not None: self._values["description"] = description
        if labels is not None: self._values["labels"] = labels
        if preview is not None: self._values["preview"] = preview
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Unique name for the deployment."""
        return self._values.get('name')

    @builtins.property
    def target(self) -> typing.List["DeploymentManagerDeploymentTarget"]:
        """target block."""
        return self._values.get('target')

    @builtins.property
    def create_policy(self) -> typing.Optional[str]:
        """Set the policy to use for creating new resources.

        Only used on
        create and update. Valid values are 'CREATE_OR_ACQUIRE' (default) or
        'ACQUIRE'. If set to 'ACQUIRE' and resources do not already exist,
        the deployment will fail. Note that updating this field does not
        actually affect the deployment, just how it is updated. Default value: "CREATE_OR_ACQUIRE" Possible values: ["ACQUIRE", "CREATE_OR_ACQUIRE"]
        """
        return self._values.get('create_policy')

    @builtins.property
    def delete_policy(self) -> typing.Optional[str]:
        """Set the policy to use for deleting new resources on update/delete.

        Valid values are 'DELETE' (default) or 'ABANDON'. If 'DELETE',
        resource is deleted after removal from Deployment Manager. If
        'ABANDON', the resource is only removed from Deployment Manager
        and is not actually deleted. Note that updating this field does not
        actually change the deployment, just how it is updated. Default value: "DELETE" Possible values: ["ABANDON", "DELETE"]
        """
        return self._values.get('delete_policy')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Optional user-provided description of deployment."""
        return self._values.get('description')

    @builtins.property
    def labels(self) -> typing.Optional[typing.List["DeploymentManagerDeploymentLabels"]]:
        """labels block."""
        return self._values.get('labels')

    @builtins.property
    def preview(self) -> typing.Optional[bool]:
        """If set to true, a deployment is created with "shell" resources that are not actually instantiated.

        This allows you to preview a
        deployment. It can be updated to false to actually deploy
        with real resources.
        ~>**NOTE:** Deployment Manager does not allow update
        of a deployment in preview (unless updating to preview=false). Thus,
        Terraform will force-recreate deployments if either preview is updated
        to true or if other fields are updated while preview is true.
        """
        return self._values.get('preview')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["DeploymentManagerDeploymentTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DeploymentManagerDeploymentConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DeploymentManagerDeploymentLabels", jsii_struct_bases=[], name_mapping={'key': 'key', 'value': 'value'})
class DeploymentManagerDeploymentLabels():
    def __init__(self, *, key: typing.Optional[str]=None, value: typing.Optional[str]=None) -> None:
        """
        :param key: Key for label.
        :param value: Value of label.
        """
        self._values = {
        }
        if key is not None: self._values["key"] = key
        if value is not None: self._values["value"] = value

    @builtins.property
    def key(self) -> typing.Optional[str]:
        """Key for label."""
        return self._values.get('key')

    @builtins.property
    def value(self) -> typing.Optional[str]:
        """Value of label."""
        return self._values.get('value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DeploymentManagerDeploymentLabels(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DeploymentManagerDeploymentTarget", jsii_struct_bases=[], name_mapping={'config': 'config', 'imports': 'imports'})
class DeploymentManagerDeploymentTarget():
    def __init__(self, *, config: typing.List["DeploymentManagerDeploymentTargetConfig"], imports: typing.Optional[typing.List["DeploymentManagerDeploymentTargetImports"]]=None) -> None:
        """
        :param config: config block.
        :param imports: imports block.
        """
        self._values = {
            'config': config,
        }
        if imports is not None: self._values["imports"] = imports

    @builtins.property
    def config(self) -> typing.List["DeploymentManagerDeploymentTargetConfig"]:
        """config block."""
        return self._values.get('config')

    @builtins.property
    def imports(self) -> typing.Optional[typing.List["DeploymentManagerDeploymentTargetImports"]]:
        """imports block."""
        return self._values.get('imports')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DeploymentManagerDeploymentTarget(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DeploymentManagerDeploymentTargetConfig", jsii_struct_bases=[], name_mapping={'content': 'content'})
class DeploymentManagerDeploymentTargetConfig():
    def __init__(self, *, content: str) -> None:
        """
        :param content: The full YAML contents of your configuration file.
        """
        self._values = {
            'content': content,
        }

    @builtins.property
    def content(self) -> str:
        """The full YAML contents of your configuration file."""
        return self._values.get('content')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DeploymentManagerDeploymentTargetConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DeploymentManagerDeploymentTargetImports", jsii_struct_bases=[], name_mapping={'content': 'content', 'name': 'name'})
class DeploymentManagerDeploymentTargetImports():
    def __init__(self, *, content: typing.Optional[str]=None, name: typing.Optional[str]=None) -> None:
        """
        :param content: The full contents of the template that you want to import.
        :param name: The name of the template to import, as declared in the YAML configuration.
        """
        self._values = {
        }
        if content is not None: self._values["content"] = content
        if name is not None: self._values["name"] = name

    @builtins.property
    def content(self) -> typing.Optional[str]:
        """The full contents of the template that you want to import."""
        return self._values.get('content')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """The name of the template to import, as declared in the YAML configuration."""
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DeploymentManagerDeploymentTargetImports(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DeploymentManagerDeploymentTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class DeploymentManagerDeploymentTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DeploymentManagerDeploymentTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DialogflowAgent(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DialogflowAgent"):
    def __init__(self, scope: constructs.Construct, id: str, *, default_language_code: str, display_name: str, time_zone: str, api_version: typing.Optional[str]=None, avatar_uri: typing.Optional[str]=None, classification_threshold: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, enable_logging: typing.Optional[bool]=None, match_mode: typing.Optional[str]=None, project: typing.Optional[str]=None, supported_language_codes: typing.Optional[typing.List[str]]=None, tier: typing.Optional[str]=None, timeouts: typing.Optional["DialogflowAgentTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param default_language_code: The default language of the agent as a language tag. `See Language Support <https://cloud.google.com/dialogflow/docs/reference/language>`_ for a list of the currently supported language codes. This field cannot be updated after creation.
        :param display_name: The name of this agent.
        :param time_zone: The time zone of this agent from the `time zone database <https://www.iana.org/time-zones>`_, e.g., America/New_York, Europe/Paris.
        :param api_version: API version displayed in Dialogflow console. If not specified, V2 API is assumed. Clients are free to query different service endpoints for different API versions. However, bots connectors and webhook calls will follow the specified API version. API_VERSION_V1: Legacy V1 API. API_VERSION_V2: V2 API. API_VERSION_V2_BETA_1: V2beta1 API. Possible values: ["API_VERSION_V1", "API_VERSION_V2", "API_VERSION_V2_BETA_1"]
        :param avatar_uri: The URI of the agent's avatar, which are used throughout the Dialogflow console. When an image URL is entered into this field, the Dialogflow will save the image in the backend. The address of the backend image returned from the API will be shown in the [avatarUriBackend] field.
        :param classification_threshold: To filter out false positive results and still get variety in matched natural language inputs for your agent, you can tune the machine learning classification threshold. If the returned score value is less than the threshold value, then a fallback intent will be triggered or, if there are no fallback intents defined, no intent will be triggered. The score values range from 0.0 (completely uncertain) to 1.0 (completely certain). If set to 0.0, the default of 0.3 is used.
        :param description: The description of this agent. The maximum length is 500 characters. If exceeded, the request is rejected.
        :param enable_logging: Determines whether this agent should log conversation queries.
        :param match_mode: Determines how intents are detected from user queries. MATCH_MODE_HYBRID: Best for agents with a small number of examples in intents and/or wide use of templates syntax and composite entities. MATCH_MODE_ML_ONLY: Can be used for agents with a large number of examples in intents, especially the ones using @sys.any or very large developer entities. Possible values: ["MATCH_MODE_HYBRID", "MATCH_MODE_ML_ONLY"]
        :param project: 
        :param supported_language_codes: The list of all languages supported by this agent (except for the defaultLanguageCode).
        :param tier: The agent tier. If not specified, TIER_STANDARD is assumed. TIER_STANDARD: Standard tier. TIER_ENTERPRISE: Enterprise tier (Essentials). TIER_ENTERPRISE_PLUS: Enterprise tier (Plus). NOTE: Due to consistency issues, the provider will not read this field from the API. Drift is possible between the Terraform state and Dialogflow if the agent tier is changed outside of Terraform. Possible values: ["TIER_STANDARD", "TIER_ENTERPRISE", "TIER_ENTERPRISE_PLUS"]
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DialogflowAgentConfig(default_language_code=default_language_code, display_name=display_name, time_zone=time_zone, api_version=api_version, avatar_uri=avatar_uri, classification_threshold=classification_threshold, description=description, enable_logging=enable_logging, match_mode=match_mode, project=project, supported_language_codes=supported_language_codes, tier=tier, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DialogflowAgent, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="avatarUriBackend")
    def avatar_uri_backend(self) -> str:
        return jsii.get(self, "avatarUriBackend")

    @builtins.property
    @jsii.member(jsii_name="defaultLanguageCode")
    def default_language_code(self) -> str:
        return jsii.get(self, "defaultLanguageCode")

    @default_language_code.setter
    def default_language_code(self, value: str) -> None:
        jsii.set(self, "defaultLanguageCode", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="timeZone")
    def time_zone(self) -> str:
        return jsii.get(self, "timeZone")

    @time_zone.setter
    def time_zone(self, value: str) -> None:
        jsii.set(self, "timeZone", value)

    @builtins.property
    @jsii.member(jsii_name="apiVersion")
    def api_version(self) -> typing.Optional[str]:
        return jsii.get(self, "apiVersion")

    @api_version.setter
    def api_version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "apiVersion", value)

    @builtins.property
    @jsii.member(jsii_name="avatarUri")
    def avatar_uri(self) -> typing.Optional[str]:
        return jsii.get(self, "avatarUri")

    @avatar_uri.setter
    def avatar_uri(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "avatarUri", value)

    @builtins.property
    @jsii.member(jsii_name="classificationThreshold")
    def classification_threshold(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "classificationThreshold")

    @classification_threshold.setter
    def classification_threshold(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "classificationThreshold", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="enableLogging")
    def enable_logging(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableLogging")

    @enable_logging.setter
    def enable_logging(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableLogging", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="matchMode")
    def match_mode(self) -> typing.Optional[str]:
        return jsii.get(self, "matchMode")

    @match_mode.setter
    def match_mode(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "matchMode", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="supportedLanguageCodes")
    def supported_language_codes(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "supportedLanguageCodes")

    @supported_language_codes.setter
    def supported_language_codes(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "supportedLanguageCodes", value)

    @builtins.property
    @jsii.member(jsii_name="tier")
    def tier(self) -> typing.Optional[str]:
        return jsii.get(self, "tier")

    @tier.setter
    def tier(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "tier", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DialogflowAgentTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DialogflowAgentTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DialogflowAgentConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'default_language_code': 'defaultLanguageCode', 'display_name': 'displayName', 'time_zone': 'timeZone', 'api_version': 'apiVersion', 'avatar_uri': 'avatarUri', 'classification_threshold': 'classificationThreshold', 'description': 'description', 'enable_logging': 'enableLogging', 'match_mode': 'matchMode', 'project': 'project', 'supported_language_codes': 'supportedLanguageCodes', 'tier': 'tier', 'timeouts': 'timeouts'})
class DialogflowAgentConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, default_language_code: str, display_name: str, time_zone: str, api_version: typing.Optional[str]=None, avatar_uri: typing.Optional[str]=None, classification_threshold: typing.Optional[jsii.Number]=None, description: typing.Optional[str]=None, enable_logging: typing.Optional[bool]=None, match_mode: typing.Optional[str]=None, project: typing.Optional[str]=None, supported_language_codes: typing.Optional[typing.List[str]]=None, tier: typing.Optional[str]=None, timeouts: typing.Optional["DialogflowAgentTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param default_language_code: The default language of the agent as a language tag. `See Language Support <https://cloud.google.com/dialogflow/docs/reference/language>`_ for a list of the currently supported language codes. This field cannot be updated after creation.
        :param display_name: The name of this agent.
        :param time_zone: The time zone of this agent from the `time zone database <https://www.iana.org/time-zones>`_, e.g., America/New_York, Europe/Paris.
        :param api_version: API version displayed in Dialogflow console. If not specified, V2 API is assumed. Clients are free to query different service endpoints for different API versions. However, bots connectors and webhook calls will follow the specified API version. API_VERSION_V1: Legacy V1 API. API_VERSION_V2: V2 API. API_VERSION_V2_BETA_1: V2beta1 API. Possible values: ["API_VERSION_V1", "API_VERSION_V2", "API_VERSION_V2_BETA_1"]
        :param avatar_uri: The URI of the agent's avatar, which are used throughout the Dialogflow console. When an image URL is entered into this field, the Dialogflow will save the image in the backend. The address of the backend image returned from the API will be shown in the [avatarUriBackend] field.
        :param classification_threshold: To filter out false positive results and still get variety in matched natural language inputs for your agent, you can tune the machine learning classification threshold. If the returned score value is less than the threshold value, then a fallback intent will be triggered or, if there are no fallback intents defined, no intent will be triggered. The score values range from 0.0 (completely uncertain) to 1.0 (completely certain). If set to 0.0, the default of 0.3 is used.
        :param description: The description of this agent. The maximum length is 500 characters. If exceeded, the request is rejected.
        :param enable_logging: Determines whether this agent should log conversation queries.
        :param match_mode: Determines how intents are detected from user queries. MATCH_MODE_HYBRID: Best for agents with a small number of examples in intents and/or wide use of templates syntax and composite entities. MATCH_MODE_ML_ONLY: Can be used for agents with a large number of examples in intents, especially the ones using @sys.any or very large developer entities. Possible values: ["MATCH_MODE_HYBRID", "MATCH_MODE_ML_ONLY"]
        :param project: 
        :param supported_language_codes: The list of all languages supported by this agent (except for the defaultLanguageCode).
        :param tier: The agent tier. If not specified, TIER_STANDARD is assumed. TIER_STANDARD: Standard tier. TIER_ENTERPRISE: Enterprise tier (Essentials). TIER_ENTERPRISE_PLUS: Enterprise tier (Plus). NOTE: Due to consistency issues, the provider will not read this field from the API. Drift is possible between the Terraform state and Dialogflow if the agent tier is changed outside of Terraform. Possible values: ["TIER_STANDARD", "TIER_ENTERPRISE", "TIER_ENTERPRISE_PLUS"]
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DialogflowAgentTimeouts(**timeouts)
        self._values = {
            'default_language_code': default_language_code,
            'display_name': display_name,
            'time_zone': time_zone,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if api_version is not None: self._values["api_version"] = api_version
        if avatar_uri is not None: self._values["avatar_uri"] = avatar_uri
        if classification_threshold is not None: self._values["classification_threshold"] = classification_threshold
        if description is not None: self._values["description"] = description
        if enable_logging is not None: self._values["enable_logging"] = enable_logging
        if match_mode is not None: self._values["match_mode"] = match_mode
        if project is not None: self._values["project"] = project
        if supported_language_codes is not None: self._values["supported_language_codes"] = supported_language_codes
        if tier is not None: self._values["tier"] = tier
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def default_language_code(self) -> str:
        """The default language of the agent as a language tag.

        `See Language Support <https://cloud.google.com/dialogflow/docs/reference/language>`_
        for a list of the currently supported language codes. This field cannot be updated after creation.
        """
        return self._values.get('default_language_code')

    @builtins.property
    def display_name(self) -> str:
        """The name of this agent."""
        return self._values.get('display_name')

    @builtins.property
    def time_zone(self) -> str:
        """The time zone of this agent from the `time zone database <https://www.iana.org/time-zones>`_, e.g., America/New_York, Europe/Paris."""
        return self._values.get('time_zone')

    @builtins.property
    def api_version(self) -> typing.Optional[str]:
        """API version displayed in Dialogflow console.

        If not specified, V2 API is assumed. Clients are free to query
        different service endpoints for different API versions. However, bots connectors and webhook calls will follow
        the specified API version.
        API_VERSION_V1: Legacy V1 API.
        API_VERSION_V2: V2 API.
        API_VERSION_V2_BETA_1: V2beta1 API. Possible values: ["API_VERSION_V1", "API_VERSION_V2", "API_VERSION_V2_BETA_1"]
        """
        return self._values.get('api_version')

    @builtins.property
    def avatar_uri(self) -> typing.Optional[str]:
        """The URI of the agent's avatar, which are used throughout the Dialogflow console.

        When an image URL is entered
        into this field, the Dialogflow will save the image in the backend. The address of the backend image returned
        from the API will be shown in the [avatarUriBackend] field.
        """
        return self._values.get('avatar_uri')

    @builtins.property
    def classification_threshold(self) -> typing.Optional[jsii.Number]:
        """To filter out false positive results and still get variety in matched natural language inputs for your agent, you can tune the machine learning classification threshold.

        If the returned score value is less than the threshold
        value, then a fallback intent will be triggered or, if there are no fallback intents defined, no intent will be
        triggered. The score values range from 0.0 (completely uncertain) to 1.0 (completely certain). If set to 0.0, the
        default of 0.3 is used.
        """
        return self._values.get('classification_threshold')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """The description of this agent.

        The maximum length is 500 characters. If exceeded, the request is rejected.
        """
        return self._values.get('description')

    @builtins.property
    def enable_logging(self) -> typing.Optional[bool]:
        """Determines whether this agent should log conversation queries."""
        return self._values.get('enable_logging')

    @builtins.property
    def match_mode(self) -> typing.Optional[str]:
        """Determines how intents are detected from user queries.

        MATCH_MODE_HYBRID: Best for agents with a small number of examples in intents and/or wide use of templates
        syntax and composite entities.
        MATCH_MODE_ML_ONLY: Can be used for agents with a large number of examples in intents, especially the ones
        using @sys.any or very large developer entities. Possible values: ["MATCH_MODE_HYBRID", "MATCH_MODE_ML_ONLY"]
        """
        return self._values.get('match_mode')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def supported_language_codes(self) -> typing.Optional[typing.List[str]]:
        """The list of all languages supported by this agent (except for the defaultLanguageCode)."""
        return self._values.get('supported_language_codes')

    @builtins.property
    def tier(self) -> typing.Optional[str]:
        """The agent tier.

        If not specified, TIER_STANDARD is assumed.
        TIER_STANDARD: Standard tier.
        TIER_ENTERPRISE: Enterprise tier (Essentials).
        TIER_ENTERPRISE_PLUS: Enterprise tier (Plus).
        NOTE: Due to consistency issues, the provider will not read this field from the API. Drift is possible between
        the Terraform state and Dialogflow if the agent tier is changed outside of Terraform. Possible values: ["TIER_STANDARD", "TIER_ENTERPRISE", "TIER_ENTERPRISE_PLUS"]
        """
        return self._values.get('tier')

    @builtins.property
    def timeouts(self) -> typing.Optional["DialogflowAgentTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DialogflowAgentConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DialogflowAgentTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class DialogflowAgentTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DialogflowAgentTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DialogflowEntityType(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DialogflowEntityType"):
    def __init__(self, scope: constructs.Construct, id: str, *, display_name: str, kind: str, enable_fuzzy_extraction: typing.Optional[bool]=None, entities: typing.Optional[typing.List["DialogflowEntityTypeEntities"]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["DialogflowEntityTypeTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: The name of this entity type to be displayed on the console.
        :param kind: Indicates the kind of entity type. KIND_MAP: Map entity types allow mapping of a group of synonyms to a reference value. KIND_LIST: List entity types contain a set of entries that do not map to reference values. However, list entity types can contain references to other entity types (with or without aliases). KIND_REGEXP: Regexp entity types allow to specify regular expressions in entries values. Possible values: ["KIND_MAP", "KIND_LIST", "KIND_REGEXP"]
        :param enable_fuzzy_extraction: Enables fuzzy entity extraction during classification.
        :param entities: entities block.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DialogflowEntityTypeConfig(display_name=display_name, kind=kind, enable_fuzzy_extraction=enable_fuzzy_extraction, entities=entities, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DialogflowEntityType, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="kind")
    def kind(self) -> str:
        return jsii.get(self, "kind")

    @kind.setter
    def kind(self, value: str) -> None:
        jsii.set(self, "kind", value)

    @builtins.property
    @jsii.member(jsii_name="enableFuzzyExtraction")
    def enable_fuzzy_extraction(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableFuzzyExtraction")

    @enable_fuzzy_extraction.setter
    def enable_fuzzy_extraction(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableFuzzyExtraction", value)

    @builtins.property
    @jsii.member(jsii_name="entities")
    def entities(self) -> typing.Optional[typing.List["DialogflowEntityTypeEntities"]]:
        return jsii.get(self, "entities")

    @entities.setter
    def entities(self, value: typing.Optional[typing.List["DialogflowEntityTypeEntities"]]) -> None:
        jsii.set(self, "entities", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DialogflowEntityTypeTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DialogflowEntityTypeTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DialogflowEntityTypeConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'display_name': 'displayName', 'kind': 'kind', 'enable_fuzzy_extraction': 'enableFuzzyExtraction', 'entities': 'entities', 'project': 'project', 'timeouts': 'timeouts'})
class DialogflowEntityTypeConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, display_name: str, kind: str, enable_fuzzy_extraction: typing.Optional[bool]=None, entities: typing.Optional[typing.List["DialogflowEntityTypeEntities"]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["DialogflowEntityTypeTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: The name of this entity type to be displayed on the console.
        :param kind: Indicates the kind of entity type. KIND_MAP: Map entity types allow mapping of a group of synonyms to a reference value. KIND_LIST: List entity types contain a set of entries that do not map to reference values. However, list entity types can contain references to other entity types (with or without aliases). KIND_REGEXP: Regexp entity types allow to specify regular expressions in entries values. Possible values: ["KIND_MAP", "KIND_LIST", "KIND_REGEXP"]
        :param enable_fuzzy_extraction: Enables fuzzy entity extraction during classification.
        :param entities: entities block.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DialogflowEntityTypeTimeouts(**timeouts)
        self._values = {
            'display_name': display_name,
            'kind': kind,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if enable_fuzzy_extraction is not None: self._values["enable_fuzzy_extraction"] = enable_fuzzy_extraction
        if entities is not None: self._values["entities"] = entities
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def display_name(self) -> str:
        """The name of this entity type to be displayed on the console."""
        return self._values.get('display_name')

    @builtins.property
    def kind(self) -> str:
        """Indicates the kind of entity type.

        KIND_MAP: Map entity types allow mapping of a group of synonyms to a reference value.
        KIND_LIST: List entity types contain a set of entries that do not map to reference values. However, list entity
        types can contain references to other entity types (with or without aliases).
        KIND_REGEXP: Regexp entity types allow to specify regular expressions in entries values. Possible values: ["KIND_MAP", "KIND_LIST", "KIND_REGEXP"]
        """
        return self._values.get('kind')

    @builtins.property
    def enable_fuzzy_extraction(self) -> typing.Optional[bool]:
        """Enables fuzzy entity extraction during classification."""
        return self._values.get('enable_fuzzy_extraction')

    @builtins.property
    def entities(self) -> typing.Optional[typing.List["DialogflowEntityTypeEntities"]]:
        """entities block."""
        return self._values.get('entities')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["DialogflowEntityTypeTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DialogflowEntityTypeConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DialogflowEntityTypeEntities", jsii_struct_bases=[], name_mapping={'synonyms': 'synonyms', 'value': 'value'})
class DialogflowEntityTypeEntities():
    def __init__(self, *, synonyms: typing.List[str], value: str) -> None:
        """
        :param synonyms: A collection of value synonyms. For example, if the entity type is vegetable, and value is scallions, a synonym could be green onions. For KIND_LIST entity types: This collection must contain exactly one synonym equal to value.
        :param value: The primary value associated with this entity entry. For example, if the entity type is vegetable, the value could be scallions. For KIND_MAP entity types: A reference value to be used in place of synonyms. For KIND_LIST entity types: A string that can contain references to other entity types (with or without aliases).
        """
        self._values = {
            'synonyms': synonyms,
            'value': value,
        }

    @builtins.property
    def synonyms(self) -> typing.List[str]:
        """A collection of value synonyms.

        For example, if the entity type is vegetable, and value is scallions, a synonym
        could be green onions.
        For KIND_LIST entity types:
        This collection must contain exactly one synonym equal to value.
        """
        return self._values.get('synonyms')

    @builtins.property
    def value(self) -> str:
        """The primary value associated with this entity entry.

        For example, if the entity type is vegetable, the value
        could be scallions.
        For KIND_MAP entity types:
        A reference value to be used in place of synonyms.
        For KIND_LIST entity types:
        A string that can contain references to other entity types (with or without aliases).
        """
        return self._values.get('value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DialogflowEntityTypeEntities(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DialogflowEntityTypeTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class DialogflowEntityTypeTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DialogflowEntityTypeTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DialogflowIntent(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DialogflowIntent"):
    def __init__(self, scope: constructs.Construct, id: str, *, display_name: str, action: typing.Optional[str]=None, default_response_platforms: typing.Optional[typing.List[str]]=None, events: typing.Optional[typing.List[str]]=None, input_context_names: typing.Optional[typing.List[str]]=None, is_fallback: typing.Optional[bool]=None, ml_disabled: typing.Optional[bool]=None, parent_followup_intent_name: typing.Optional[str]=None, priority: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, reset_contexts: typing.Optional[bool]=None, timeouts: typing.Optional["DialogflowIntentTimeouts"]=None, webhook_state: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: The name of this intent to be displayed on the console.
        :param action: The name of the action associated with the intent. Note: The action name must not contain whitespaces.
        :param default_response_platforms: The list of platforms for which the first responses will be copied from the messages in PLATFORM_UNSPECIFIED (i.e. default platform). Possible values: ["FACEBOOK", "SLACK", "TELEGRAM", "KIK", "SKYPE", "LINE", "VIBER", "ACTIONS_ON_GOOGLE", "GOOGLE_HANGOUTS"].
        :param events: The collection of event names that trigger the intent. If the collection of input contexts is not empty, all of the contexts must be present in the active user session for an event to trigger this intent. See the `events reference <https://cloud.google.com/dialogflow/docs/events-overview>`_ for more details.
        :param input_context_names: The list of context names required for this intent to be triggered. Format: projects//agent/sessions/-/contexts/.
        :param is_fallback: Indicates whether this is a fallback intent.
        :param ml_disabled: Indicates whether Machine Learning is disabled for the intent. Note: If mlDisabled setting is set to true, then this intent is not taken into account during inference in ML ONLY match mode. Also, auto-markup in the UI is turned off.
        :param parent_followup_intent_name: The unique identifier of the parent intent in the chain of followup intents. Format: projects//agent/intents/.
        :param priority: The priority of this intent. Higher numbers represent higher priorities. - If the supplied value is unspecified or 0, the service translates the value to 500,000, which corresponds to the Normal priority in the console. - If the supplied value is negative, the intent is ignored in runtime detect intent requests.
        :param project: 
        :param reset_contexts: Indicates whether to delete all contexts in the current session when this intent is matched.
        :param timeouts: timeouts block.
        :param webhook_state: Indicates whether webhooks are enabled for the intent. WEBHOOK_STATE_ENABLED: Webhook is enabled in the agent and in the intent. WEBHOOK_STATE_ENABLED_FOR_SLOT_FILLING: Webhook is enabled in the agent and in the intent. Also, each slot filling prompt is forwarded to the webhook. Possible values: ["WEBHOOK_STATE_ENABLED", "WEBHOOK_STATE_ENABLED_FOR_SLOT_FILLING"]
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DialogflowIntentConfig(display_name=display_name, action=action, default_response_platforms=default_response_platforms, events=events, input_context_names=input_context_names, is_fallback=is_fallback, ml_disabled=ml_disabled, parent_followup_intent_name=parent_followup_intent_name, priority=priority, project=project, reset_contexts=reset_contexts, timeouts=timeouts, webhook_state=webhook_state, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DialogflowIntent, self, [scope, id, config])

    @jsii.member(jsii_name="followupIntentInfo")
    def followup_intent_info(self, index: str) -> "DialogflowIntentFollowupIntentInfo":
        """
        :param index: -
        """
        return jsii.invoke(self, "followupIntentInfo", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="rootFollowupIntentName")
    def root_followup_intent_name(self) -> str:
        return jsii.get(self, "rootFollowupIntentName")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="action")
    def action(self) -> typing.Optional[str]:
        return jsii.get(self, "action")

    @action.setter
    def action(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "action", value)

    @builtins.property
    @jsii.member(jsii_name="defaultResponsePlatforms")
    def default_response_platforms(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "defaultResponsePlatforms")

    @default_response_platforms.setter
    def default_response_platforms(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "defaultResponsePlatforms", value)

    @builtins.property
    @jsii.member(jsii_name="events")
    def events(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "events")

    @events.setter
    def events(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "events", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="inputContextNames")
    def input_context_names(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "inputContextNames")

    @input_context_names.setter
    def input_context_names(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "inputContextNames", value)

    @builtins.property
    @jsii.member(jsii_name="isFallback")
    def is_fallback(self) -> typing.Optional[bool]:
        return jsii.get(self, "isFallback")

    @is_fallback.setter
    def is_fallback(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "isFallback", value)

    @builtins.property
    @jsii.member(jsii_name="mlDisabled")
    def ml_disabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "mlDisabled")

    @ml_disabled.setter
    def ml_disabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "mlDisabled", value)

    @builtins.property
    @jsii.member(jsii_name="parentFollowupIntentName")
    def parent_followup_intent_name(self) -> typing.Optional[str]:
        return jsii.get(self, "parentFollowupIntentName")

    @parent_followup_intent_name.setter
    def parent_followup_intent_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "parentFollowupIntentName", value)

    @builtins.property
    @jsii.member(jsii_name="priority")
    def priority(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "priority")

    @priority.setter
    def priority(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "priority", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="resetContexts")
    def reset_contexts(self) -> typing.Optional[bool]:
        return jsii.get(self, "resetContexts")

    @reset_contexts.setter
    def reset_contexts(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "resetContexts", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DialogflowIntentTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DialogflowIntentTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="webhookState")
    def webhook_state(self) -> typing.Optional[str]:
        return jsii.get(self, "webhookState")

    @webhook_state.setter
    def webhook_state(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "webhookState", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DialogflowIntentConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'display_name': 'displayName', 'action': 'action', 'default_response_platforms': 'defaultResponsePlatforms', 'events': 'events', 'input_context_names': 'inputContextNames', 'is_fallback': 'isFallback', 'ml_disabled': 'mlDisabled', 'parent_followup_intent_name': 'parentFollowupIntentName', 'priority': 'priority', 'project': 'project', 'reset_contexts': 'resetContexts', 'timeouts': 'timeouts', 'webhook_state': 'webhookState'})
class DialogflowIntentConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, display_name: str, action: typing.Optional[str]=None, default_response_platforms: typing.Optional[typing.List[str]]=None, events: typing.Optional[typing.List[str]]=None, input_context_names: typing.Optional[typing.List[str]]=None, is_fallback: typing.Optional[bool]=None, ml_disabled: typing.Optional[bool]=None, parent_followup_intent_name: typing.Optional[str]=None, priority: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, reset_contexts: typing.Optional[bool]=None, timeouts: typing.Optional["DialogflowIntentTimeouts"]=None, webhook_state: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: The name of this intent to be displayed on the console.
        :param action: The name of the action associated with the intent. Note: The action name must not contain whitespaces.
        :param default_response_platforms: The list of platforms for which the first responses will be copied from the messages in PLATFORM_UNSPECIFIED (i.e. default platform). Possible values: ["FACEBOOK", "SLACK", "TELEGRAM", "KIK", "SKYPE", "LINE", "VIBER", "ACTIONS_ON_GOOGLE", "GOOGLE_HANGOUTS"].
        :param events: The collection of event names that trigger the intent. If the collection of input contexts is not empty, all of the contexts must be present in the active user session for an event to trigger this intent. See the `events reference <https://cloud.google.com/dialogflow/docs/events-overview>`_ for more details.
        :param input_context_names: The list of context names required for this intent to be triggered. Format: projects//agent/sessions/-/contexts/.
        :param is_fallback: Indicates whether this is a fallback intent.
        :param ml_disabled: Indicates whether Machine Learning is disabled for the intent. Note: If mlDisabled setting is set to true, then this intent is not taken into account during inference in ML ONLY match mode. Also, auto-markup in the UI is turned off.
        :param parent_followup_intent_name: The unique identifier of the parent intent in the chain of followup intents. Format: projects//agent/intents/.
        :param priority: The priority of this intent. Higher numbers represent higher priorities. - If the supplied value is unspecified or 0, the service translates the value to 500,000, which corresponds to the Normal priority in the console. - If the supplied value is negative, the intent is ignored in runtime detect intent requests.
        :param project: 
        :param reset_contexts: Indicates whether to delete all contexts in the current session when this intent is matched.
        :param timeouts: timeouts block.
        :param webhook_state: Indicates whether webhooks are enabled for the intent. WEBHOOK_STATE_ENABLED: Webhook is enabled in the agent and in the intent. WEBHOOK_STATE_ENABLED_FOR_SLOT_FILLING: Webhook is enabled in the agent and in the intent. Also, each slot filling prompt is forwarded to the webhook. Possible values: ["WEBHOOK_STATE_ENABLED", "WEBHOOK_STATE_ENABLED_FOR_SLOT_FILLING"]
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DialogflowIntentTimeouts(**timeouts)
        self._values = {
            'display_name': display_name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if action is not None: self._values["action"] = action
        if default_response_platforms is not None: self._values["default_response_platforms"] = default_response_platforms
        if events is not None: self._values["events"] = events
        if input_context_names is not None: self._values["input_context_names"] = input_context_names
        if is_fallback is not None: self._values["is_fallback"] = is_fallback
        if ml_disabled is not None: self._values["ml_disabled"] = ml_disabled
        if parent_followup_intent_name is not None: self._values["parent_followup_intent_name"] = parent_followup_intent_name
        if priority is not None: self._values["priority"] = priority
        if project is not None: self._values["project"] = project
        if reset_contexts is not None: self._values["reset_contexts"] = reset_contexts
        if timeouts is not None: self._values["timeouts"] = timeouts
        if webhook_state is not None: self._values["webhook_state"] = webhook_state

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def display_name(self) -> str:
        """The name of this intent to be displayed on the console."""
        return self._values.get('display_name')

    @builtins.property
    def action(self) -> typing.Optional[str]:
        """The name of the action associated with the intent.

        Note: The action name must not contain whitespaces.
        """
        return self._values.get('action')

    @builtins.property
    def default_response_platforms(self) -> typing.Optional[typing.List[str]]:
        """The list of platforms for which the first responses will be copied from the messages in PLATFORM_UNSPECIFIED (i.e. default platform). Possible values: ["FACEBOOK", "SLACK", "TELEGRAM", "KIK", "SKYPE", "LINE", "VIBER", "ACTIONS_ON_GOOGLE", "GOOGLE_HANGOUTS"]."""
        return self._values.get('default_response_platforms')

    @builtins.property
    def events(self) -> typing.Optional[typing.List[str]]:
        """The collection of event names that trigger the intent.

        If the collection of input contexts is not empty, all of
        the contexts must be present in the active user session for an event to trigger this intent. See the
        `events reference <https://cloud.google.com/dialogflow/docs/events-overview>`_ for more details.
        """
        return self._values.get('events')

    @builtins.property
    def input_context_names(self) -> typing.Optional[typing.List[str]]:
        """The list of context names required for this intent to be triggered.

        Format: projects//agent/sessions/-/contexts/.
        """
        return self._values.get('input_context_names')

    @builtins.property
    def is_fallback(self) -> typing.Optional[bool]:
        """Indicates whether this is a fallback intent."""
        return self._values.get('is_fallback')

    @builtins.property
    def ml_disabled(self) -> typing.Optional[bool]:
        """Indicates whether Machine Learning is disabled for the intent.

        Note: If mlDisabled setting is set to true, then this intent is not taken into account during inference in ML
        ONLY match mode. Also, auto-markup in the UI is turned off.
        """
        return self._values.get('ml_disabled')

    @builtins.property
    def parent_followup_intent_name(self) -> typing.Optional[str]:
        """The unique identifier of the parent intent in the chain of followup intents.

        Format: projects//agent/intents/.
        """
        return self._values.get('parent_followup_intent_name')

    @builtins.property
    def priority(self) -> typing.Optional[jsii.Number]:
        """The priority of this intent.

        Higher numbers represent higher priorities.

        - If the supplied value is unspecified or 0, the service translates the value to 500,000, which corresponds
          to the Normal priority in the console.
        - If the supplied value is negative, the intent is ignored in runtime detect intent requests.
        """
        return self._values.get('priority')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def reset_contexts(self) -> typing.Optional[bool]:
        """Indicates whether to delete all contexts in the current session when this intent is matched."""
        return self._values.get('reset_contexts')

    @builtins.property
    def timeouts(self) -> typing.Optional["DialogflowIntentTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def webhook_state(self) -> typing.Optional[str]:
        """Indicates whether webhooks are enabled for the intent.

        WEBHOOK_STATE_ENABLED: Webhook is enabled in the agent and in the intent.
        WEBHOOK_STATE_ENABLED_FOR_SLOT_FILLING: Webhook is enabled in the agent and in the intent. Also, each slot
        filling prompt is forwarded to the webhook. Possible values: ["WEBHOOK_STATE_ENABLED", "WEBHOOK_STATE_ENABLED_FOR_SLOT_FILLING"]
        """
        return self._values.get('webhook_state')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DialogflowIntentConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DialogflowIntentFollowupIntentInfo(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DialogflowIntentFollowupIntentInfo"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(DialogflowIntentFollowupIntentInfo, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="followupIntentName")
    def followup_intent_name(self) -> str:
        return jsii.get(self, "followupIntentName")

    @builtins.property
    @jsii.member(jsii_name="parentFollowupIntentName")
    def parent_followup_intent_name(self) -> str:
        return jsii.get(self, "parentFollowupIntentName")


@jsii.data_type(jsii_type="@cdktf/provider-google.DialogflowIntentTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class DialogflowIntentTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DialogflowIntentTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DnsManagedZone(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DnsManagedZone"):
    def __init__(self, scope: constructs.Construct, id: str, *, dns_name: str, name: str, description: typing.Optional[str]=None, dnssec_config: typing.Optional[typing.List["DnsManagedZoneDnssecConfig"]]=None, forwarding_config: typing.Optional[typing.List["DnsManagedZoneForwardingConfig"]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, peering_config: typing.Optional[typing.List["DnsManagedZonePeeringConfig"]]=None, private_visibility_config: typing.Optional[typing.List["DnsManagedZonePrivateVisibilityConfig"]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["DnsManagedZoneTimeouts"]=None, visibility: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dns_name: The DNS name of this managed zone, for instance "example.com.".
        :param name: User assigned name for this resource. Must be unique within the project.
        :param description: A textual description field. Defaults to 'Managed by Terraform'.
        :param dnssec_config: dnssec_config block.
        :param forwarding_config: forwarding_config block.
        :param labels: A set of key/value label pairs to assign to this ManagedZone.
        :param peering_config: peering_config block.
        :param private_visibility_config: private_visibility_config block.
        :param project: 
        :param timeouts: timeouts block.
        :param visibility: The zone's visibility: public zones are exposed to the Internet, while private zones are visible only to Virtual Private Cloud resources. Default value: "public" Possible values: ["private", "public"]
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsManagedZoneConfig(dns_name=dns_name, name=name, description=description, dnssec_config=dnssec_config, forwarding_config=forwarding_config, labels=labels, peering_config=peering_config, private_visibility_config=private_visibility_config, project=project, timeouts=timeouts, visibility=visibility, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DnsManagedZone, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="nameServers")
    def name_servers(self) -> typing.List[str]:
        return jsii.get(self, "nameServers")

    @builtins.property
    @jsii.member(jsii_name="dnsName")
    def dns_name(self) -> str:
        return jsii.get(self, "dnsName")

    @dns_name.setter
    def dns_name(self, value: str) -> None:
        jsii.set(self, "dnsName", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="dnssecConfig")
    def dnssec_config(self) -> typing.Optional[typing.List["DnsManagedZoneDnssecConfig"]]:
        return jsii.get(self, "dnssecConfig")

    @dnssec_config.setter
    def dnssec_config(self, value: typing.Optional[typing.List["DnsManagedZoneDnssecConfig"]]) -> None:
        jsii.set(self, "dnssecConfig", value)

    @builtins.property
    @jsii.member(jsii_name="forwardingConfig")
    def forwarding_config(self) -> typing.Optional[typing.List["DnsManagedZoneForwardingConfig"]]:
        return jsii.get(self, "forwardingConfig")

    @forwarding_config.setter
    def forwarding_config(self, value: typing.Optional[typing.List["DnsManagedZoneForwardingConfig"]]) -> None:
        jsii.set(self, "forwardingConfig", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="peeringConfig")
    def peering_config(self) -> typing.Optional[typing.List["DnsManagedZonePeeringConfig"]]:
        return jsii.get(self, "peeringConfig")

    @peering_config.setter
    def peering_config(self, value: typing.Optional[typing.List["DnsManagedZonePeeringConfig"]]) -> None:
        jsii.set(self, "peeringConfig", value)

    @builtins.property
    @jsii.member(jsii_name="privateVisibilityConfig")
    def private_visibility_config(self) -> typing.Optional[typing.List["DnsManagedZonePrivateVisibilityConfig"]]:
        return jsii.get(self, "privateVisibilityConfig")

    @private_visibility_config.setter
    def private_visibility_config(self, value: typing.Optional[typing.List["DnsManagedZonePrivateVisibilityConfig"]]) -> None:
        jsii.set(self, "privateVisibilityConfig", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DnsManagedZoneTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DnsManagedZoneTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="visibility")
    def visibility(self) -> typing.Optional[str]:
        return jsii.get(self, "visibility")

    @visibility.setter
    def visibility(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "visibility", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsManagedZoneConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dns_name': 'dnsName', 'name': 'name', 'description': 'description', 'dnssec_config': 'dnssecConfig', 'forwarding_config': 'forwardingConfig', 'labels': 'labels', 'peering_config': 'peeringConfig', 'private_visibility_config': 'privateVisibilityConfig', 'project': 'project', 'timeouts': 'timeouts', 'visibility': 'visibility'})
class DnsManagedZoneConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dns_name: str, name: str, description: typing.Optional[str]=None, dnssec_config: typing.Optional[typing.List["DnsManagedZoneDnssecConfig"]]=None, forwarding_config: typing.Optional[typing.List["DnsManagedZoneForwardingConfig"]]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, peering_config: typing.Optional[typing.List["DnsManagedZonePeeringConfig"]]=None, private_visibility_config: typing.Optional[typing.List["DnsManagedZonePrivateVisibilityConfig"]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["DnsManagedZoneTimeouts"]=None, visibility: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dns_name: The DNS name of this managed zone, for instance "example.com.".
        :param name: User assigned name for this resource. Must be unique within the project.
        :param description: A textual description field. Defaults to 'Managed by Terraform'.
        :param dnssec_config: dnssec_config block.
        :param forwarding_config: forwarding_config block.
        :param labels: A set of key/value label pairs to assign to this ManagedZone.
        :param peering_config: peering_config block.
        :param private_visibility_config: private_visibility_config block.
        :param project: 
        :param timeouts: timeouts block.
        :param visibility: The zone's visibility: public zones are exposed to the Internet, while private zones are visible only to Virtual Private Cloud resources. Default value: "public" Possible values: ["private", "public"]
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DnsManagedZoneTimeouts(**timeouts)
        self._values = {
            'dns_name': dns_name,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if dnssec_config is not None: self._values["dnssec_config"] = dnssec_config
        if forwarding_config is not None: self._values["forwarding_config"] = forwarding_config
        if labels is not None: self._values["labels"] = labels
        if peering_config is not None: self._values["peering_config"] = peering_config
        if private_visibility_config is not None: self._values["private_visibility_config"] = private_visibility_config
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if visibility is not None: self._values["visibility"] = visibility

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dns_name(self) -> str:
        """The DNS name of this managed zone, for instance "example.com."."""
        return self._values.get('dns_name')

    @builtins.property
    def name(self) -> str:
        """User assigned name for this resource.

        Must be unique within the project.
        """
        return self._values.get('name')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A textual description field.

        Defaults to 'Managed by Terraform'.
        """
        return self._values.get('description')

    @builtins.property
    def dnssec_config(self) -> typing.Optional[typing.List["DnsManagedZoneDnssecConfig"]]:
        """dnssec_config block."""
        return self._values.get('dnssec_config')

    @builtins.property
    def forwarding_config(self) -> typing.Optional[typing.List["DnsManagedZoneForwardingConfig"]]:
        """forwarding_config block."""
        return self._values.get('forwarding_config')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value label pairs to assign to this ManagedZone."""
        return self._values.get('labels')

    @builtins.property
    def peering_config(self) -> typing.Optional[typing.List["DnsManagedZonePeeringConfig"]]:
        """peering_config block."""
        return self._values.get('peering_config')

    @builtins.property
    def private_visibility_config(self) -> typing.Optional[typing.List["DnsManagedZonePrivateVisibilityConfig"]]:
        """private_visibility_config block."""
        return self._values.get('private_visibility_config')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["DnsManagedZoneTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def visibility(self) -> typing.Optional[str]:
        """The zone's visibility: public zones are exposed to the Internet, while private zones are visible only to Virtual Private Cloud resources.

        Default value: "public" Possible values: ["private", "public"]
        """
        return self._values.get('visibility')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsManagedZoneConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsManagedZoneDnssecConfig", jsii_struct_bases=[], name_mapping={'default_key_specs': 'defaultKeySpecs', 'kind': 'kind', 'non_existence': 'nonExistence', 'state': 'state'})
class DnsManagedZoneDnssecConfig():
    def __init__(self, *, default_key_specs: typing.Optional[typing.List["DnsManagedZoneDnssecConfigDefaultKeySpecs"]]=None, kind: typing.Optional[str]=None, non_existence: typing.Optional[str]=None, state: typing.Optional[str]=None) -> None:
        """
        :param default_key_specs: default_key_specs block.
        :param kind: Identifies what kind of resource this is.
        :param non_existence: Specifies the mechanism used to provide authenticated denial-of-existence responses. non_existence can only be updated when the state is 'off'. Possible values: ["nsec", "nsec3"]
        :param state: Specifies whether DNSSEC is enabled, and what mode it is in Possible values: ["off", "on", "transfer"].
        """
        self._values = {
        }
        if default_key_specs is not None: self._values["default_key_specs"] = default_key_specs
        if kind is not None: self._values["kind"] = kind
        if non_existence is not None: self._values["non_existence"] = non_existence
        if state is not None: self._values["state"] = state

    @builtins.property
    def default_key_specs(self) -> typing.Optional[typing.List["DnsManagedZoneDnssecConfigDefaultKeySpecs"]]:
        """default_key_specs block."""
        return self._values.get('default_key_specs')

    @builtins.property
    def kind(self) -> typing.Optional[str]:
        """Identifies what kind of resource this is."""
        return self._values.get('kind')

    @builtins.property
    def non_existence(self) -> typing.Optional[str]:
        """Specifies the mechanism used to provide authenticated denial-of-existence responses.

        non_existence can only be updated when the state is 'off'. Possible values: ["nsec", "nsec3"]
        """
        return self._values.get('non_existence')

    @builtins.property
    def state(self) -> typing.Optional[str]:
        """Specifies whether DNSSEC is enabled, and what mode it is in Possible values: ["off", "on", "transfer"]."""
        return self._values.get('state')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsManagedZoneDnssecConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsManagedZoneDnssecConfigDefaultKeySpecs", jsii_struct_bases=[], name_mapping={'algorithm': 'algorithm', 'key_length': 'keyLength', 'key_type': 'keyType', 'kind': 'kind'})
class DnsManagedZoneDnssecConfigDefaultKeySpecs():
    def __init__(self, *, algorithm: typing.Optional[str]=None, key_length: typing.Optional[jsii.Number]=None, key_type: typing.Optional[str]=None, kind: typing.Optional[str]=None) -> None:
        """
        :param algorithm: String mnemonic specifying the DNSSEC algorithm of this key Possible values: ["ecdsap256sha256", "ecdsap384sha384", "rsasha1", "rsasha256", "rsasha512"].
        :param key_length: Length of the keys in bits.
        :param key_type: Specifies whether this is a key signing key (KSK) or a zone signing key (ZSK). Key signing keys have the Secure Entry Point flag set and, when active, will only be used to sign resource record sets of type DNSKEY. Zone signing keys do not have the Secure Entry Point flag set and will be used to sign all other types of resource record sets. Possible values: ["keySigning", "zoneSigning"]
        :param kind: Identifies what kind of resource this is.
        """
        self._values = {
        }
        if algorithm is not None: self._values["algorithm"] = algorithm
        if key_length is not None: self._values["key_length"] = key_length
        if key_type is not None: self._values["key_type"] = key_type
        if kind is not None: self._values["kind"] = kind

    @builtins.property
    def algorithm(self) -> typing.Optional[str]:
        """String mnemonic specifying the DNSSEC algorithm of this key Possible values: ["ecdsap256sha256", "ecdsap384sha384", "rsasha1", "rsasha256", "rsasha512"]."""
        return self._values.get('algorithm')

    @builtins.property
    def key_length(self) -> typing.Optional[jsii.Number]:
        """Length of the keys in bits."""
        return self._values.get('key_length')

    @builtins.property
    def key_type(self) -> typing.Optional[str]:
        """Specifies whether this is a key signing key (KSK) or a zone signing key (ZSK).

        Key signing keys have the Secure Entry
        Point flag set and, when active, will only be used to sign
        resource record sets of type DNSKEY. Zone signing keys do
        not have the Secure Entry Point flag set and will be used
        to sign all other types of resource record sets. Possible values: ["keySigning", "zoneSigning"]
        """
        return self._values.get('key_type')

    @builtins.property
    def kind(self) -> typing.Optional[str]:
        """Identifies what kind of resource this is."""
        return self._values.get('kind')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsManagedZoneDnssecConfigDefaultKeySpecs(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsManagedZoneForwardingConfig", jsii_struct_bases=[], name_mapping={'target_name_servers': 'targetNameServers'})
class DnsManagedZoneForwardingConfig():
    def __init__(self, *, target_name_servers: typing.List["DnsManagedZoneForwardingConfigTargetNameServers"]) -> None:
        """
        :param target_name_servers: target_name_servers block.
        """
        self._values = {
            'target_name_servers': target_name_servers,
        }

    @builtins.property
    def target_name_servers(self) -> typing.List["DnsManagedZoneForwardingConfigTargetNameServers"]:
        """target_name_servers block."""
        return self._values.get('target_name_servers')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsManagedZoneForwardingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsManagedZoneForwardingConfigTargetNameServers", jsii_struct_bases=[], name_mapping={'ipv4_address': 'ipv4Address', 'forwarding_path': 'forwardingPath'})
class DnsManagedZoneForwardingConfigTargetNameServers():
    def __init__(self, *, ipv4_address: str, forwarding_path: typing.Optional[str]=None) -> None:
        """
        :param ipv4_address: IPv4 address of a target name server.
        :param forwarding_path: Forwarding path for this TargetNameServer. If unset or 'default' Cloud DNS will make forwarding decision based on address ranges, i.e. RFC1918 addresses go to the VPC, Non-RFC1918 addresses go to the Internet. When set to 'private', Cloud DNS will always send queries through VPC for this target Possible values: ["default", "private"]
        """
        self._values = {
            'ipv4_address': ipv4_address,
        }
        if forwarding_path is not None: self._values["forwarding_path"] = forwarding_path

    @builtins.property
    def ipv4_address(self) -> str:
        """IPv4 address of a target name server."""
        return self._values.get('ipv4_address')

    @builtins.property
    def forwarding_path(self) -> typing.Optional[str]:
        """Forwarding path for this TargetNameServer.

        If unset or 'default' Cloud DNS will make forwarding
        decision based on address ranges, i.e. RFC1918 addresses go to the VPC, Non-RFC1918 addresses go
        to the Internet. When set to 'private', Cloud DNS will always send queries through VPC for this target Possible values: ["default", "private"]
        """
        return self._values.get('forwarding_path')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsManagedZoneForwardingConfigTargetNameServers(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsManagedZonePeeringConfig", jsii_struct_bases=[], name_mapping={'target_network': 'targetNetwork'})
class DnsManagedZonePeeringConfig():
    def __init__(self, *, target_network: typing.List["DnsManagedZonePeeringConfigTargetNetwork"]) -> None:
        """
        :param target_network: target_network block.
        """
        self._values = {
            'target_network': target_network,
        }

    @builtins.property
    def target_network(self) -> typing.List["DnsManagedZonePeeringConfigTargetNetwork"]:
        """target_network block."""
        return self._values.get('target_network')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsManagedZonePeeringConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsManagedZonePeeringConfigTargetNetwork", jsii_struct_bases=[], name_mapping={'network_url': 'networkUrl'})
class DnsManagedZonePeeringConfigTargetNetwork():
    def __init__(self, *, network_url: str) -> None:
        """
        :param network_url: The id or fully qualified URL of the VPC network to forward queries to. This should be formatted like 'projects/{project}/global/networks/{network}' or 'https://www.googleapis.com/compute/v1/projects/{project}/global/networks/{network}'
        """
        self._values = {
            'network_url': network_url,
        }

    @builtins.property
    def network_url(self) -> str:
        """The id or fully qualified URL of the VPC network to forward queries to.

        This should be formatted like 'projects/{project}/global/networks/{network}' or
        'https://www.googleapis.com/compute/v1/projects/{project}/global/networks/{network}'
        """
        return self._values.get('network_url')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsManagedZonePeeringConfigTargetNetwork(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsManagedZonePrivateVisibilityConfig", jsii_struct_bases=[], name_mapping={'networks': 'networks'})
class DnsManagedZonePrivateVisibilityConfig():
    def __init__(self, *, networks: typing.List["DnsManagedZonePrivateVisibilityConfigNetworks"]) -> None:
        """
        :param networks: networks block.
        """
        self._values = {
            'networks': networks,
        }

    @builtins.property
    def networks(self) -> typing.List["DnsManagedZonePrivateVisibilityConfigNetworks"]:
        """networks block."""
        return self._values.get('networks')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsManagedZonePrivateVisibilityConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsManagedZonePrivateVisibilityConfigNetworks", jsii_struct_bases=[], name_mapping={'network_url': 'networkUrl'})
class DnsManagedZonePrivateVisibilityConfigNetworks():
    def __init__(self, *, network_url: str) -> None:
        """
        :param network_url: The id or fully qualified URL of the VPC network to bind to. This should be formatted like 'projects/{project}/global/networks/{network}' or 'https://www.googleapis.com/compute/v1/projects/{project}/global/networks/{network}'
        """
        self._values = {
            'network_url': network_url,
        }

    @builtins.property
    def network_url(self) -> str:
        """The id or fully qualified URL of the VPC network to bind to.

        This should be formatted like 'projects/{project}/global/networks/{network}' or
        'https://www.googleapis.com/compute/v1/projects/{project}/global/networks/{network}'
        """
        return self._values.get('network_url')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsManagedZonePrivateVisibilityConfigNetworks(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsManagedZoneTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class DnsManagedZoneTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsManagedZoneTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DnsPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DnsPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, alternative_name_server_config: typing.Optional[typing.List["DnsPolicyAlternativeNameServerConfig"]]=None, description: typing.Optional[str]=None, enable_inbound_forwarding: typing.Optional[bool]=None, enable_logging: typing.Optional[bool]=None, networks: typing.Optional[typing.List["DnsPolicyNetworks"]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["DnsPolicyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: User assigned name for this policy.
        :param alternative_name_server_config: alternative_name_server_config block.
        :param description: A textual description field. Defaults to 'Managed by Terraform'.
        :param enable_inbound_forwarding: Allows networks bound to this policy to receive DNS queries sent by VMs or applications over VPN connections. When enabled, a virtual IP address will be allocated from each of the sub-networks that are bound to this policy.
        :param enable_logging: Controls whether logging is enabled for the networks bound to this policy. Defaults to no logging if not set.
        :param networks: networks block.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsPolicyConfig(name=name, alternative_name_server_config=alternative_name_server_config, description=description, enable_inbound_forwarding=enable_inbound_forwarding, enable_logging=enable_logging, networks=networks, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DnsPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="alternativeNameServerConfig")
    def alternative_name_server_config(self) -> typing.Optional[typing.List["DnsPolicyAlternativeNameServerConfig"]]:
        return jsii.get(self, "alternativeNameServerConfig")

    @alternative_name_server_config.setter
    def alternative_name_server_config(self, value: typing.Optional[typing.List["DnsPolicyAlternativeNameServerConfig"]]) -> None:
        jsii.set(self, "alternativeNameServerConfig", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="enableInboundForwarding")
    def enable_inbound_forwarding(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableInboundForwarding")

    @enable_inbound_forwarding.setter
    def enable_inbound_forwarding(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableInboundForwarding", value)

    @builtins.property
    @jsii.member(jsii_name="enableLogging")
    def enable_logging(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableLogging")

    @enable_logging.setter
    def enable_logging(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableLogging", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="networks")
    def networks(self) -> typing.Optional[typing.List["DnsPolicyNetworks"]]:
        return jsii.get(self, "networks")

    @networks.setter
    def networks(self, value: typing.Optional[typing.List["DnsPolicyNetworks"]]) -> None:
        jsii.set(self, "networks", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["DnsPolicyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["DnsPolicyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsPolicyAlternativeNameServerConfig", jsii_struct_bases=[], name_mapping={'target_name_servers': 'targetNameServers'})
class DnsPolicyAlternativeNameServerConfig():
    def __init__(self, *, target_name_servers: typing.List["DnsPolicyAlternativeNameServerConfigTargetNameServers"]) -> None:
        """
        :param target_name_servers: target_name_servers block.
        """
        self._values = {
            'target_name_servers': target_name_servers,
        }

    @builtins.property
    def target_name_servers(self) -> typing.List["DnsPolicyAlternativeNameServerConfigTargetNameServers"]:
        """target_name_servers block."""
        return self._values.get('target_name_servers')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsPolicyAlternativeNameServerConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsPolicyAlternativeNameServerConfigTargetNameServers", jsii_struct_bases=[], name_mapping={'ipv4_address': 'ipv4Address'})
class DnsPolicyAlternativeNameServerConfigTargetNameServers():
    def __init__(self, *, ipv4_address: str) -> None:
        """
        :param ipv4_address: IPv4 address to forward to.
        """
        self._values = {
            'ipv4_address': ipv4_address,
        }

    @builtins.property
    def ipv4_address(self) -> str:
        """IPv4 address to forward to."""
        return self._values.get('ipv4_address')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsPolicyAlternativeNameServerConfigTargetNameServers(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'alternative_name_server_config': 'alternativeNameServerConfig', 'description': 'description', 'enable_inbound_forwarding': 'enableInboundForwarding', 'enable_logging': 'enableLogging', 'networks': 'networks', 'project': 'project', 'timeouts': 'timeouts'})
class DnsPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, alternative_name_server_config: typing.Optional[typing.List["DnsPolicyAlternativeNameServerConfig"]]=None, description: typing.Optional[str]=None, enable_inbound_forwarding: typing.Optional[bool]=None, enable_logging: typing.Optional[bool]=None, networks: typing.Optional[typing.List["DnsPolicyNetworks"]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["DnsPolicyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: User assigned name for this policy.
        :param alternative_name_server_config: alternative_name_server_config block.
        :param description: A textual description field. Defaults to 'Managed by Terraform'.
        :param enable_inbound_forwarding: Allows networks bound to this policy to receive DNS queries sent by VMs or applications over VPN connections. When enabled, a virtual IP address will be allocated from each of the sub-networks that are bound to this policy.
        :param enable_logging: Controls whether logging is enabled for the networks bound to this policy. Defaults to no logging if not set.
        :param networks: networks block.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = DnsPolicyTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if alternative_name_server_config is not None: self._values["alternative_name_server_config"] = alternative_name_server_config
        if description is not None: self._values["description"] = description
        if enable_inbound_forwarding is not None: self._values["enable_inbound_forwarding"] = enable_inbound_forwarding
        if enable_logging is not None: self._values["enable_logging"] = enable_logging
        if networks is not None: self._values["networks"] = networks
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """User assigned name for this policy."""
        return self._values.get('name')

    @builtins.property
    def alternative_name_server_config(self) -> typing.Optional[typing.List["DnsPolicyAlternativeNameServerConfig"]]:
        """alternative_name_server_config block."""
        return self._values.get('alternative_name_server_config')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A textual description field.

        Defaults to 'Managed by Terraform'.
        """
        return self._values.get('description')

    @builtins.property
    def enable_inbound_forwarding(self) -> typing.Optional[bool]:
        """Allows networks bound to this policy to receive DNS queries sent by VMs or applications over VPN connections.

        When enabled, a
        virtual IP address will be allocated from each of the sub-networks
        that are bound to this policy.
        """
        return self._values.get('enable_inbound_forwarding')

    @builtins.property
    def enable_logging(self) -> typing.Optional[bool]:
        """Controls whether logging is enabled for the networks bound to this policy.

        Defaults to no logging if not set.
        """
        return self._values.get('enable_logging')

    @builtins.property
    def networks(self) -> typing.Optional[typing.List["DnsPolicyNetworks"]]:
        """networks block."""
        return self._values.get('networks')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["DnsPolicyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsPolicyNetworks", jsii_struct_bases=[], name_mapping={'network_url': 'networkUrl'})
class DnsPolicyNetworks():
    def __init__(self, *, network_url: str) -> None:
        """
        :param network_url: The id or fully qualified URL of the VPC network to forward queries to. This should be formatted like 'projects/{project}/global/networks/{network}' or 'https://www.googleapis.com/compute/v1/projects/{project}/global/networks/{network}'
        """
        self._values = {
            'network_url': network_url,
        }

    @builtins.property
    def network_url(self) -> str:
        """The id or fully qualified URL of the VPC network to forward queries to.

        This should be formatted like 'projects/{project}/global/networks/{network}' or
        'https://www.googleapis.com/compute/v1/projects/{project}/global/networks/{network}'
        """
        return self._values.get('network_url')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsPolicyNetworks(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsPolicyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class DnsPolicyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsPolicyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class DnsRecordSet(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.DnsRecordSet"):
    def __init__(self, scope: constructs.Construct, id: str, *, managed_zone: str, name: str, rrdatas: typing.List[str], ttl: jsii.Number, type: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param managed_zone: The name of the zone in which this record set will reside.
        :param name: The DNS name this record set will apply to.
        :param rrdatas: The string data for the records in this record set whose meaning depends on the DNS type. For TXT record, if the string data contains spaces, add surrounding " if you don't want your string to get split on spaces. To specify a single record value longer than 255 characters such as a TXT record for DKIM, add "" inside the Terraform configuration string (e.g. "first255characters""morecharacters").
        :param ttl: The time-to-live of this record set (seconds).
        :param type: The DNS record set type.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = DnsRecordSetConfig(managed_zone=managed_zone, name=name, rrdatas=rrdatas, ttl=ttl, type=type, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(DnsRecordSet, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="managedZone")
    def managed_zone(self) -> str:
        return jsii.get(self, "managedZone")

    @managed_zone.setter
    def managed_zone(self, value: str) -> None:
        jsii.set(self, "managedZone", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="rrdatas")
    def rrdatas(self) -> typing.List[str]:
        return jsii.get(self, "rrdatas")

    @rrdatas.setter
    def rrdatas(self, value: typing.List[str]) -> None:
        jsii.set(self, "rrdatas", value)

    @builtins.property
    @jsii.member(jsii_name="ttl")
    def ttl(self) -> jsii.Number:
        return jsii.get(self, "ttl")

    @ttl.setter
    def ttl(self, value: jsii.Number) -> None:
        jsii.set(self, "ttl", value)

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")

    @type.setter
    def type(self, value: str) -> None:
        jsii.set(self, "type", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.DnsRecordSetConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'managed_zone': 'managedZone', 'name': 'name', 'rrdatas': 'rrdatas', 'ttl': 'ttl', 'type': 'type', 'project': 'project'})
class DnsRecordSetConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, managed_zone: str, name: str, rrdatas: typing.List[str], ttl: jsii.Number, type: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param managed_zone: The name of the zone in which this record set will reside.
        :param name: The DNS name this record set will apply to.
        :param rrdatas: The string data for the records in this record set whose meaning depends on the DNS type. For TXT record, if the string data contains spaces, add surrounding " if you don't want your string to get split on spaces. To specify a single record value longer than 255 characters such as a TXT record for DKIM, add "" inside the Terraform configuration string (e.g. "first255characters""morecharacters").
        :param ttl: The time-to-live of this record set (seconds).
        :param type: The DNS record set type.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'managed_zone': managed_zone,
            'name': name,
            'rrdatas': rrdatas,
            'ttl': ttl,
            'type': type,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def managed_zone(self) -> str:
        """The name of the zone in which this record set will reside."""
        return self._values.get('managed_zone')

    @builtins.property
    def name(self) -> str:
        """The DNS name this record set will apply to."""
        return self._values.get('name')

    @builtins.property
    def rrdatas(self) -> typing.List[str]:
        """The string data for the records in this record set whose meaning depends on the DNS type.

        For TXT record, if the string data contains spaces, add surrounding " if you don't want your string to get split on spaces. To specify a single record value longer than 255 characters such as a TXT record for DKIM, add "" inside the Terraform configuration string (e.g. "first255characters""morecharacters").
        """
        return self._values.get('rrdatas')

    @builtins.property
    def ttl(self) -> jsii.Number:
        """The time-to-live of this record set (seconds)."""
        return self._values.get('ttl')

    @builtins.property
    def type(self) -> str:
        """The DNS record set type."""
        return self._values.get('type')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'DnsRecordSetConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class EndpointsService(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.EndpointsService"):
    def __init__(self, scope: constructs.Construct, id: str, *, service_name: str, grpc_config: typing.Optional[str]=None, openapi_config: typing.Optional[str]=None, project: typing.Optional[str]=None, protoc_output_base64: typing.Optional[str]=None, timeouts: typing.Optional["EndpointsServiceTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param service_name: The name of the service. Usually of the form $apiname.endpoints.$projectid.cloud.goog.
        :param grpc_config: The full text of the Service Config YAML file (Example located here). If provided, must also provide protoc_output_base64. open_api config must not be provided.
        :param openapi_config: The full text of the OpenAPI YAML configuration as described here. Either this, or both of grpc_config and protoc_output_base64 must be specified.
        :param project: The project ID that the service belongs to. If not provided, provider project is used.
        :param protoc_output_base64: The full contents of the Service Descriptor File generated by protoc. This should be a compiled .pb file, base64-encoded.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EndpointsServiceConfig(service_name=service_name, grpc_config=grpc_config, openapi_config=openapi_config, project=project, protoc_output_base64=protoc_output_base64, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(EndpointsService, self, [scope, id, config])

    @jsii.member(jsii_name="apis")
    def apis(self, index: str) -> "EndpointsServiceApis":
        """
        :param index: -
        """
        return jsii.invoke(self, "apis", [index])

    @jsii.member(jsii_name="endpoints")
    def endpoints(self, index: str) -> "EndpointsServiceEndpoints":
        """
        :param index: -
        """
        return jsii.invoke(self, "endpoints", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="configId")
    def config_id(self) -> str:
        return jsii.get(self, "configId")

    @builtins.property
    @jsii.member(jsii_name="dnsAddress")
    def dns_address(self) -> str:
        return jsii.get(self, "dnsAddress")

    @builtins.property
    @jsii.member(jsii_name="serviceName")
    def service_name(self) -> str:
        return jsii.get(self, "serviceName")

    @service_name.setter
    def service_name(self, value: str) -> None:
        jsii.set(self, "serviceName", value)

    @builtins.property
    @jsii.member(jsii_name="grpcConfig")
    def grpc_config(self) -> typing.Optional[str]:
        return jsii.get(self, "grpcConfig")

    @grpc_config.setter
    def grpc_config(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "grpcConfig", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="openapiConfig")
    def openapi_config(self) -> typing.Optional[str]:
        return jsii.get(self, "openapiConfig")

    @openapi_config.setter
    def openapi_config(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "openapiConfig", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="protocOutputBase64")
    def protoc_output_base64(self) -> typing.Optional[str]:
        return jsii.get(self, "protocOutputBase64")

    @protoc_output_base64.setter
    def protoc_output_base64(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "protocOutputBase64", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["EndpointsServiceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["EndpointsServiceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


class EndpointsServiceApis(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.EndpointsServiceApis"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(EndpointsServiceApis, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="methods")
    def methods(self) -> typing.Any:
        return jsii.get(self, "methods")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="syntax")
    def syntax(self) -> str:
        return jsii.get(self, "syntax")

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> str:
        return jsii.get(self, "version")


class EndpointsServiceApisMethods(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.EndpointsServiceApisMethods"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(EndpointsServiceApisMethods, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="requestType")
    def request_type(self) -> str:
        return jsii.get(self, "requestType")

    @builtins.property
    @jsii.member(jsii_name="responseType")
    def response_type(self) -> str:
        return jsii.get(self, "responseType")

    @builtins.property
    @jsii.member(jsii_name="syntax")
    def syntax(self) -> str:
        return jsii.get(self, "syntax")


@jsii.data_type(jsii_type="@cdktf/provider-google.EndpointsServiceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'service_name': 'serviceName', 'grpc_config': 'grpcConfig', 'openapi_config': 'openapiConfig', 'project': 'project', 'protoc_output_base64': 'protocOutputBase64', 'timeouts': 'timeouts'})
class EndpointsServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, service_name: str, grpc_config: typing.Optional[str]=None, openapi_config: typing.Optional[str]=None, project: typing.Optional[str]=None, protoc_output_base64: typing.Optional[str]=None, timeouts: typing.Optional["EndpointsServiceTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param service_name: The name of the service. Usually of the form $apiname.endpoints.$projectid.cloud.goog.
        :param grpc_config: The full text of the Service Config YAML file (Example located here). If provided, must also provide protoc_output_base64. open_api config must not be provided.
        :param openapi_config: The full text of the OpenAPI YAML configuration as described here. Either this, or both of grpc_config and protoc_output_base64 must be specified.
        :param project: The project ID that the service belongs to. If not provided, provider project is used.
        :param protoc_output_base64: The full contents of the Service Descriptor File generated by protoc. This should be a compiled .pb file, base64-encoded.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = EndpointsServiceTimeouts(**timeouts)
        self._values = {
            'service_name': service_name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if grpc_config is not None: self._values["grpc_config"] = grpc_config
        if openapi_config is not None: self._values["openapi_config"] = openapi_config
        if project is not None: self._values["project"] = project
        if protoc_output_base64 is not None: self._values["protoc_output_base64"] = protoc_output_base64
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def service_name(self) -> str:
        """The name of the service.

        Usually of the form $apiname.endpoints.$projectid.cloud.goog.
        """
        return self._values.get('service_name')

    @builtins.property
    def grpc_config(self) -> typing.Optional[str]:
        """The full text of the Service Config YAML file (Example located here).

        If provided, must also provide protoc_output_base64. open_api config must not be provided.
        """
        return self._values.get('grpc_config')

    @builtins.property
    def openapi_config(self) -> typing.Optional[str]:
        """The full text of the OpenAPI YAML configuration as described here.

        Either this, or both of grpc_config and protoc_output_base64 must be specified.
        """
        return self._values.get('openapi_config')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The project ID that the service belongs to.

        If not provided, provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def protoc_output_base64(self) -> typing.Optional[str]:
        """The full contents of the Service Descriptor File generated by protoc.

        This should be a compiled .pb file, base64-encoded.
        """
        return self._values.get('protoc_output_base64')

    @builtins.property
    def timeouts(self) -> typing.Optional["EndpointsServiceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'EndpointsServiceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class EndpointsServiceEndpoints(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.EndpointsServiceEndpoints"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(EndpointsServiceEndpoints, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="address")
    def address(self) -> str:
        return jsii.get(self, "address")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")


class EndpointsServiceIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.EndpointsServiceIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], role: str, service_name: str, condition: typing.Optional[typing.List["EndpointsServiceIamBindingCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param role: 
        :param service_name: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EndpointsServiceIamBindingConfig(members=members, role=role, service_name=service_name, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(EndpointsServiceIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="serviceName")
    def service_name(self) -> str:
        return jsii.get(self, "serviceName")

    @service_name.setter
    def service_name(self, value: str) -> None:
        jsii.set(self, "serviceName", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["EndpointsServiceIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["EndpointsServiceIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.EndpointsServiceIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class EndpointsServiceIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'EndpointsServiceIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.EndpointsServiceIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'role': 'role', 'service_name': 'serviceName', 'condition': 'condition'})
class EndpointsServiceIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], role: str, service_name: str, condition: typing.Optional[typing.List["EndpointsServiceIamBindingCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param role: 
        :param service_name: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'role': role,
            'service_name': service_name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def service_name(self) -> str:
        return self._values.get('service_name')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["EndpointsServiceIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'EndpointsServiceIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class EndpointsServiceIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.EndpointsServiceIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, role: str, service_name: str, condition: typing.Optional[typing.List["EndpointsServiceIamMemberCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param role: 
        :param service_name: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EndpointsServiceIamMemberConfig(member=member, role=role, service_name=service_name, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(EndpointsServiceIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="serviceName")
    def service_name(self) -> str:
        return jsii.get(self, "serviceName")

    @service_name.setter
    def service_name(self, value: str) -> None:
        jsii.set(self, "serviceName", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["EndpointsServiceIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["EndpointsServiceIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.EndpointsServiceIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class EndpointsServiceIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'EndpointsServiceIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.EndpointsServiceIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'role': 'role', 'service_name': 'serviceName', 'condition': 'condition'})
class EndpointsServiceIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, role: str, service_name: str, condition: typing.Optional[typing.List["EndpointsServiceIamMemberCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param role: 
        :param service_name: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'role': role,
            'service_name': service_name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def service_name(self) -> str:
        return self._values.get('service_name')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["EndpointsServiceIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'EndpointsServiceIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class EndpointsServiceIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.EndpointsServiceIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_data: str, service_name: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_data: 
        :param service_name: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = EndpointsServiceIamPolicyConfig(policy_data=policy_data, service_name=service_name, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(EndpointsServiceIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="serviceName")
    def service_name(self) -> str:
        return jsii.get(self, "serviceName")

    @service_name.setter
    def service_name(self, value: str) -> None:
        jsii.set(self, "serviceName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.EndpointsServiceIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_data': 'policyData', 'service_name': 'serviceName'})
class EndpointsServiceIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_data: str, service_name: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_data: 
        :param service_name: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'policy_data': policy_data,
            'service_name': service_name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def service_name(self) -> str:
        return self._values.get('service_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'EndpointsServiceIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.EndpointsServiceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class EndpointsServiceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'EndpointsServiceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class FilestoreInstance(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.FilestoreInstance"):
    def __init__(self, scope: constructs.Construct, id: str, *, file_shares: typing.List["FilestoreInstanceFileShares"], name: str, networks: typing.List["FilestoreInstanceNetworks"], tier: str, zone: str, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["FilestoreInstanceTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param file_shares: file_shares block.
        :param name: The resource name of the instance.
        :param networks: networks block.
        :param tier: The service tier of the instance. Possible values: ["TIER_UNSPECIFIED", "STANDARD", "PREMIUM", "BASIC_HDD", "BASIC_SSD", "HIGH_SCALE_SSD"]
        :param zone: The name of the Filestore zone of the instance.
        :param description: A description of the instance.
        :param labels: Resource labels to represent user-provided metadata.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FilestoreInstanceConfig(file_shares=file_shares, name=name, networks=networks, tier=tier, zone=zone, description=description, labels=labels, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(FilestoreInstance, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="fileShares")
    def file_shares(self) -> typing.List["FilestoreInstanceFileShares"]:
        return jsii.get(self, "fileShares")

    @file_shares.setter
    def file_shares(self, value: typing.List["FilestoreInstanceFileShares"]) -> None:
        jsii.set(self, "fileShares", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="networks")
    def networks(self) -> typing.List["FilestoreInstanceNetworks"]:
        return jsii.get(self, "networks")

    @networks.setter
    def networks(self, value: typing.List["FilestoreInstanceNetworks"]) -> None:
        jsii.set(self, "networks", value)

    @builtins.property
    @jsii.member(jsii_name="tier")
    def tier(self) -> str:
        return jsii.get(self, "tier")

    @tier.setter
    def tier(self, value: str) -> None:
        jsii.set(self, "tier", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> str:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: str) -> None:
        jsii.set(self, "zone", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["FilestoreInstanceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["FilestoreInstanceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.FilestoreInstanceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'file_shares': 'fileShares', 'name': 'name', 'networks': 'networks', 'tier': 'tier', 'zone': 'zone', 'description': 'description', 'labels': 'labels', 'project': 'project', 'timeouts': 'timeouts'})
class FilestoreInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, file_shares: typing.List["FilestoreInstanceFileShares"], name: str, networks: typing.List["FilestoreInstanceNetworks"], tier: str, zone: str, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["FilestoreInstanceTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param file_shares: file_shares block.
        :param name: The resource name of the instance.
        :param networks: networks block.
        :param tier: The service tier of the instance. Possible values: ["TIER_UNSPECIFIED", "STANDARD", "PREMIUM", "BASIC_HDD", "BASIC_SSD", "HIGH_SCALE_SSD"]
        :param zone: The name of the Filestore zone of the instance.
        :param description: A description of the instance.
        :param labels: Resource labels to represent user-provided metadata.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = FilestoreInstanceTimeouts(**timeouts)
        self._values = {
            'file_shares': file_shares,
            'name': name,
            'networks': networks,
            'tier': tier,
            'zone': zone,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if labels is not None: self._values["labels"] = labels
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def file_shares(self) -> typing.List["FilestoreInstanceFileShares"]:
        """file_shares block."""
        return self._values.get('file_shares')

    @builtins.property
    def name(self) -> str:
        """The resource name of the instance."""
        return self._values.get('name')

    @builtins.property
    def networks(self) -> typing.List["FilestoreInstanceNetworks"]:
        """networks block."""
        return self._values.get('networks')

    @builtins.property
    def tier(self) -> str:
        """The service tier of the instance.

        Possible values: ["TIER_UNSPECIFIED", "STANDARD", "PREMIUM", "BASIC_HDD", "BASIC_SSD", "HIGH_SCALE_SSD"]
        """
        return self._values.get('tier')

    @builtins.property
    def zone(self) -> str:
        """The name of the Filestore zone of the instance."""
        return self._values.get('zone')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A description of the instance."""
        return self._values.get('description')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Resource labels to represent user-provided metadata."""
        return self._values.get('labels')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["FilestoreInstanceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FilestoreInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FilestoreInstanceFileShares", jsii_struct_bases=[], name_mapping={'capacity_gb': 'capacityGb', 'name': 'name'})
class FilestoreInstanceFileShares():
    def __init__(self, *, capacity_gb: jsii.Number, name: str) -> None:
        """
        :param capacity_gb: File share capacity in GiB. This must be at least 1024 GiB for the standard tier, or 2560 GiB for the premium tier.
        :param name: The name of the fileshare (16 characters or less).
        """
        self._values = {
            'capacity_gb': capacity_gb,
            'name': name,
        }

    @builtins.property
    def capacity_gb(self) -> jsii.Number:
        """File share capacity in GiB.

        This must be at least 1024 GiB
        for the standard tier, or 2560 GiB for the premium tier.
        """
        return self._values.get('capacity_gb')

    @builtins.property
    def name(self) -> str:
        """The name of the fileshare (16 characters or less)."""
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FilestoreInstanceFileShares(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FilestoreInstanceNetworks", jsii_struct_bases=[], name_mapping={'modes': 'modes', 'network': 'network', 'reserved_ip_range': 'reservedIpRange'})
class FilestoreInstanceNetworks():
    def __init__(self, *, modes: typing.List[str], network: str, reserved_ip_range: typing.Optional[str]=None) -> None:
        """
        :param modes: IP versions for which the instance has IP addresses assigned. Possible values: ["ADDRESS_MODE_UNSPECIFIED", "MODE_IPV4", "MODE_IPV6"]
        :param network: The name of the GCE VPC network to which the instance is connected.
        :param reserved_ip_range: A /29 CIDR block that identifies the range of IP addresses reserved for this instance.
        """
        self._values = {
            'modes': modes,
            'network': network,
        }
        if reserved_ip_range is not None: self._values["reserved_ip_range"] = reserved_ip_range

    @builtins.property
    def modes(self) -> typing.List[str]:
        """IP versions for which the instance has IP addresses assigned.

        Possible values: ["ADDRESS_MODE_UNSPECIFIED", "MODE_IPV4", "MODE_IPV6"]
        """
        return self._values.get('modes')

    @builtins.property
    def network(self) -> str:
        """The name of the GCE VPC network to which the instance is connected."""
        return self._values.get('network')

    @builtins.property
    def reserved_ip_range(self) -> typing.Optional[str]:
        """A /29 CIDR block that identifies the range of IP addresses reserved for this instance."""
        return self._values.get('reserved_ip_range')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FilestoreInstanceNetworks(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FilestoreInstanceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class FilestoreInstanceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FilestoreInstanceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class FirestoreIndex(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.FirestoreIndex"):
    def __init__(self, scope: constructs.Construct, id: str, *, collection: str, fields: typing.List["FirestoreIndexFields"], database: typing.Optional[str]=None, project: typing.Optional[str]=None, query_scope: typing.Optional[str]=None, timeouts: typing.Optional["FirestoreIndexTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param collection: The collection being indexed.
        :param fields: fields block.
        :param database: The Firestore database id. Defaults to '"(default)"'.
        :param project: 
        :param query_scope: The scope at which a query is run. Default value: "COLLECTION" Possible values: ["COLLECTION", "COLLECTION_GROUP"]
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FirestoreIndexConfig(collection=collection, fields=fields, database=database, project=project, query_scope=query_scope, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(FirestoreIndex, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="collection")
    def collection(self) -> str:
        return jsii.get(self, "collection")

    @collection.setter
    def collection(self, value: str) -> None:
        jsii.set(self, "collection", value)

    @builtins.property
    @jsii.member(jsii_name="fields")
    def fields(self) -> typing.List["FirestoreIndexFields"]:
        return jsii.get(self, "fields")

    @fields.setter
    def fields(self, value: typing.List["FirestoreIndexFields"]) -> None:
        jsii.set(self, "fields", value)

    @builtins.property
    @jsii.member(jsii_name="database")
    def database(self) -> typing.Optional[str]:
        return jsii.get(self, "database")

    @database.setter
    def database(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "database", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="queryScope")
    def query_scope(self) -> typing.Optional[str]:
        return jsii.get(self, "queryScope")

    @query_scope.setter
    def query_scope(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "queryScope", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["FirestoreIndexTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["FirestoreIndexTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.FirestoreIndexConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'collection': 'collection', 'fields': 'fields', 'database': 'database', 'project': 'project', 'query_scope': 'queryScope', 'timeouts': 'timeouts'})
class FirestoreIndexConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, collection: str, fields: typing.List["FirestoreIndexFields"], database: typing.Optional[str]=None, project: typing.Optional[str]=None, query_scope: typing.Optional[str]=None, timeouts: typing.Optional["FirestoreIndexTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param collection: The collection being indexed.
        :param fields: fields block.
        :param database: The Firestore database id. Defaults to '"(default)"'.
        :param project: 
        :param query_scope: The scope at which a query is run. Default value: "COLLECTION" Possible values: ["COLLECTION", "COLLECTION_GROUP"]
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = FirestoreIndexTimeouts(**timeouts)
        self._values = {
            'collection': collection,
            'fields': fields,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if database is not None: self._values["database"] = database
        if project is not None: self._values["project"] = project
        if query_scope is not None: self._values["query_scope"] = query_scope
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def collection(self) -> str:
        """The collection being indexed."""
        return self._values.get('collection')

    @builtins.property
    def fields(self) -> typing.List["FirestoreIndexFields"]:
        """fields block."""
        return self._values.get('fields')

    @builtins.property
    def database(self) -> typing.Optional[str]:
        """The Firestore database id.

        Defaults to '"(default)"'.
        """
        return self._values.get('database')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def query_scope(self) -> typing.Optional[str]:
        """The scope at which a query is run.

        Default value: "COLLECTION" Possible values: ["COLLECTION", "COLLECTION_GROUP"]
        """
        return self._values.get('query_scope')

    @builtins.property
    def timeouts(self) -> typing.Optional["FirestoreIndexTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FirestoreIndexConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FirestoreIndexFields", jsii_struct_bases=[], name_mapping={'array_config': 'arrayConfig', 'field_path': 'fieldPath', 'order': 'order'})
class FirestoreIndexFields():
    def __init__(self, *, array_config: typing.Optional[str]=None, field_path: typing.Optional[str]=None, order: typing.Optional[str]=None) -> None:
        """
        :param array_config: Indicates that this field supports operations on arrayValues. Only one of 'order' and 'arrayConfig' can be specified. Possible values: ["CONTAINS"]
        :param field_path: Name of the field.
        :param order: Indicates that this field supports ordering by the specified order or comparing using =, <, <=, >, >=. Only one of 'order' and 'arrayConfig' can be specified. Possible values: ["ASCENDING", "DESCENDING"]
        """
        self._values = {
        }
        if array_config is not None: self._values["array_config"] = array_config
        if field_path is not None: self._values["field_path"] = field_path
        if order is not None: self._values["order"] = order

    @builtins.property
    def array_config(self) -> typing.Optional[str]:
        """Indicates that this field supports operations on arrayValues.

        Only one of 'order' and 'arrayConfig' can
        be specified. Possible values: ["CONTAINS"]
        """
        return self._values.get('array_config')

    @builtins.property
    def field_path(self) -> typing.Optional[str]:
        """Name of the field."""
        return self._values.get('field_path')

    @builtins.property
    def order(self) -> typing.Optional[str]:
        """Indicates that this field supports ordering by the specified order or comparing using =, <, <=, >, >=.

        Only one of 'order' and 'arrayConfig' can be specified. Possible values: ["ASCENDING", "DESCENDING"]
        """
        return self._values.get('order')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FirestoreIndexFields(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FirestoreIndexTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class FirestoreIndexTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FirestoreIndexTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class Folder(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.Folder"):
    def __init__(self, scope: constructs.Construct, id: str, *, display_name: str, parent: str, timeouts: typing.Optional["FolderTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: The folder's display name. A folder's display name must be unique amongst its siblings, e.g. no two folders with the same parent can share the same display name. The display name must start and end with a letter or digit, may contain letters, digits, spaces, hyphens and underscores and can be no longer than 30 characters.
        :param parent: The resource name of the parent Folder or Organization. Must be of the form folders/{folder_id} or organizations/{org_id}.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FolderConfig(display_name=display_name, parent=parent, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(Folder, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="folderId")
    def folder_id(self) -> str:
        return jsii.get(self, "folderId")

    @builtins.property
    @jsii.member(jsii_name="lifecycleState")
    def lifecycle_state(self) -> str:
        return jsii.get(self, "lifecycleState")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="parent")
    def parent(self) -> str:
        return jsii.get(self, "parent")

    @parent.setter
    def parent(self, value: str) -> None:
        jsii.set(self, "parent", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["FolderTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["FolderTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'display_name': 'displayName', 'parent': 'parent', 'timeouts': 'timeouts'})
class FolderConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, display_name: str, parent: str, timeouts: typing.Optional["FolderTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: The folder's display name. A folder's display name must be unique amongst its siblings, e.g. no two folders with the same parent can share the same display name. The display name must start and end with a letter or digit, may contain letters, digits, spaces, hyphens and underscores and can be no longer than 30 characters.
        :param parent: The resource name of the parent Folder or Organization. Must be of the form folders/{folder_id} or organizations/{org_id}.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = FolderTimeouts(**timeouts)
        self._values = {
            'display_name': display_name,
            'parent': parent,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def display_name(self) -> str:
        """The folder's display name.

        A folder's display name must be unique amongst its siblings, e.g. no two folders with the same parent can share the same display name. The display name must start and end with a letter or digit, may contain letters, digits, spaces, hyphens and underscores and can be no longer than 30 characters.
        """
        return self._values.get('display_name')

    @builtins.property
    def parent(self) -> str:
        """The resource name of the parent Folder or Organization.

        Must be of the form folders/{folder_id} or organizations/{org_id}.
        """
        return self._values.get('parent')

    @builtins.property
    def timeouts(self) -> typing.Optional["FolderTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class FolderIamAuditConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.FolderIamAuditConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, audit_log_config: typing.List["FolderIamAuditConfigAuditLogConfig"], folder: str, service: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param audit_log_config: audit_log_config block.
        :param folder: 
        :param service: Service which will be enabled for audit logging. The special value allServices covers all services.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FolderIamAuditConfigConfig(audit_log_config=audit_log_config, folder=folder, service=service, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(FolderIamAuditConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="auditLogConfig")
    def audit_log_config(self) -> typing.List["FolderIamAuditConfigAuditLogConfig"]:
        return jsii.get(self, "auditLogConfig")

    @audit_log_config.setter
    def audit_log_config(self, value: typing.List["FolderIamAuditConfigAuditLogConfig"]) -> None:
        jsii.set(self, "auditLogConfig", value)

    @builtins.property
    @jsii.member(jsii_name="folder")
    def folder(self) -> str:
        return jsii.get(self, "folder")

    @folder.setter
    def folder(self, value: str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderIamAuditConfigAuditLogConfig", jsii_struct_bases=[], name_mapping={'log_type': 'logType', 'exempted_members': 'exemptedMembers'})
class FolderIamAuditConfigAuditLogConfig():
    def __init__(self, *, log_type: str, exempted_members: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param log_type: Permission type for which logging is to be configured. Must be one of DATA_READ, DATA_WRITE, or ADMIN_READ.
        :param exempted_members: Identities that do not cause logging for this type of permission. Each entry can have one of the following values:user:{emailid}: An email address that represents a specific Google account. For example, alice@gmail.com or joe@example.com. serviceAccount:{emailid}: An email address that represents a service account. For example, my-other-app@appspot.gserviceaccount.com. group:{emailid}: An email address that represents a Google group. For example, admins@example.com. domain:{domain}: A G Suite domain (primary, instead of alias) name that represents all the users of that domain. For example, google.com or example.com.
        """
        self._values = {
            'log_type': log_type,
        }
        if exempted_members is not None: self._values["exempted_members"] = exempted_members

    @builtins.property
    def log_type(self) -> str:
        """Permission type for which logging is to be configured.

        Must be one of DATA_READ, DATA_WRITE, or ADMIN_READ.
        """
        return self._values.get('log_type')

    @builtins.property
    def exempted_members(self) -> typing.Optional[typing.List[str]]:
        """Identities that do not cause logging for this type of permission.

        Each entry can have one of the following values:user:{emailid}: An email address that represents a specific Google account. For example, alice@gmail.com or joe@example.com. serviceAccount:{emailid}: An email address that represents a service account. For example, my-other-app@appspot.gserviceaccount.com. group:{emailid}: An email address that represents a Google group. For example, admins@example.com. domain:{domain}: A G Suite domain (primary, instead of alias) name that represents all the users of that domain. For example, google.com or example.com.
        """
        return self._values.get('exempted_members')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderIamAuditConfigAuditLogConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderIamAuditConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'audit_log_config': 'auditLogConfig', 'folder': 'folder', 'service': 'service'})
class FolderIamAuditConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, audit_log_config: typing.List["FolderIamAuditConfigAuditLogConfig"], folder: str, service: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param audit_log_config: audit_log_config block.
        :param folder: 
        :param service: Service which will be enabled for audit logging. The special value allServices covers all services.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'audit_log_config': audit_log_config,
            'folder': folder,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def audit_log_config(self) -> typing.List["FolderIamAuditConfigAuditLogConfig"]:
        """audit_log_config block."""
        return self._values.get('audit_log_config')

    @builtins.property
    def folder(self) -> str:
        return self._values.get('folder')

    @builtins.property
    def service(self) -> str:
        """Service which will be enabled for audit logging.

        The special value allServices covers all services.
        """
        return self._values.get('service')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderIamAuditConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class FolderIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.FolderIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, folder: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["FolderIamBindingCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param folder: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FolderIamBindingConfig(folder=folder, members=members, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(FolderIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="folder")
    def folder(self) -> str:
        return jsii.get(self, "folder")

    @folder.setter
    def folder(self, value: str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["FolderIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["FolderIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class FolderIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'folder': 'folder', 'members': 'members', 'role': 'role', 'condition': 'condition'})
class FolderIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, folder: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["FolderIamBindingCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param folder: 
        :param members: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'folder': folder,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def folder(self) -> str:
        return self._values.get('folder')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["FolderIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class FolderIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.FolderIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, folder: str, member: str, role: str, condition: typing.Optional[typing.List["FolderIamMemberCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param folder: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FolderIamMemberConfig(folder=folder, member=member, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(FolderIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="folder")
    def folder(self) -> str:
        return jsii.get(self, "folder")

    @folder.setter
    def folder(self, value: str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["FolderIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["FolderIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class FolderIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'folder': 'folder', 'member': 'member', 'role': 'role', 'condition': 'condition'})
class FolderIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, folder: str, member: str, role: str, condition: typing.Optional[typing.List["FolderIamMemberCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param folder: 
        :param member: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'folder': folder,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def folder(self) -> str:
        return self._values.get('folder')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["FolderIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class FolderIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.FolderIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, folder: str, policy_data: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param folder: 
        :param policy_data: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FolderIamPolicyConfig(folder=folder, policy_data=policy_data, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(FolderIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="folder")
    def folder(self) -> str:
        return jsii.get(self, "folder")

    @folder.setter
    def folder(self, value: str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'folder': 'folder', 'policy_data': 'policyData'})
class FolderIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, folder: str, policy_data: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param folder: 
        :param policy_data: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'folder': folder,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def folder(self) -> str:
        return self._values.get('folder')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class FolderOrganizationPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.FolderOrganizationPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, constraint: str, folder: str, boolean_policy: typing.Optional[typing.List["FolderOrganizationPolicyBooleanPolicy"]]=None, list_policy: typing.Optional[typing.List["FolderOrganizationPolicyListPolicy"]]=None, restore_policy: typing.Optional[typing.List["FolderOrganizationPolicyRestorePolicy"]]=None, timeouts: typing.Optional["FolderOrganizationPolicyTimeouts"]=None, version: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param constraint: The name of the Constraint the Policy is configuring, for example, serviceuser.services.
        :param folder: The resource name of the folder to set the policy for. Its format is folders/{folder_id}.
        :param boolean_policy: boolean_policy block.
        :param list_policy: list_policy block.
        :param restore_policy: restore_policy block.
        :param timeouts: timeouts block.
        :param version: Version of the Policy. Default version is 0.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = FolderOrganizationPolicyConfig(constraint=constraint, folder=folder, boolean_policy=boolean_policy, list_policy=list_policy, restore_policy=restore_policy, timeouts=timeouts, version=version, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(FolderOrganizationPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="updateTime")
    def update_time(self) -> str:
        return jsii.get(self, "updateTime")

    @builtins.property
    @jsii.member(jsii_name="constraint")
    def constraint(self) -> str:
        return jsii.get(self, "constraint")

    @constraint.setter
    def constraint(self, value: str) -> None:
        jsii.set(self, "constraint", value)

    @builtins.property
    @jsii.member(jsii_name="folder")
    def folder(self) -> str:
        return jsii.get(self, "folder")

    @folder.setter
    def folder(self, value: str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property
    @jsii.member(jsii_name="booleanPolicy")
    def boolean_policy(self) -> typing.Optional[typing.List["FolderOrganizationPolicyBooleanPolicy"]]:
        return jsii.get(self, "booleanPolicy")

    @boolean_policy.setter
    def boolean_policy(self, value: typing.Optional[typing.List["FolderOrganizationPolicyBooleanPolicy"]]) -> None:
        jsii.set(self, "booleanPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="listPolicy")
    def list_policy(self) -> typing.Optional[typing.List["FolderOrganizationPolicyListPolicy"]]:
        return jsii.get(self, "listPolicy")

    @list_policy.setter
    def list_policy(self, value: typing.Optional[typing.List["FolderOrganizationPolicyListPolicy"]]) -> None:
        jsii.set(self, "listPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="restorePolicy")
    def restore_policy(self) -> typing.Optional[typing.List["FolderOrganizationPolicyRestorePolicy"]]:
        return jsii.get(self, "restorePolicy")

    @restore_policy.setter
    def restore_policy(self, value: typing.Optional[typing.List["FolderOrganizationPolicyRestorePolicy"]]) -> None:
        jsii.set(self, "restorePolicy", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["FolderOrganizationPolicyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["FolderOrganizationPolicyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "version")

    @version.setter
    def version(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderOrganizationPolicyBooleanPolicy", jsii_struct_bases=[], name_mapping={'enforced': 'enforced'})
class FolderOrganizationPolicyBooleanPolicy():
    def __init__(self, *, enforced: bool) -> None:
        """
        :param enforced: If true, then the Policy is enforced. If false, then any configuration is acceptable.
        """
        self._values = {
            'enforced': enforced,
        }

    @builtins.property
    def enforced(self) -> bool:
        """If true, then the Policy is enforced.

        If false, then any configuration is acceptable.
        """
        return self._values.get('enforced')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderOrganizationPolicyBooleanPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderOrganizationPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'constraint': 'constraint', 'folder': 'folder', 'boolean_policy': 'booleanPolicy', 'list_policy': 'listPolicy', 'restore_policy': 'restorePolicy', 'timeouts': 'timeouts', 'version': 'version'})
class FolderOrganizationPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, constraint: str, folder: str, boolean_policy: typing.Optional[typing.List["FolderOrganizationPolicyBooleanPolicy"]]=None, list_policy: typing.Optional[typing.List["FolderOrganizationPolicyListPolicy"]]=None, restore_policy: typing.Optional[typing.List["FolderOrganizationPolicyRestorePolicy"]]=None, timeouts: typing.Optional["FolderOrganizationPolicyTimeouts"]=None, version: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param constraint: The name of the Constraint the Policy is configuring, for example, serviceuser.services.
        :param folder: The resource name of the folder to set the policy for. Its format is folders/{folder_id}.
        :param boolean_policy: boolean_policy block.
        :param list_policy: list_policy block.
        :param restore_policy: restore_policy block.
        :param timeouts: timeouts block.
        :param version: Version of the Policy. Default version is 0.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = FolderOrganizationPolicyTimeouts(**timeouts)
        self._values = {
            'constraint': constraint,
            'folder': folder,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if boolean_policy is not None: self._values["boolean_policy"] = boolean_policy
        if list_policy is not None: self._values["list_policy"] = list_policy
        if restore_policy is not None: self._values["restore_policy"] = restore_policy
        if timeouts is not None: self._values["timeouts"] = timeouts
        if version is not None: self._values["version"] = version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def constraint(self) -> str:
        """The name of the Constraint the Policy is configuring, for example, serviceuser.services."""
        return self._values.get('constraint')

    @builtins.property
    def folder(self) -> str:
        """The resource name of the folder to set the policy for.

        Its format is folders/{folder_id}.
        """
        return self._values.get('folder')

    @builtins.property
    def boolean_policy(self) -> typing.Optional[typing.List["FolderOrganizationPolicyBooleanPolicy"]]:
        """boolean_policy block."""
        return self._values.get('boolean_policy')

    @builtins.property
    def list_policy(self) -> typing.Optional[typing.List["FolderOrganizationPolicyListPolicy"]]:
        """list_policy block."""
        return self._values.get('list_policy')

    @builtins.property
    def restore_policy(self) -> typing.Optional[typing.List["FolderOrganizationPolicyRestorePolicy"]]:
        """restore_policy block."""
        return self._values.get('restore_policy')

    @builtins.property
    def timeouts(self) -> typing.Optional["FolderOrganizationPolicyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def version(self) -> typing.Optional[jsii.Number]:
        """Version of the Policy.

        Default version is 0.
        """
        return self._values.get('version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderOrganizationPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderOrganizationPolicyListPolicy", jsii_struct_bases=[], name_mapping={'allow': 'allow', 'deny': 'deny', 'inherit_from_parent': 'inheritFromParent', 'suggested_value': 'suggestedValue'})
class FolderOrganizationPolicyListPolicy():
    def __init__(self, *, allow: typing.Optional[typing.List["FolderOrganizationPolicyListPolicyAllow"]]=None, deny: typing.Optional[typing.List["FolderOrganizationPolicyListPolicyDeny"]]=None, inherit_from_parent: typing.Optional[bool]=None, suggested_value: typing.Optional[str]=None) -> None:
        """
        :param allow: allow block.
        :param deny: deny block.
        :param inherit_from_parent: If set to true, the values from the effective Policy of the parent resource are inherited, meaning the values set in this Policy are added to the values inherited up the hierarchy.
        :param suggested_value: The Google Cloud Console will try to default to a configuration that matches the value specified in this field.
        """
        self._values = {
        }
        if allow is not None: self._values["allow"] = allow
        if deny is not None: self._values["deny"] = deny
        if inherit_from_parent is not None: self._values["inherit_from_parent"] = inherit_from_parent
        if suggested_value is not None: self._values["suggested_value"] = suggested_value

    @builtins.property
    def allow(self) -> typing.Optional[typing.List["FolderOrganizationPolicyListPolicyAllow"]]:
        """allow block."""
        return self._values.get('allow')

    @builtins.property
    def deny(self) -> typing.Optional[typing.List["FolderOrganizationPolicyListPolicyDeny"]]:
        """deny block."""
        return self._values.get('deny')

    @builtins.property
    def inherit_from_parent(self) -> typing.Optional[bool]:
        """If set to true, the values from the effective Policy of the parent resource are inherited, meaning the values set in this Policy are added to the values inherited up the hierarchy."""
        return self._values.get('inherit_from_parent')

    @builtins.property
    def suggested_value(self) -> typing.Optional[str]:
        """The Google Cloud Console will try to default to a configuration that matches the value specified in this field."""
        return self._values.get('suggested_value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderOrganizationPolicyListPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderOrganizationPolicyListPolicyAllow", jsii_struct_bases=[], name_mapping={'all': 'all', 'values': 'values'})
class FolderOrganizationPolicyListPolicyAllow():
    def __init__(self, *, all: typing.Optional[bool]=None, values: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param all: The policy allows or denies all values.
        :param values: The policy can define specific values that are allowed or denied.
        """
        self._values = {
        }
        if all is not None: self._values["all"] = all
        if values is not None: self._values["values"] = values

    @builtins.property
    def all(self) -> typing.Optional[bool]:
        """The policy allows or denies all values."""
        return self._values.get('all')

    @builtins.property
    def values(self) -> typing.Optional[typing.List[str]]:
        """The policy can define specific values that are allowed or denied."""
        return self._values.get('values')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderOrganizationPolicyListPolicyAllow(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderOrganizationPolicyListPolicyDeny", jsii_struct_bases=[], name_mapping={'all': 'all', 'values': 'values'})
class FolderOrganizationPolicyListPolicyDeny():
    def __init__(self, *, all: typing.Optional[bool]=None, values: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param all: The policy allows or denies all values.
        :param values: The policy can define specific values that are allowed or denied.
        """
        self._values = {
        }
        if all is not None: self._values["all"] = all
        if values is not None: self._values["values"] = values

    @builtins.property
    def all(self) -> typing.Optional[bool]:
        """The policy allows or denies all values."""
        return self._values.get('all')

    @builtins.property
    def values(self) -> typing.Optional[typing.List[str]]:
        """The policy can define specific values that are allowed or denied."""
        return self._values.get('values')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderOrganizationPolicyListPolicyDeny(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderOrganizationPolicyRestorePolicy", jsii_struct_bases=[], name_mapping={'default': 'default'})
class FolderOrganizationPolicyRestorePolicy():
    def __init__(self, *, default: bool) -> None:
        """
        :param default: May only be set to true. If set, then the default Policy is restored.
        """
        self._values = {
            'default': default,
        }

    @builtins.property
    def default(self) -> bool:
        """May only be set to true.

        If set, then the default Policy is restored.
        """
        return self._values.get('default')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderOrganizationPolicyRestorePolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderOrganizationPolicyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'read': 'read', 'update': 'update'})
class FolderOrganizationPolicyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, read: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param read: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if read is not None: self._values["read"] = read
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def read(self) -> typing.Optional[str]:
        return self._values.get('read')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderOrganizationPolicyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.FolderTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'read': 'read', 'update': 'update'})
class FolderTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, read: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param read: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if read is not None: self._values["read"] = read
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def read(self) -> typing.Optional[str]:
        return self._values.get('read')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'FolderTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class GameServicesGameServerCluster(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.GameServicesGameServerCluster"):
    def __init__(self, scope: constructs.Construct, id: str, *, cluster_id: str, connection_info: typing.List["GameServicesGameServerClusterConnectionInfo"], realm_id: str, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["GameServicesGameServerClusterTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param cluster_id: Required. The resource name of the game server cluster
        :param connection_info: connection_info block.
        :param realm_id: The realm id of the game server realm.
        :param description: Human readable description of the cluster.
        :param labels: The labels associated with this game server cluster. Each label is a key-value pair.
        :param location: Location of the Cluster.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = GameServicesGameServerClusterConfig(cluster_id=cluster_id, connection_info=connection_info, realm_id=realm_id, description=description, labels=labels, location=location, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(GameServicesGameServerCluster, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="clusterId")
    def cluster_id(self) -> str:
        return jsii.get(self, "clusterId")

    @cluster_id.setter
    def cluster_id(self, value: str) -> None:
        jsii.set(self, "clusterId", value)

    @builtins.property
    @jsii.member(jsii_name="connectionInfo")
    def connection_info(self) -> typing.List["GameServicesGameServerClusterConnectionInfo"]:
        return jsii.get(self, "connectionInfo")

    @connection_info.setter
    def connection_info(self, value: typing.List["GameServicesGameServerClusterConnectionInfo"]) -> None:
        jsii.set(self, "connectionInfo", value)

    @builtins.property
    @jsii.member(jsii_name="realmId")
    def realm_id(self) -> str:
        return jsii.get(self, "realmId")

    @realm_id.setter
    def realm_id(self, value: str) -> None:
        jsii.set(self, "realmId", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["GameServicesGameServerClusterTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["GameServicesGameServerClusterTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerClusterConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'cluster_id': 'clusterId', 'connection_info': 'connectionInfo', 'realm_id': 'realmId', 'description': 'description', 'labels': 'labels', 'location': 'location', 'project': 'project', 'timeouts': 'timeouts'})
class GameServicesGameServerClusterConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, cluster_id: str, connection_info: typing.List["GameServicesGameServerClusterConnectionInfo"], realm_id: str, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["GameServicesGameServerClusterTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param cluster_id: Required. The resource name of the game server cluster
        :param connection_info: connection_info block.
        :param realm_id: The realm id of the game server realm.
        :param description: Human readable description of the cluster.
        :param labels: The labels associated with this game server cluster. Each label is a key-value pair.
        :param location: Location of the Cluster.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = GameServicesGameServerClusterTimeouts(**timeouts)
        self._values = {
            'cluster_id': cluster_id,
            'connection_info': connection_info,
            'realm_id': realm_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if labels is not None: self._values["labels"] = labels
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def cluster_id(self) -> str:
        """Required.

        The resource name of the game server cluster
        """
        return self._values.get('cluster_id')

    @builtins.property
    def connection_info(self) -> typing.List["GameServicesGameServerClusterConnectionInfo"]:
        """connection_info block."""
        return self._values.get('connection_info')

    @builtins.property
    def realm_id(self) -> str:
        """The realm id of the game server realm."""
        return self._values.get('realm_id')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Human readable description of the cluster."""
        return self._values.get('description')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """The labels associated with this game server cluster.

        Each label is a
        key-value pair.
        """
        return self._values.get('labels')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """Location of the Cluster."""
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["GameServicesGameServerClusterTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerClusterConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerClusterConnectionInfo", jsii_struct_bases=[], name_mapping={'gke_cluster_reference': 'gkeClusterReference', 'namespace': 'namespace'})
class GameServicesGameServerClusterConnectionInfo():
    def __init__(self, *, gke_cluster_reference: typing.List["GameServicesGameServerClusterConnectionInfoGkeClusterReference"], namespace: str) -> None:
        """
        :param gke_cluster_reference: gke_cluster_reference block.
        :param namespace: Namespace designated on the game server cluster where the game server instances will be created. The namespace existence will be validated during creation.
        """
        self._values = {
            'gke_cluster_reference': gke_cluster_reference,
            'namespace': namespace,
        }

    @builtins.property
    def gke_cluster_reference(self) -> typing.List["GameServicesGameServerClusterConnectionInfoGkeClusterReference"]:
        """gke_cluster_reference block."""
        return self._values.get('gke_cluster_reference')

    @builtins.property
    def namespace(self) -> str:
        """Namespace designated on the game server cluster where the game server instances will be created.

        The namespace existence will be validated
        during creation.
        """
        return self._values.get('namespace')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerClusterConnectionInfo(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerClusterConnectionInfoGkeClusterReference", jsii_struct_bases=[], name_mapping={'cluster': 'cluster'})
class GameServicesGameServerClusterConnectionInfoGkeClusterReference():
    def __init__(self, *, cluster: str) -> None:
        """
        :param cluster: The full or partial name of a GKE cluster, using one of the following forms:. 'projects/{project_id}/locations/{location}/clusters/{cluster_id}' 'locations/{location}/clusters/{cluster_id}' '{cluster_id}' If project and location are not specified, the project and location of the GameServerCluster resource are used to generate the full name of the GKE cluster.
        """
        self._values = {
            'cluster': cluster,
        }

    @builtins.property
    def cluster(self) -> str:
        """The full or partial name of a GKE cluster, using one of the following forms:.

        'projects/{project_id}/locations/{location}/clusters/{cluster_id}'
        'locations/{location}/clusters/{cluster_id}'
        '{cluster_id}'

        If project and location are not specified, the project and location of the
        GameServerCluster resource are used to generate the full name of the
        GKE cluster.
        """
        return self._values.get('cluster')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerClusterConnectionInfoGkeClusterReference(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerClusterTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class GameServicesGameServerClusterTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerClusterTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class GameServicesGameServerConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.GameServicesGameServerConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, config_id: str, deployment_id: str, fleet_configs: typing.List["GameServicesGameServerConfigFleetConfigs"], description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, scaling_configs: typing.Optional[typing.List["GameServicesGameServerConfigScalingConfigs"]]=None, timeouts: typing.Optional["GameServicesGameServerConfigTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param config_id: A unique id for the deployment config.
        :param deployment_id: A unique id for the deployment.
        :param fleet_configs: fleet_configs block.
        :param description: The description of the game server config.
        :param labels: The labels associated with this game server config. Each label is a key-value pair.
        :param location: Location of the Deployment.
        :param project: 
        :param scaling_configs: scaling_configs block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = GameServicesGameServerConfigConfig(config_id=config_id, deployment_id=deployment_id, fleet_configs=fleet_configs, description=description, labels=labels, location=location, project=project, scaling_configs=scaling_configs, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(GameServicesGameServerConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="configId")
    def config_id(self) -> str:
        return jsii.get(self, "configId")

    @config_id.setter
    def config_id(self, value: str) -> None:
        jsii.set(self, "configId", value)

    @builtins.property
    @jsii.member(jsii_name="deploymentId")
    def deployment_id(self) -> str:
        return jsii.get(self, "deploymentId")

    @deployment_id.setter
    def deployment_id(self, value: str) -> None:
        jsii.set(self, "deploymentId", value)

    @builtins.property
    @jsii.member(jsii_name="fleetConfigs")
    def fleet_configs(self) -> typing.List["GameServicesGameServerConfigFleetConfigs"]:
        return jsii.get(self, "fleetConfigs")

    @fleet_configs.setter
    def fleet_configs(self, value: typing.List["GameServicesGameServerConfigFleetConfigs"]) -> None:
        jsii.set(self, "fleetConfigs", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="scalingConfigs")
    def scaling_configs(self) -> typing.Optional[typing.List["GameServicesGameServerConfigScalingConfigs"]]:
        return jsii.get(self, "scalingConfigs")

    @scaling_configs.setter
    def scaling_configs(self, value: typing.Optional[typing.List["GameServicesGameServerConfigScalingConfigs"]]) -> None:
        jsii.set(self, "scalingConfigs", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["GameServicesGameServerConfigTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["GameServicesGameServerConfigTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'config_id': 'configId', 'deployment_id': 'deploymentId', 'fleet_configs': 'fleetConfigs', 'description': 'description', 'labels': 'labels', 'location': 'location', 'project': 'project', 'scaling_configs': 'scalingConfigs', 'timeouts': 'timeouts'})
class GameServicesGameServerConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, config_id: str, deployment_id: str, fleet_configs: typing.List["GameServicesGameServerConfigFleetConfigs"], description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, scaling_configs: typing.Optional[typing.List["GameServicesGameServerConfigScalingConfigs"]]=None, timeouts: typing.Optional["GameServicesGameServerConfigTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param config_id: A unique id for the deployment config.
        :param deployment_id: A unique id for the deployment.
        :param fleet_configs: fleet_configs block.
        :param description: The description of the game server config.
        :param labels: The labels associated with this game server config. Each label is a key-value pair.
        :param location: Location of the Deployment.
        :param project: 
        :param scaling_configs: scaling_configs block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = GameServicesGameServerConfigTimeouts(**timeouts)
        self._values = {
            'config_id': config_id,
            'deployment_id': deployment_id,
            'fleet_configs': fleet_configs,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if labels is not None: self._values["labels"] = labels
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project
        if scaling_configs is not None: self._values["scaling_configs"] = scaling_configs
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def config_id(self) -> str:
        """A unique id for the deployment config."""
        return self._values.get('config_id')

    @builtins.property
    def deployment_id(self) -> str:
        """A unique id for the deployment."""
        return self._values.get('deployment_id')

    @builtins.property
    def fleet_configs(self) -> typing.List["GameServicesGameServerConfigFleetConfigs"]:
        """fleet_configs block."""
        return self._values.get('fleet_configs')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """The description of the game server config."""
        return self._values.get('description')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """The labels associated with this game server config.

        Each label is a
        key-value pair.
        """
        return self._values.get('labels')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """Location of the Deployment."""
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def scaling_configs(self) -> typing.Optional[typing.List["GameServicesGameServerConfigScalingConfigs"]]:
        """scaling_configs block."""
        return self._values.get('scaling_configs')

    @builtins.property
    def timeouts(self) -> typing.Optional["GameServicesGameServerConfigTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerConfigFleetConfigs", jsii_struct_bases=[], name_mapping={'fleet_spec': 'fleetSpec', 'name': 'name'})
class GameServicesGameServerConfigFleetConfigs():
    def __init__(self, *, fleet_spec: str, name: typing.Optional[str]=None) -> None:
        """
        :param fleet_spec: The fleet spec, which is sent to Agones to configure fleet. The spec can be passed as inline json but it is recommended to use a file reference instead. File references can contain the json or yaml format of the fleet spec. Eg: fleet_spec = jsonencode(yamldecode(file("fleet_configs.yaml"))) fleet_spec = file("fleet_configs.json") The format of the spec can be found : 'https://agones.dev/site/docs/reference/fleet/'.
        :param name: The name of the FleetConfig.
        """
        self._values = {
            'fleet_spec': fleet_spec,
        }
        if name is not None: self._values["name"] = name

    @builtins.property
    def fleet_spec(self) -> str:
        """The fleet spec, which is sent to Agones to configure fleet.

        The spec can be passed as inline json but it is recommended to use a file reference
        instead. File references can contain the json or yaml format of the fleet spec. Eg:

        fleet_spec = jsonencode(yamldecode(file("fleet_configs.yaml")))
        fleet_spec = file("fleet_configs.json")

        The format of the spec can be found :
        'https://agones.dev/site/docs/reference/fleet/'.
        """
        return self._values.get('fleet_spec')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """The name of the FleetConfig."""
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerConfigFleetConfigs(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerConfigScalingConfigs", jsii_struct_bases=[], name_mapping={'fleet_autoscaler_spec': 'fleetAutoscalerSpec', 'name': 'name', 'schedules': 'schedules', 'selectors': 'selectors'})
class GameServicesGameServerConfigScalingConfigs():
    def __init__(self, *, fleet_autoscaler_spec: str, name: str, schedules: typing.Optional[typing.List["GameServicesGameServerConfigScalingConfigsSchedules"]]=None, selectors: typing.Optional[typing.List["GameServicesGameServerConfigScalingConfigsSelectors"]]=None) -> None:
        """
        :param fleet_autoscaler_spec: Fleet autoscaler spec, which is sent to Agones. Example spec can be found : https://agones.dev/site/docs/reference/fleetautoscaler/
        :param name: The name of the ScalingConfig.
        :param schedules: schedules block.
        :param selectors: selectors block.
        """
        self._values = {
            'fleet_autoscaler_spec': fleet_autoscaler_spec,
            'name': name,
        }
        if schedules is not None: self._values["schedules"] = schedules
        if selectors is not None: self._values["selectors"] = selectors

    @builtins.property
    def fleet_autoscaler_spec(self) -> str:
        """Fleet autoscaler spec, which is sent to Agones.

        Example spec can be found :
        https://agones.dev/site/docs/reference/fleetautoscaler/
        """
        return self._values.get('fleet_autoscaler_spec')

    @builtins.property
    def name(self) -> str:
        """The name of the ScalingConfig."""
        return self._values.get('name')

    @builtins.property
    def schedules(self) -> typing.Optional[typing.List["GameServicesGameServerConfigScalingConfigsSchedules"]]:
        """schedules block."""
        return self._values.get('schedules')

    @builtins.property
    def selectors(self) -> typing.Optional[typing.List["GameServicesGameServerConfigScalingConfigsSelectors"]]:
        """selectors block."""
        return self._values.get('selectors')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerConfigScalingConfigs(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerConfigScalingConfigsSchedules", jsii_struct_bases=[], name_mapping={'cron_job_duration': 'cronJobDuration', 'cron_spec': 'cronSpec', 'end_time': 'endTime', 'start_time': 'startTime'})
class GameServicesGameServerConfigScalingConfigsSchedules():
    def __init__(self, *, cron_job_duration: typing.Optional[str]=None, cron_spec: typing.Optional[str]=None, end_time: typing.Optional[str]=None, start_time: typing.Optional[str]=None) -> None:
        """
        :param cron_job_duration: The duration for the cron job event. The duration of the event is effective after the cron job's start time. A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s".
        :param cron_spec: The cron definition of the scheduled event. See https://en.wikipedia.org/wiki/Cron. Cron spec specifies the local time as defined by the realm.
        :param end_time: The end time of the event. A timestamp in RFC3339 UTC "Zulu" format, accurate to nanoseconds. Example: "2014-10-02T15:01:23.045123456Z".
        :param start_time: The start time of the event. A timestamp in RFC3339 UTC "Zulu" format, accurate to nanoseconds. Example: "2014-10-02T15:01:23.045123456Z".
        """
        self._values = {
        }
        if cron_job_duration is not None: self._values["cron_job_duration"] = cron_job_duration
        if cron_spec is not None: self._values["cron_spec"] = cron_spec
        if end_time is not None: self._values["end_time"] = end_time
        if start_time is not None: self._values["start_time"] = start_time

    @builtins.property
    def cron_job_duration(self) -> typing.Optional[str]:
        """The duration for the cron job event. The duration of the event is effective after the cron job's start time.

        A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s".
        """
        return self._values.get('cron_job_duration')

    @builtins.property
    def cron_spec(self) -> typing.Optional[str]:
        """The cron definition of the scheduled event.

        See
        https://en.wikipedia.org/wiki/Cron. Cron spec specifies the local time as
        defined by the realm.
        """
        return self._values.get('cron_spec')

    @builtins.property
    def end_time(self) -> typing.Optional[str]:
        """The end time of the event.

        A timestamp in RFC3339 UTC "Zulu" format, accurate to nanoseconds. Example: "2014-10-02T15:01:23.045123456Z".
        """
        return self._values.get('end_time')

    @builtins.property
    def start_time(self) -> typing.Optional[str]:
        """The start time of the event.

        A timestamp in RFC3339 UTC "Zulu" format, accurate to nanoseconds. Example: "2014-10-02T15:01:23.045123456Z".
        """
        return self._values.get('start_time')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerConfigScalingConfigsSchedules(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerConfigScalingConfigsSelectors", jsii_struct_bases=[], name_mapping={'labels': 'labels'})
class GameServicesGameServerConfigScalingConfigsSelectors():
    def __init__(self, *, labels: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param labels: Set of labels to group by.
        """
        self._values = {
        }
        if labels is not None: self._values["labels"] = labels

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Set of labels to group by."""
        return self._values.get('labels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerConfigScalingConfigsSelectors(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerConfigTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class GameServicesGameServerConfigTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerConfigTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class GameServicesGameServerDeployment(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.GameServicesGameServerDeployment"):
    def __init__(self, scope: constructs.Construct, id: str, *, deployment_id: str, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["GameServicesGameServerDeploymentTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param deployment_id: A unique id for the deployment.
        :param description: Human readable description of the game server deployment.
        :param labels: The labels associated with this game server deployment. Each label is a key-value pair.
        :param location: Location of the Deployment.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = GameServicesGameServerDeploymentConfig(deployment_id=deployment_id, description=description, labels=labels, location=location, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(GameServicesGameServerDeployment, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="deploymentId")
    def deployment_id(self) -> str:
        return jsii.get(self, "deploymentId")

    @deployment_id.setter
    def deployment_id(self, value: str) -> None:
        jsii.set(self, "deploymentId", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["GameServicesGameServerDeploymentTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["GameServicesGameServerDeploymentTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerDeploymentConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'deployment_id': 'deploymentId', 'description': 'description', 'labels': 'labels', 'location': 'location', 'project': 'project', 'timeouts': 'timeouts'})
class GameServicesGameServerDeploymentConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, deployment_id: str, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["GameServicesGameServerDeploymentTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param deployment_id: A unique id for the deployment.
        :param description: Human readable description of the game server deployment.
        :param labels: The labels associated with this game server deployment. Each label is a key-value pair.
        :param location: Location of the Deployment.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = GameServicesGameServerDeploymentTimeouts(**timeouts)
        self._values = {
            'deployment_id': deployment_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if labels is not None: self._values["labels"] = labels
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def deployment_id(self) -> str:
        """A unique id for the deployment."""
        return self._values.get('deployment_id')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Human readable description of the game server deployment."""
        return self._values.get('description')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """The labels associated with this game server deployment.

        Each label is a
        key-value pair.
        """
        return self._values.get('labels')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """Location of the Deployment."""
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["GameServicesGameServerDeploymentTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerDeploymentConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class GameServicesGameServerDeploymentRollout(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.GameServicesGameServerDeploymentRollout"):
    def __init__(self, scope: constructs.Construct, id: str, *, default_game_server_config: str, deployment_id: str, game_server_config_overrides: typing.Optional[typing.List["GameServicesGameServerDeploymentRolloutGameServerConfigOverrides"]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["GameServicesGameServerDeploymentRolloutTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param default_game_server_config: This field points to the game server config that is applied by default to all realms and clusters. For example,. 'projects/my-project/locations/global/gameServerDeployments/my-game/configs/my-config'.
        :param deployment_id: The deployment to rollout the new config to. Only 1 rollout must be associated with each deployment.
        :param game_server_config_overrides: game_server_config_overrides block.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = GameServicesGameServerDeploymentRolloutConfig(default_game_server_config=default_game_server_config, deployment_id=deployment_id, game_server_config_overrides=game_server_config_overrides, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(GameServicesGameServerDeploymentRollout, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="defaultGameServerConfig")
    def default_game_server_config(self) -> str:
        return jsii.get(self, "defaultGameServerConfig")

    @default_game_server_config.setter
    def default_game_server_config(self, value: str) -> None:
        jsii.set(self, "defaultGameServerConfig", value)

    @builtins.property
    @jsii.member(jsii_name="deploymentId")
    def deployment_id(self) -> str:
        return jsii.get(self, "deploymentId")

    @deployment_id.setter
    def deployment_id(self, value: str) -> None:
        jsii.set(self, "deploymentId", value)

    @builtins.property
    @jsii.member(jsii_name="gameServerConfigOverrides")
    def game_server_config_overrides(self) -> typing.Optional[typing.List["GameServicesGameServerDeploymentRolloutGameServerConfigOverrides"]]:
        return jsii.get(self, "gameServerConfigOverrides")

    @game_server_config_overrides.setter
    def game_server_config_overrides(self, value: typing.Optional[typing.List["GameServicesGameServerDeploymentRolloutGameServerConfigOverrides"]]) -> None:
        jsii.set(self, "gameServerConfigOverrides", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["GameServicesGameServerDeploymentRolloutTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["GameServicesGameServerDeploymentRolloutTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerDeploymentRolloutConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'default_game_server_config': 'defaultGameServerConfig', 'deployment_id': 'deploymentId', 'game_server_config_overrides': 'gameServerConfigOverrides', 'project': 'project', 'timeouts': 'timeouts'})
class GameServicesGameServerDeploymentRolloutConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, default_game_server_config: str, deployment_id: str, game_server_config_overrides: typing.Optional[typing.List["GameServicesGameServerDeploymentRolloutGameServerConfigOverrides"]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["GameServicesGameServerDeploymentRolloutTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param default_game_server_config: This field points to the game server config that is applied by default to all realms and clusters. For example,. 'projects/my-project/locations/global/gameServerDeployments/my-game/configs/my-config'.
        :param deployment_id: The deployment to rollout the new config to. Only 1 rollout must be associated with each deployment.
        :param game_server_config_overrides: game_server_config_overrides block.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = GameServicesGameServerDeploymentRolloutTimeouts(**timeouts)
        self._values = {
            'default_game_server_config': default_game_server_config,
            'deployment_id': deployment_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if game_server_config_overrides is not None: self._values["game_server_config_overrides"] = game_server_config_overrides
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def default_game_server_config(self) -> str:
        """This field points to the game server config that is applied by default to all realms and clusters. For example,.

        'projects/my-project/locations/global/gameServerDeployments/my-game/configs/my-config'.
        """
        return self._values.get('default_game_server_config')

    @builtins.property
    def deployment_id(self) -> str:
        """The deployment to rollout the new config to.

        Only 1 rollout must be associated with each deployment.
        """
        return self._values.get('deployment_id')

    @builtins.property
    def game_server_config_overrides(self) -> typing.Optional[typing.List["GameServicesGameServerDeploymentRolloutGameServerConfigOverrides"]]:
        """game_server_config_overrides block."""
        return self._values.get('game_server_config_overrides')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["GameServicesGameServerDeploymentRolloutTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerDeploymentRolloutConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerDeploymentRolloutGameServerConfigOverrides", jsii_struct_bases=[], name_mapping={'config_version': 'configVersion', 'realms_selector': 'realmsSelector'})
class GameServicesGameServerDeploymentRolloutGameServerConfigOverrides():
    def __init__(self, *, config_version: typing.Optional[str]=None, realms_selector: typing.Optional[typing.List["GameServicesGameServerDeploymentRolloutGameServerConfigOverridesRealmsSelector"]]=None) -> None:
        """
        :param config_version: Version of the configuration.
        :param realms_selector: realms_selector block.
        """
        self._values = {
        }
        if config_version is not None: self._values["config_version"] = config_version
        if realms_selector is not None: self._values["realms_selector"] = realms_selector

    @builtins.property
    def config_version(self) -> typing.Optional[str]:
        """Version of the configuration."""
        return self._values.get('config_version')

    @builtins.property
    def realms_selector(self) -> typing.Optional[typing.List["GameServicesGameServerDeploymentRolloutGameServerConfigOverridesRealmsSelector"]]:
        """realms_selector block."""
        return self._values.get('realms_selector')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerDeploymentRolloutGameServerConfigOverrides(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerDeploymentRolloutGameServerConfigOverridesRealmsSelector", jsii_struct_bases=[], name_mapping={'realms': 'realms'})
class GameServicesGameServerDeploymentRolloutGameServerConfigOverridesRealmsSelector():
    def __init__(self, *, realms: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param realms: List of realms to match against.
        """
        self._values = {
        }
        if realms is not None: self._values["realms"] = realms

    @builtins.property
    def realms(self) -> typing.Optional[typing.List[str]]:
        """List of realms to match against."""
        return self._values.get('realms')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerDeploymentRolloutGameServerConfigOverridesRealmsSelector(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerDeploymentRolloutTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class GameServicesGameServerDeploymentRolloutTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerDeploymentRolloutTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesGameServerDeploymentTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class GameServicesGameServerDeploymentTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesGameServerDeploymentTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class GameServicesRealm(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.GameServicesRealm"):
    def __init__(self, scope: constructs.Construct, id: str, *, realm_id: str, time_zone: str, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["GameServicesRealmTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param realm_id: GCP region of the Realm.
        :param time_zone: Required. Time zone where all realm-specific policies are evaluated. The value of this field must be from the IANA time zone database: https://www.iana.org/time-zones.
        :param description: Human readable description of the realm.
        :param labels: The labels associated with this realm. Each label is a key-value pair.
        :param location: Location of the Realm.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = GameServicesRealmConfig(realm_id=realm_id, time_zone=time_zone, description=description, labels=labels, location=location, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(GameServicesRealm, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="realmId")
    def realm_id(self) -> str:
        return jsii.get(self, "realmId")

    @realm_id.setter
    def realm_id(self, value: str) -> None:
        jsii.set(self, "realmId", value)

    @builtins.property
    @jsii.member(jsii_name="timeZone")
    def time_zone(self) -> str:
        return jsii.get(self, "timeZone")

    @time_zone.setter
    def time_zone(self, value: str) -> None:
        jsii.set(self, "timeZone", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["GameServicesRealmTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["GameServicesRealmTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesRealmConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'realm_id': 'realmId', 'time_zone': 'timeZone', 'description': 'description', 'labels': 'labels', 'location': 'location', 'project': 'project', 'timeouts': 'timeouts'})
class GameServicesRealmConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, realm_id: str, time_zone: str, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, location: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["GameServicesRealmTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param realm_id: GCP region of the Realm.
        :param time_zone: Required. Time zone where all realm-specific policies are evaluated. The value of this field must be from the IANA time zone database: https://www.iana.org/time-zones.
        :param description: Human readable description of the realm.
        :param labels: The labels associated with this realm. Each label is a key-value pair.
        :param location: Location of the Realm.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = GameServicesRealmTimeouts(**timeouts)
        self._values = {
            'realm_id': realm_id,
            'time_zone': time_zone,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if labels is not None: self._values["labels"] = labels
        if location is not None: self._values["location"] = location
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def realm_id(self) -> str:
        """GCP region of the Realm."""
        return self._values.get('realm_id')

    @builtins.property
    def time_zone(self) -> str:
        """Required.

        Time zone where all realm-specific policies are evaluated. The value of
        this field must be from the IANA time zone database:
        https://www.iana.org/time-zones.
        """
        return self._values.get('time_zone')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Human readable description of the realm."""
        return self._values.get('description')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """The labels associated with this realm.

        Each label is a key-value pair.
        """
        return self._values.get('labels')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """Location of the Realm."""
        return self._values.get('location')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["GameServicesRealmTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesRealmConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GameServicesRealmTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class GameServicesRealmTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GameServicesRealmTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class GoogleProvider(cdktf.TerraformProvider, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.GoogleProvider"):
    def __init__(self, scope: constructs.Construct, id: str, *, access_context_manager_custom_endpoint: typing.Optional[str]=None, access_token: typing.Optional[str]=None, active_directory_custom_endpoint: typing.Optional[str]=None, alias: typing.Optional[str]=None, app_engine_custom_endpoint: typing.Optional[str]=None, batching: typing.Optional[typing.List["GoogleProviderBatching"]]=None, big_query_custom_endpoint: typing.Optional[str]=None, bigquery_data_transfer_custom_endpoint: typing.Optional[str]=None, bigtable_custom_endpoint: typing.Optional[str]=None, binary_authorization_custom_endpoint: typing.Optional[str]=None, cloud_asset_custom_endpoint: typing.Optional[str]=None, cloud_billing_custom_endpoint: typing.Optional[str]=None, cloud_build_custom_endpoint: typing.Optional[str]=None, cloud_functions_custom_endpoint: typing.Optional[str]=None, cloud_iot_custom_endpoint: typing.Optional[str]=None, cloud_run_custom_endpoint: typing.Optional[str]=None, cloud_scheduler_custom_endpoint: typing.Optional[str]=None, cloud_tasks_custom_endpoint: typing.Optional[str]=None, composer_custom_endpoint: typing.Optional[str]=None, compute_beta_custom_endpoint: typing.Optional[str]=None, compute_custom_endpoint: typing.Optional[str]=None, container_analysis_custom_endpoint: typing.Optional[str]=None, container_beta_custom_endpoint: typing.Optional[str]=None, container_custom_endpoint: typing.Optional[str]=None, credentials: typing.Optional[str]=None, data_catalog_custom_endpoint: typing.Optional[str]=None, dataflow_custom_endpoint: typing.Optional[str]=None, dataproc_beta_custom_endpoint: typing.Optional[str]=None, dataproc_custom_endpoint: typing.Optional[str]=None, datastore_custom_endpoint: typing.Optional[str]=None, deployment_manager_custom_endpoint: typing.Optional[str]=None, dialogflow_custom_endpoint: typing.Optional[str]=None, dns_beta_custom_endpoint: typing.Optional[str]=None, dns_custom_endpoint: typing.Optional[str]=None, filestore_custom_endpoint: typing.Optional[str]=None, firestore_custom_endpoint: typing.Optional[str]=None, game_services_custom_endpoint: typing.Optional[str]=None, healthcare_custom_endpoint: typing.Optional[str]=None, iam_credentials_custom_endpoint: typing.Optional[str]=None, iam_custom_endpoint: typing.Optional[str]=None, iap_custom_endpoint: typing.Optional[str]=None, identity_platform_custom_endpoint: typing.Optional[str]=None, kms_custom_endpoint: typing.Optional[str]=None, logging_custom_endpoint: typing.Optional[str]=None, ml_engine_custom_endpoint: typing.Optional[str]=None, monitoring_custom_endpoint: typing.Optional[str]=None, network_management_custom_endpoint: typing.Optional[str]=None, os_config_custom_endpoint: typing.Optional[str]=None, os_login_custom_endpoint: typing.Optional[str]=None, project: typing.Optional[str]=None, pubsub_custom_endpoint: typing.Optional[str]=None, redis_custom_endpoint: typing.Optional[str]=None, region: typing.Optional[str]=None, request_timeout: typing.Optional[str]=None, resource_manager_custom_endpoint: typing.Optional[str]=None, resource_manager_v2_beta1_custom_endpoint: typing.Optional[str]=None, runtimeconfig_custom_endpoint: typing.Optional[str]=None, runtime_config_custom_endpoint: typing.Optional[str]=None, scopes: typing.Optional[typing.List[str]]=None, secret_manager_custom_endpoint: typing.Optional[str]=None, security_center_custom_endpoint: typing.Optional[str]=None, service_management_custom_endpoint: typing.Optional[str]=None, service_networking_custom_endpoint: typing.Optional[str]=None, service_usage_custom_endpoint: typing.Optional[str]=None, source_repo_custom_endpoint: typing.Optional[str]=None, spanner_custom_endpoint: typing.Optional[str]=None, sql_custom_endpoint: typing.Optional[str]=None, storage_custom_endpoint: typing.Optional[str]=None, storage_transfer_custom_endpoint: typing.Optional[str]=None, tpu_custom_endpoint: typing.Optional[str]=None, user_project_override: typing.Optional[bool]=None, vpc_access_custom_endpoint: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param access_context_manager_custom_endpoint: 
        :param access_token: 
        :param active_directory_custom_endpoint: 
        :param alias: Alias name.
        :param app_engine_custom_endpoint: 
        :param batching: batching block.
        :param big_query_custom_endpoint: 
        :param bigquery_data_transfer_custom_endpoint: 
        :param bigtable_custom_endpoint: 
        :param binary_authorization_custom_endpoint: 
        :param cloud_asset_custom_endpoint: 
        :param cloud_billing_custom_endpoint: 
        :param cloud_build_custom_endpoint: 
        :param cloud_functions_custom_endpoint: 
        :param cloud_iot_custom_endpoint: 
        :param cloud_run_custom_endpoint: 
        :param cloud_scheduler_custom_endpoint: 
        :param cloud_tasks_custom_endpoint: 
        :param composer_custom_endpoint: 
        :param compute_beta_custom_endpoint: 
        :param compute_custom_endpoint: 
        :param container_analysis_custom_endpoint: 
        :param container_beta_custom_endpoint: 
        :param container_custom_endpoint: 
        :param credentials: 
        :param data_catalog_custom_endpoint: 
        :param dataflow_custom_endpoint: 
        :param dataproc_beta_custom_endpoint: 
        :param dataproc_custom_endpoint: 
        :param datastore_custom_endpoint: 
        :param deployment_manager_custom_endpoint: 
        :param dialogflow_custom_endpoint: 
        :param dns_beta_custom_endpoint: 
        :param dns_custom_endpoint: 
        :param filestore_custom_endpoint: 
        :param firestore_custom_endpoint: 
        :param game_services_custom_endpoint: 
        :param healthcare_custom_endpoint: 
        :param iam_credentials_custom_endpoint: 
        :param iam_custom_endpoint: 
        :param iap_custom_endpoint: 
        :param identity_platform_custom_endpoint: 
        :param kms_custom_endpoint: 
        :param logging_custom_endpoint: 
        :param ml_engine_custom_endpoint: 
        :param monitoring_custom_endpoint: 
        :param network_management_custom_endpoint: 
        :param os_config_custom_endpoint: 
        :param os_login_custom_endpoint: 
        :param project: 
        :param pubsub_custom_endpoint: 
        :param redis_custom_endpoint: 
        :param region: 
        :param request_timeout: 
        :param resource_manager_custom_endpoint: 
        :param resource_manager_v2_beta1_custom_endpoint: 
        :param runtimeconfig_custom_endpoint: 
        :param runtime_config_custom_endpoint: 
        :param scopes: 
        :param secret_manager_custom_endpoint: 
        :param security_center_custom_endpoint: 
        :param service_management_custom_endpoint: 
        :param service_networking_custom_endpoint: 
        :param service_usage_custom_endpoint: 
        :param source_repo_custom_endpoint: 
        :param spanner_custom_endpoint: 
        :param sql_custom_endpoint: 
        :param storage_custom_endpoint: 
        :param storage_transfer_custom_endpoint: 
        :param tpu_custom_endpoint: 
        :param user_project_override: 
        :param vpc_access_custom_endpoint: 
        :param zone: 
        """
        config = GoogleProviderConfig(access_context_manager_custom_endpoint=access_context_manager_custom_endpoint, access_token=access_token, active_directory_custom_endpoint=active_directory_custom_endpoint, alias=alias, app_engine_custom_endpoint=app_engine_custom_endpoint, batching=batching, big_query_custom_endpoint=big_query_custom_endpoint, bigquery_data_transfer_custom_endpoint=bigquery_data_transfer_custom_endpoint, bigtable_custom_endpoint=bigtable_custom_endpoint, binary_authorization_custom_endpoint=binary_authorization_custom_endpoint, cloud_asset_custom_endpoint=cloud_asset_custom_endpoint, cloud_billing_custom_endpoint=cloud_billing_custom_endpoint, cloud_build_custom_endpoint=cloud_build_custom_endpoint, cloud_functions_custom_endpoint=cloud_functions_custom_endpoint, cloud_iot_custom_endpoint=cloud_iot_custom_endpoint, cloud_run_custom_endpoint=cloud_run_custom_endpoint, cloud_scheduler_custom_endpoint=cloud_scheduler_custom_endpoint, cloud_tasks_custom_endpoint=cloud_tasks_custom_endpoint, composer_custom_endpoint=composer_custom_endpoint, compute_beta_custom_endpoint=compute_beta_custom_endpoint, compute_custom_endpoint=compute_custom_endpoint, container_analysis_custom_endpoint=container_analysis_custom_endpoint, container_beta_custom_endpoint=container_beta_custom_endpoint, container_custom_endpoint=container_custom_endpoint, credentials=credentials, data_catalog_custom_endpoint=data_catalog_custom_endpoint, dataflow_custom_endpoint=dataflow_custom_endpoint, dataproc_beta_custom_endpoint=dataproc_beta_custom_endpoint, dataproc_custom_endpoint=dataproc_custom_endpoint, datastore_custom_endpoint=datastore_custom_endpoint, deployment_manager_custom_endpoint=deployment_manager_custom_endpoint, dialogflow_custom_endpoint=dialogflow_custom_endpoint, dns_beta_custom_endpoint=dns_beta_custom_endpoint, dns_custom_endpoint=dns_custom_endpoint, filestore_custom_endpoint=filestore_custom_endpoint, firestore_custom_endpoint=firestore_custom_endpoint, game_services_custom_endpoint=game_services_custom_endpoint, healthcare_custom_endpoint=healthcare_custom_endpoint, iam_credentials_custom_endpoint=iam_credentials_custom_endpoint, iam_custom_endpoint=iam_custom_endpoint, iap_custom_endpoint=iap_custom_endpoint, identity_platform_custom_endpoint=identity_platform_custom_endpoint, kms_custom_endpoint=kms_custom_endpoint, logging_custom_endpoint=logging_custom_endpoint, ml_engine_custom_endpoint=ml_engine_custom_endpoint, monitoring_custom_endpoint=monitoring_custom_endpoint, network_management_custom_endpoint=network_management_custom_endpoint, os_config_custom_endpoint=os_config_custom_endpoint, os_login_custom_endpoint=os_login_custom_endpoint, project=project, pubsub_custom_endpoint=pubsub_custom_endpoint, redis_custom_endpoint=redis_custom_endpoint, region=region, request_timeout=request_timeout, resource_manager_custom_endpoint=resource_manager_custom_endpoint, resource_manager_v2_beta1_custom_endpoint=resource_manager_v2_beta1_custom_endpoint, runtimeconfig_custom_endpoint=runtimeconfig_custom_endpoint, runtime_config_custom_endpoint=runtime_config_custom_endpoint, scopes=scopes, secret_manager_custom_endpoint=secret_manager_custom_endpoint, security_center_custom_endpoint=security_center_custom_endpoint, service_management_custom_endpoint=service_management_custom_endpoint, service_networking_custom_endpoint=service_networking_custom_endpoint, service_usage_custom_endpoint=service_usage_custom_endpoint, source_repo_custom_endpoint=source_repo_custom_endpoint, spanner_custom_endpoint=spanner_custom_endpoint, sql_custom_endpoint=sql_custom_endpoint, storage_custom_endpoint=storage_custom_endpoint, storage_transfer_custom_endpoint=storage_transfer_custom_endpoint, tpu_custom_endpoint=tpu_custom_endpoint, user_project_override=user_project_override, vpc_access_custom_endpoint=vpc_access_custom_endpoint, zone=zone)

        jsii.create(GoogleProvider, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="accessContextManagerCustomEndpoint")
    def access_context_manager_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "accessContextManagerCustomEndpoint")

    @access_context_manager_custom_endpoint.setter
    def access_context_manager_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "accessContextManagerCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="accessToken")
    def access_token(self) -> typing.Optional[str]:
        return jsii.get(self, "accessToken")

    @access_token.setter
    def access_token(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "accessToken", value)

    @builtins.property
    @jsii.member(jsii_name="activeDirectoryCustomEndpoint")
    def active_directory_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "activeDirectoryCustomEndpoint")

    @active_directory_custom_endpoint.setter
    def active_directory_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "activeDirectoryCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="alias")
    def alias(self) -> typing.Optional[str]:
        return jsii.get(self, "alias")

    @alias.setter
    def alias(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "alias", value)

    @builtins.property
    @jsii.member(jsii_name="appEngineCustomEndpoint")
    def app_engine_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "appEngineCustomEndpoint")

    @app_engine_custom_endpoint.setter
    def app_engine_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "appEngineCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="batching")
    def batching(self) -> typing.Optional[typing.List["GoogleProviderBatching"]]:
        return jsii.get(self, "batching")

    @batching.setter
    def batching(self, value: typing.Optional[typing.List["GoogleProviderBatching"]]) -> None:
        jsii.set(self, "batching", value)

    @builtins.property
    @jsii.member(jsii_name="bigQueryCustomEndpoint")
    def big_query_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "bigQueryCustomEndpoint")

    @big_query_custom_endpoint.setter
    def big_query_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "bigQueryCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="bigqueryDataTransferCustomEndpoint")
    def bigquery_data_transfer_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "bigqueryDataTransferCustomEndpoint")

    @bigquery_data_transfer_custom_endpoint.setter
    def bigquery_data_transfer_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "bigqueryDataTransferCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="bigtableCustomEndpoint")
    def bigtable_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "bigtableCustomEndpoint")

    @bigtable_custom_endpoint.setter
    def bigtable_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "bigtableCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="binaryAuthorizationCustomEndpoint")
    def binary_authorization_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "binaryAuthorizationCustomEndpoint")

    @binary_authorization_custom_endpoint.setter
    def binary_authorization_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "binaryAuthorizationCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="cloudAssetCustomEndpoint")
    def cloud_asset_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "cloudAssetCustomEndpoint")

    @cloud_asset_custom_endpoint.setter
    def cloud_asset_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "cloudAssetCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="cloudBillingCustomEndpoint")
    def cloud_billing_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "cloudBillingCustomEndpoint")

    @cloud_billing_custom_endpoint.setter
    def cloud_billing_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "cloudBillingCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="cloudBuildCustomEndpoint")
    def cloud_build_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "cloudBuildCustomEndpoint")

    @cloud_build_custom_endpoint.setter
    def cloud_build_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "cloudBuildCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="cloudFunctionsCustomEndpoint")
    def cloud_functions_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "cloudFunctionsCustomEndpoint")

    @cloud_functions_custom_endpoint.setter
    def cloud_functions_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "cloudFunctionsCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="cloudIotCustomEndpoint")
    def cloud_iot_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "cloudIotCustomEndpoint")

    @cloud_iot_custom_endpoint.setter
    def cloud_iot_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "cloudIotCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="cloudRunCustomEndpoint")
    def cloud_run_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "cloudRunCustomEndpoint")

    @cloud_run_custom_endpoint.setter
    def cloud_run_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "cloudRunCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="cloudSchedulerCustomEndpoint")
    def cloud_scheduler_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "cloudSchedulerCustomEndpoint")

    @cloud_scheduler_custom_endpoint.setter
    def cloud_scheduler_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "cloudSchedulerCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="cloudTasksCustomEndpoint")
    def cloud_tasks_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "cloudTasksCustomEndpoint")

    @cloud_tasks_custom_endpoint.setter
    def cloud_tasks_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "cloudTasksCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="composerCustomEndpoint")
    def composer_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "composerCustomEndpoint")

    @composer_custom_endpoint.setter
    def composer_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "composerCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="computeBetaCustomEndpoint")
    def compute_beta_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "computeBetaCustomEndpoint")

    @compute_beta_custom_endpoint.setter
    def compute_beta_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "computeBetaCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="computeCustomEndpoint")
    def compute_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "computeCustomEndpoint")

    @compute_custom_endpoint.setter
    def compute_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "computeCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="containerAnalysisCustomEndpoint")
    def container_analysis_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "containerAnalysisCustomEndpoint")

    @container_analysis_custom_endpoint.setter
    def container_analysis_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "containerAnalysisCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="containerBetaCustomEndpoint")
    def container_beta_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "containerBetaCustomEndpoint")

    @container_beta_custom_endpoint.setter
    def container_beta_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "containerBetaCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="containerCustomEndpoint")
    def container_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "containerCustomEndpoint")

    @container_custom_endpoint.setter
    def container_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "containerCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="credentials")
    def credentials(self) -> typing.Optional[str]:
        return jsii.get(self, "credentials")

    @credentials.setter
    def credentials(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "credentials", value)

    @builtins.property
    @jsii.member(jsii_name="dataCatalogCustomEndpoint")
    def data_catalog_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "dataCatalogCustomEndpoint")

    @data_catalog_custom_endpoint.setter
    def data_catalog_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "dataCatalogCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="dataflowCustomEndpoint")
    def dataflow_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "dataflowCustomEndpoint")

    @dataflow_custom_endpoint.setter
    def dataflow_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "dataflowCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="dataprocBetaCustomEndpoint")
    def dataproc_beta_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "dataprocBetaCustomEndpoint")

    @dataproc_beta_custom_endpoint.setter
    def dataproc_beta_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "dataprocBetaCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="dataprocCustomEndpoint")
    def dataproc_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "dataprocCustomEndpoint")

    @dataproc_custom_endpoint.setter
    def dataproc_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "dataprocCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="datastoreCustomEndpoint")
    def datastore_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "datastoreCustomEndpoint")

    @datastore_custom_endpoint.setter
    def datastore_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "datastoreCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="deploymentManagerCustomEndpoint")
    def deployment_manager_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "deploymentManagerCustomEndpoint")

    @deployment_manager_custom_endpoint.setter
    def deployment_manager_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "deploymentManagerCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="dialogflowCustomEndpoint")
    def dialogflow_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "dialogflowCustomEndpoint")

    @dialogflow_custom_endpoint.setter
    def dialogflow_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "dialogflowCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="dnsBetaCustomEndpoint")
    def dns_beta_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "dnsBetaCustomEndpoint")

    @dns_beta_custom_endpoint.setter
    def dns_beta_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "dnsBetaCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="dnsCustomEndpoint")
    def dns_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "dnsCustomEndpoint")

    @dns_custom_endpoint.setter
    def dns_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "dnsCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="filestoreCustomEndpoint")
    def filestore_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "filestoreCustomEndpoint")

    @filestore_custom_endpoint.setter
    def filestore_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "filestoreCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="firestoreCustomEndpoint")
    def firestore_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "firestoreCustomEndpoint")

    @firestore_custom_endpoint.setter
    def firestore_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "firestoreCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="gameServicesCustomEndpoint")
    def game_services_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "gameServicesCustomEndpoint")

    @game_services_custom_endpoint.setter
    def game_services_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "gameServicesCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="healthcareCustomEndpoint")
    def healthcare_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "healthcareCustomEndpoint")

    @healthcare_custom_endpoint.setter
    def healthcare_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "healthcareCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="iamCredentialsCustomEndpoint")
    def iam_credentials_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "iamCredentialsCustomEndpoint")

    @iam_credentials_custom_endpoint.setter
    def iam_credentials_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "iamCredentialsCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="iamCustomEndpoint")
    def iam_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "iamCustomEndpoint")

    @iam_custom_endpoint.setter
    def iam_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "iamCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="iapCustomEndpoint")
    def iap_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "iapCustomEndpoint")

    @iap_custom_endpoint.setter
    def iap_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "iapCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="identityPlatformCustomEndpoint")
    def identity_platform_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "identityPlatformCustomEndpoint")

    @identity_platform_custom_endpoint.setter
    def identity_platform_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "identityPlatformCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="kmsCustomEndpoint")
    def kms_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "kmsCustomEndpoint")

    @kms_custom_endpoint.setter
    def kms_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "kmsCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="loggingCustomEndpoint")
    def logging_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "loggingCustomEndpoint")

    @logging_custom_endpoint.setter
    def logging_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "loggingCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="mlEngineCustomEndpoint")
    def ml_engine_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "mlEngineCustomEndpoint")

    @ml_engine_custom_endpoint.setter
    def ml_engine_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "mlEngineCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="monitoringCustomEndpoint")
    def monitoring_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "monitoringCustomEndpoint")

    @monitoring_custom_endpoint.setter
    def monitoring_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "monitoringCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="networkManagementCustomEndpoint")
    def network_management_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "networkManagementCustomEndpoint")

    @network_management_custom_endpoint.setter
    def network_management_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "networkManagementCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="osConfigCustomEndpoint")
    def os_config_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "osConfigCustomEndpoint")

    @os_config_custom_endpoint.setter
    def os_config_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "osConfigCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="osLoginCustomEndpoint")
    def os_login_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "osLoginCustomEndpoint")

    @os_login_custom_endpoint.setter
    def os_login_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "osLoginCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="pubsubCustomEndpoint")
    def pubsub_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "pubsubCustomEndpoint")

    @pubsub_custom_endpoint.setter
    def pubsub_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "pubsubCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="redisCustomEndpoint")
    def redis_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "redisCustomEndpoint")

    @redis_custom_endpoint.setter
    def redis_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "redisCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="requestTimeout")
    def request_timeout(self) -> typing.Optional[str]:
        return jsii.get(self, "requestTimeout")

    @request_timeout.setter
    def request_timeout(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "requestTimeout", value)

    @builtins.property
    @jsii.member(jsii_name="resourceManagerCustomEndpoint")
    def resource_manager_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "resourceManagerCustomEndpoint")

    @resource_manager_custom_endpoint.setter
    def resource_manager_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "resourceManagerCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="resourceManagerV2Beta1CustomEndpoint")
    def resource_manager_v2_beta1_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "resourceManagerV2Beta1CustomEndpoint")

    @resource_manager_v2_beta1_custom_endpoint.setter
    def resource_manager_v2_beta1_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "resourceManagerV2Beta1CustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="runtimeconfigCustomEndpoint")
    def runtimeconfig_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "runtimeconfigCustomEndpoint")

    @runtimeconfig_custom_endpoint.setter
    def runtimeconfig_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "runtimeconfigCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="runtimeConfigCustomEndpoint")
    def runtime_config_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "runtimeConfigCustomEndpoint")

    @runtime_config_custom_endpoint.setter
    def runtime_config_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "runtimeConfigCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="scopes")
    def scopes(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "scopes")

    @scopes.setter
    def scopes(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "scopes", value)

    @builtins.property
    @jsii.member(jsii_name="secretManagerCustomEndpoint")
    def secret_manager_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "secretManagerCustomEndpoint")

    @secret_manager_custom_endpoint.setter
    def secret_manager_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "secretManagerCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="securityCenterCustomEndpoint")
    def security_center_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "securityCenterCustomEndpoint")

    @security_center_custom_endpoint.setter
    def security_center_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "securityCenterCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="serviceManagementCustomEndpoint")
    def service_management_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "serviceManagementCustomEndpoint")

    @service_management_custom_endpoint.setter
    def service_management_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "serviceManagementCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="serviceNetworkingCustomEndpoint")
    def service_networking_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "serviceNetworkingCustomEndpoint")

    @service_networking_custom_endpoint.setter
    def service_networking_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "serviceNetworkingCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="serviceUsageCustomEndpoint")
    def service_usage_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "serviceUsageCustomEndpoint")

    @service_usage_custom_endpoint.setter
    def service_usage_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "serviceUsageCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="sourceRepoCustomEndpoint")
    def source_repo_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "sourceRepoCustomEndpoint")

    @source_repo_custom_endpoint.setter
    def source_repo_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sourceRepoCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="spannerCustomEndpoint")
    def spanner_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "spannerCustomEndpoint")

    @spanner_custom_endpoint.setter
    def spanner_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "spannerCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="sqlCustomEndpoint")
    def sql_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "sqlCustomEndpoint")

    @sql_custom_endpoint.setter
    def sql_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sqlCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="storageCustomEndpoint")
    def storage_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "storageCustomEndpoint")

    @storage_custom_endpoint.setter
    def storage_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "storageCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="storageTransferCustomEndpoint")
    def storage_transfer_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "storageTransferCustomEndpoint")

    @storage_transfer_custom_endpoint.setter
    def storage_transfer_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "storageTransferCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="tpuCustomEndpoint")
    def tpu_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "tpuCustomEndpoint")

    @tpu_custom_endpoint.setter
    def tpu_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "tpuCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="userProjectOverride")
    def user_project_override(self) -> typing.Optional[bool]:
        return jsii.get(self, "userProjectOverride")

    @user_project_override.setter
    def user_project_override(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "userProjectOverride", value)

    @builtins.property
    @jsii.member(jsii_name="vpcAccessCustomEndpoint")
    def vpc_access_custom_endpoint(self) -> typing.Optional[str]:
        return jsii.get(self, "vpcAccessCustomEndpoint")

    @vpc_access_custom_endpoint.setter
    def vpc_access_custom_endpoint(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "vpcAccessCustomEndpoint", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.GoogleProviderBatching", jsii_struct_bases=[], name_mapping={'enable_batching': 'enableBatching', 'send_after': 'sendAfter'})
class GoogleProviderBatching():
    def __init__(self, *, enable_batching: typing.Optional[bool]=None, send_after: typing.Optional[str]=None) -> None:
        """
        :param enable_batching: 
        :param send_after: 
        """
        self._values = {
        }
        if enable_batching is not None: self._values["enable_batching"] = enable_batching
        if send_after is not None: self._values["send_after"] = send_after

    @builtins.property
    def enable_batching(self) -> typing.Optional[bool]:
        return self._values.get('enable_batching')

    @builtins.property
    def send_after(self) -> typing.Optional[str]:
        return self._values.get('send_after')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GoogleProviderBatching(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.GoogleProviderConfig", jsii_struct_bases=[], name_mapping={'access_context_manager_custom_endpoint': 'accessContextManagerCustomEndpoint', 'access_token': 'accessToken', 'active_directory_custom_endpoint': 'activeDirectoryCustomEndpoint', 'alias': 'alias', 'app_engine_custom_endpoint': 'appEngineCustomEndpoint', 'batching': 'batching', 'big_query_custom_endpoint': 'bigQueryCustomEndpoint', 'bigquery_data_transfer_custom_endpoint': 'bigqueryDataTransferCustomEndpoint', 'bigtable_custom_endpoint': 'bigtableCustomEndpoint', 'binary_authorization_custom_endpoint': 'binaryAuthorizationCustomEndpoint', 'cloud_asset_custom_endpoint': 'cloudAssetCustomEndpoint', 'cloud_billing_custom_endpoint': 'cloudBillingCustomEndpoint', 'cloud_build_custom_endpoint': 'cloudBuildCustomEndpoint', 'cloud_functions_custom_endpoint': 'cloudFunctionsCustomEndpoint', 'cloud_iot_custom_endpoint': 'cloudIotCustomEndpoint', 'cloud_run_custom_endpoint': 'cloudRunCustomEndpoint', 'cloud_scheduler_custom_endpoint': 'cloudSchedulerCustomEndpoint', 'cloud_tasks_custom_endpoint': 'cloudTasksCustomEndpoint', 'composer_custom_endpoint': 'composerCustomEndpoint', 'compute_beta_custom_endpoint': 'computeBetaCustomEndpoint', 'compute_custom_endpoint': 'computeCustomEndpoint', 'container_analysis_custom_endpoint': 'containerAnalysisCustomEndpoint', 'container_beta_custom_endpoint': 'containerBetaCustomEndpoint', 'container_custom_endpoint': 'containerCustomEndpoint', 'credentials': 'credentials', 'data_catalog_custom_endpoint': 'dataCatalogCustomEndpoint', 'dataflow_custom_endpoint': 'dataflowCustomEndpoint', 'dataproc_beta_custom_endpoint': 'dataprocBetaCustomEndpoint', 'dataproc_custom_endpoint': 'dataprocCustomEndpoint', 'datastore_custom_endpoint': 'datastoreCustomEndpoint', 'deployment_manager_custom_endpoint': 'deploymentManagerCustomEndpoint', 'dialogflow_custom_endpoint': 'dialogflowCustomEndpoint', 'dns_beta_custom_endpoint': 'dnsBetaCustomEndpoint', 'dns_custom_endpoint': 'dnsCustomEndpoint', 'filestore_custom_endpoint': 'filestoreCustomEndpoint', 'firestore_custom_endpoint': 'firestoreCustomEndpoint', 'game_services_custom_endpoint': 'gameServicesCustomEndpoint', 'healthcare_custom_endpoint': 'healthcareCustomEndpoint', 'iam_credentials_custom_endpoint': 'iamCredentialsCustomEndpoint', 'iam_custom_endpoint': 'iamCustomEndpoint', 'iap_custom_endpoint': 'iapCustomEndpoint', 'identity_platform_custom_endpoint': 'identityPlatformCustomEndpoint', 'kms_custom_endpoint': 'kmsCustomEndpoint', 'logging_custom_endpoint': 'loggingCustomEndpoint', 'ml_engine_custom_endpoint': 'mlEngineCustomEndpoint', 'monitoring_custom_endpoint': 'monitoringCustomEndpoint', 'network_management_custom_endpoint': 'networkManagementCustomEndpoint', 'os_config_custom_endpoint': 'osConfigCustomEndpoint', 'os_login_custom_endpoint': 'osLoginCustomEndpoint', 'project': 'project', 'pubsub_custom_endpoint': 'pubsubCustomEndpoint', 'redis_custom_endpoint': 'redisCustomEndpoint', 'region': 'region', 'request_timeout': 'requestTimeout', 'resource_manager_custom_endpoint': 'resourceManagerCustomEndpoint', 'resource_manager_v2_beta1_custom_endpoint': 'resourceManagerV2Beta1CustomEndpoint', 'runtimeconfig_custom_endpoint': 'runtimeconfigCustomEndpoint', 'runtime_config_custom_endpoint': 'runtimeConfigCustomEndpoint', 'scopes': 'scopes', 'secret_manager_custom_endpoint': 'secretManagerCustomEndpoint', 'security_center_custom_endpoint': 'securityCenterCustomEndpoint', 'service_management_custom_endpoint': 'serviceManagementCustomEndpoint', 'service_networking_custom_endpoint': 'serviceNetworkingCustomEndpoint', 'service_usage_custom_endpoint': 'serviceUsageCustomEndpoint', 'source_repo_custom_endpoint': 'sourceRepoCustomEndpoint', 'spanner_custom_endpoint': 'spannerCustomEndpoint', 'sql_custom_endpoint': 'sqlCustomEndpoint', 'storage_custom_endpoint': 'storageCustomEndpoint', 'storage_transfer_custom_endpoint': 'storageTransferCustomEndpoint', 'tpu_custom_endpoint': 'tpuCustomEndpoint', 'user_project_override': 'userProjectOverride', 'vpc_access_custom_endpoint': 'vpcAccessCustomEndpoint', 'zone': 'zone'})
class GoogleProviderConfig():
    def __init__(self, *, access_context_manager_custom_endpoint: typing.Optional[str]=None, access_token: typing.Optional[str]=None, active_directory_custom_endpoint: typing.Optional[str]=None, alias: typing.Optional[str]=None, app_engine_custom_endpoint: typing.Optional[str]=None, batching: typing.Optional[typing.List["GoogleProviderBatching"]]=None, big_query_custom_endpoint: typing.Optional[str]=None, bigquery_data_transfer_custom_endpoint: typing.Optional[str]=None, bigtable_custom_endpoint: typing.Optional[str]=None, binary_authorization_custom_endpoint: typing.Optional[str]=None, cloud_asset_custom_endpoint: typing.Optional[str]=None, cloud_billing_custom_endpoint: typing.Optional[str]=None, cloud_build_custom_endpoint: typing.Optional[str]=None, cloud_functions_custom_endpoint: typing.Optional[str]=None, cloud_iot_custom_endpoint: typing.Optional[str]=None, cloud_run_custom_endpoint: typing.Optional[str]=None, cloud_scheduler_custom_endpoint: typing.Optional[str]=None, cloud_tasks_custom_endpoint: typing.Optional[str]=None, composer_custom_endpoint: typing.Optional[str]=None, compute_beta_custom_endpoint: typing.Optional[str]=None, compute_custom_endpoint: typing.Optional[str]=None, container_analysis_custom_endpoint: typing.Optional[str]=None, container_beta_custom_endpoint: typing.Optional[str]=None, container_custom_endpoint: typing.Optional[str]=None, credentials: typing.Optional[str]=None, data_catalog_custom_endpoint: typing.Optional[str]=None, dataflow_custom_endpoint: typing.Optional[str]=None, dataproc_beta_custom_endpoint: typing.Optional[str]=None, dataproc_custom_endpoint: typing.Optional[str]=None, datastore_custom_endpoint: typing.Optional[str]=None, deployment_manager_custom_endpoint: typing.Optional[str]=None, dialogflow_custom_endpoint: typing.Optional[str]=None, dns_beta_custom_endpoint: typing.Optional[str]=None, dns_custom_endpoint: typing.Optional[str]=None, filestore_custom_endpoint: typing.Optional[str]=None, firestore_custom_endpoint: typing.Optional[str]=None, game_services_custom_endpoint: typing.Optional[str]=None, healthcare_custom_endpoint: typing.Optional[str]=None, iam_credentials_custom_endpoint: typing.Optional[str]=None, iam_custom_endpoint: typing.Optional[str]=None, iap_custom_endpoint: typing.Optional[str]=None, identity_platform_custom_endpoint: typing.Optional[str]=None, kms_custom_endpoint: typing.Optional[str]=None, logging_custom_endpoint: typing.Optional[str]=None, ml_engine_custom_endpoint: typing.Optional[str]=None, monitoring_custom_endpoint: typing.Optional[str]=None, network_management_custom_endpoint: typing.Optional[str]=None, os_config_custom_endpoint: typing.Optional[str]=None, os_login_custom_endpoint: typing.Optional[str]=None, project: typing.Optional[str]=None, pubsub_custom_endpoint: typing.Optional[str]=None, redis_custom_endpoint: typing.Optional[str]=None, region: typing.Optional[str]=None, request_timeout: typing.Optional[str]=None, resource_manager_custom_endpoint: typing.Optional[str]=None, resource_manager_v2_beta1_custom_endpoint: typing.Optional[str]=None, runtimeconfig_custom_endpoint: typing.Optional[str]=None, runtime_config_custom_endpoint: typing.Optional[str]=None, scopes: typing.Optional[typing.List[str]]=None, secret_manager_custom_endpoint: typing.Optional[str]=None, security_center_custom_endpoint: typing.Optional[str]=None, service_management_custom_endpoint: typing.Optional[str]=None, service_networking_custom_endpoint: typing.Optional[str]=None, service_usage_custom_endpoint: typing.Optional[str]=None, source_repo_custom_endpoint: typing.Optional[str]=None, spanner_custom_endpoint: typing.Optional[str]=None, sql_custom_endpoint: typing.Optional[str]=None, storage_custom_endpoint: typing.Optional[str]=None, storage_transfer_custom_endpoint: typing.Optional[str]=None, tpu_custom_endpoint: typing.Optional[str]=None, user_project_override: typing.Optional[bool]=None, vpc_access_custom_endpoint: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param access_context_manager_custom_endpoint: 
        :param access_token: 
        :param active_directory_custom_endpoint: 
        :param alias: Alias name.
        :param app_engine_custom_endpoint: 
        :param batching: batching block.
        :param big_query_custom_endpoint: 
        :param bigquery_data_transfer_custom_endpoint: 
        :param bigtable_custom_endpoint: 
        :param binary_authorization_custom_endpoint: 
        :param cloud_asset_custom_endpoint: 
        :param cloud_billing_custom_endpoint: 
        :param cloud_build_custom_endpoint: 
        :param cloud_functions_custom_endpoint: 
        :param cloud_iot_custom_endpoint: 
        :param cloud_run_custom_endpoint: 
        :param cloud_scheduler_custom_endpoint: 
        :param cloud_tasks_custom_endpoint: 
        :param composer_custom_endpoint: 
        :param compute_beta_custom_endpoint: 
        :param compute_custom_endpoint: 
        :param container_analysis_custom_endpoint: 
        :param container_beta_custom_endpoint: 
        :param container_custom_endpoint: 
        :param credentials: 
        :param data_catalog_custom_endpoint: 
        :param dataflow_custom_endpoint: 
        :param dataproc_beta_custom_endpoint: 
        :param dataproc_custom_endpoint: 
        :param datastore_custom_endpoint: 
        :param deployment_manager_custom_endpoint: 
        :param dialogflow_custom_endpoint: 
        :param dns_beta_custom_endpoint: 
        :param dns_custom_endpoint: 
        :param filestore_custom_endpoint: 
        :param firestore_custom_endpoint: 
        :param game_services_custom_endpoint: 
        :param healthcare_custom_endpoint: 
        :param iam_credentials_custom_endpoint: 
        :param iam_custom_endpoint: 
        :param iap_custom_endpoint: 
        :param identity_platform_custom_endpoint: 
        :param kms_custom_endpoint: 
        :param logging_custom_endpoint: 
        :param ml_engine_custom_endpoint: 
        :param monitoring_custom_endpoint: 
        :param network_management_custom_endpoint: 
        :param os_config_custom_endpoint: 
        :param os_login_custom_endpoint: 
        :param project: 
        :param pubsub_custom_endpoint: 
        :param redis_custom_endpoint: 
        :param region: 
        :param request_timeout: 
        :param resource_manager_custom_endpoint: 
        :param resource_manager_v2_beta1_custom_endpoint: 
        :param runtimeconfig_custom_endpoint: 
        :param runtime_config_custom_endpoint: 
        :param scopes: 
        :param secret_manager_custom_endpoint: 
        :param security_center_custom_endpoint: 
        :param service_management_custom_endpoint: 
        :param service_networking_custom_endpoint: 
        :param service_usage_custom_endpoint: 
        :param source_repo_custom_endpoint: 
        :param spanner_custom_endpoint: 
        :param sql_custom_endpoint: 
        :param storage_custom_endpoint: 
        :param storage_transfer_custom_endpoint: 
        :param tpu_custom_endpoint: 
        :param user_project_override: 
        :param vpc_access_custom_endpoint: 
        :param zone: 
        """
        self._values = {
        }
        if access_context_manager_custom_endpoint is not None: self._values["access_context_manager_custom_endpoint"] = access_context_manager_custom_endpoint
        if access_token is not None: self._values["access_token"] = access_token
        if active_directory_custom_endpoint is not None: self._values["active_directory_custom_endpoint"] = active_directory_custom_endpoint
        if alias is not None: self._values["alias"] = alias
        if app_engine_custom_endpoint is not None: self._values["app_engine_custom_endpoint"] = app_engine_custom_endpoint
        if batching is not None: self._values["batching"] = batching
        if big_query_custom_endpoint is not None: self._values["big_query_custom_endpoint"] = big_query_custom_endpoint
        if bigquery_data_transfer_custom_endpoint is not None: self._values["bigquery_data_transfer_custom_endpoint"] = bigquery_data_transfer_custom_endpoint
        if bigtable_custom_endpoint is not None: self._values["bigtable_custom_endpoint"] = bigtable_custom_endpoint
        if binary_authorization_custom_endpoint is not None: self._values["binary_authorization_custom_endpoint"] = binary_authorization_custom_endpoint
        if cloud_asset_custom_endpoint is not None: self._values["cloud_asset_custom_endpoint"] = cloud_asset_custom_endpoint
        if cloud_billing_custom_endpoint is not None: self._values["cloud_billing_custom_endpoint"] = cloud_billing_custom_endpoint
        if cloud_build_custom_endpoint is not None: self._values["cloud_build_custom_endpoint"] = cloud_build_custom_endpoint
        if cloud_functions_custom_endpoint is not None: self._values["cloud_functions_custom_endpoint"] = cloud_functions_custom_endpoint
        if cloud_iot_custom_endpoint is not None: self._values["cloud_iot_custom_endpoint"] = cloud_iot_custom_endpoint
        if cloud_run_custom_endpoint is not None: self._values["cloud_run_custom_endpoint"] = cloud_run_custom_endpoint
        if cloud_scheduler_custom_endpoint is not None: self._values["cloud_scheduler_custom_endpoint"] = cloud_scheduler_custom_endpoint
        if cloud_tasks_custom_endpoint is not None: self._values["cloud_tasks_custom_endpoint"] = cloud_tasks_custom_endpoint
        if composer_custom_endpoint is not None: self._values["composer_custom_endpoint"] = composer_custom_endpoint
        if compute_beta_custom_endpoint is not None: self._values["compute_beta_custom_endpoint"] = compute_beta_custom_endpoint
        if compute_custom_endpoint is not None: self._values["compute_custom_endpoint"] = compute_custom_endpoint
        if container_analysis_custom_endpoint is not None: self._values["container_analysis_custom_endpoint"] = container_analysis_custom_endpoint
        if container_beta_custom_endpoint is not None: self._values["container_beta_custom_endpoint"] = container_beta_custom_endpoint
        if container_custom_endpoint is not None: self._values["container_custom_endpoint"] = container_custom_endpoint
        if credentials is not None: self._values["credentials"] = credentials
        if data_catalog_custom_endpoint is not None: self._values["data_catalog_custom_endpoint"] = data_catalog_custom_endpoint
        if dataflow_custom_endpoint is not None: self._values["dataflow_custom_endpoint"] = dataflow_custom_endpoint
        if dataproc_beta_custom_endpoint is not None: self._values["dataproc_beta_custom_endpoint"] = dataproc_beta_custom_endpoint
        if dataproc_custom_endpoint is not None: self._values["dataproc_custom_endpoint"] = dataproc_custom_endpoint
        if datastore_custom_endpoint is not None: self._values["datastore_custom_endpoint"] = datastore_custom_endpoint
        if deployment_manager_custom_endpoint is not None: self._values["deployment_manager_custom_endpoint"] = deployment_manager_custom_endpoint
        if dialogflow_custom_endpoint is not None: self._values["dialogflow_custom_endpoint"] = dialogflow_custom_endpoint
        if dns_beta_custom_endpoint is not None: self._values["dns_beta_custom_endpoint"] = dns_beta_custom_endpoint
        if dns_custom_endpoint is not None: self._values["dns_custom_endpoint"] = dns_custom_endpoint
        if filestore_custom_endpoint is not None: self._values["filestore_custom_endpoint"] = filestore_custom_endpoint
        if firestore_custom_endpoint is not None: self._values["firestore_custom_endpoint"] = firestore_custom_endpoint
        if game_services_custom_endpoint is not None: self._values["game_services_custom_endpoint"] = game_services_custom_endpoint
        if healthcare_custom_endpoint is not None: self._values["healthcare_custom_endpoint"] = healthcare_custom_endpoint
        if iam_credentials_custom_endpoint is not None: self._values["iam_credentials_custom_endpoint"] = iam_credentials_custom_endpoint
        if iam_custom_endpoint is not None: self._values["iam_custom_endpoint"] = iam_custom_endpoint
        if iap_custom_endpoint is not None: self._values["iap_custom_endpoint"] = iap_custom_endpoint
        if identity_platform_custom_endpoint is not None: self._values["identity_platform_custom_endpoint"] = identity_platform_custom_endpoint
        if kms_custom_endpoint is not None: self._values["kms_custom_endpoint"] = kms_custom_endpoint
        if logging_custom_endpoint is not None: self._values["logging_custom_endpoint"] = logging_custom_endpoint
        if ml_engine_custom_endpoint is not None: self._values["ml_engine_custom_endpoint"] = ml_engine_custom_endpoint
        if monitoring_custom_endpoint is not None: self._values["monitoring_custom_endpoint"] = monitoring_custom_endpoint
        if network_management_custom_endpoint is not None: self._values["network_management_custom_endpoint"] = network_management_custom_endpoint
        if os_config_custom_endpoint is not None: self._values["os_config_custom_endpoint"] = os_config_custom_endpoint
        if os_login_custom_endpoint is not None: self._values["os_login_custom_endpoint"] = os_login_custom_endpoint
        if project is not None: self._values["project"] = project
        if pubsub_custom_endpoint is not None: self._values["pubsub_custom_endpoint"] = pubsub_custom_endpoint
        if redis_custom_endpoint is not None: self._values["redis_custom_endpoint"] = redis_custom_endpoint
        if region is not None: self._values["region"] = region
        if request_timeout is not None: self._values["request_timeout"] = request_timeout
        if resource_manager_custom_endpoint is not None: self._values["resource_manager_custom_endpoint"] = resource_manager_custom_endpoint
        if resource_manager_v2_beta1_custom_endpoint is not None: self._values["resource_manager_v2_beta1_custom_endpoint"] = resource_manager_v2_beta1_custom_endpoint
        if runtimeconfig_custom_endpoint is not None: self._values["runtimeconfig_custom_endpoint"] = runtimeconfig_custom_endpoint
        if runtime_config_custom_endpoint is not None: self._values["runtime_config_custom_endpoint"] = runtime_config_custom_endpoint
        if scopes is not None: self._values["scopes"] = scopes
        if secret_manager_custom_endpoint is not None: self._values["secret_manager_custom_endpoint"] = secret_manager_custom_endpoint
        if security_center_custom_endpoint is not None: self._values["security_center_custom_endpoint"] = security_center_custom_endpoint
        if service_management_custom_endpoint is not None: self._values["service_management_custom_endpoint"] = service_management_custom_endpoint
        if service_networking_custom_endpoint is not None: self._values["service_networking_custom_endpoint"] = service_networking_custom_endpoint
        if service_usage_custom_endpoint is not None: self._values["service_usage_custom_endpoint"] = service_usage_custom_endpoint
        if source_repo_custom_endpoint is not None: self._values["source_repo_custom_endpoint"] = source_repo_custom_endpoint
        if spanner_custom_endpoint is not None: self._values["spanner_custom_endpoint"] = spanner_custom_endpoint
        if sql_custom_endpoint is not None: self._values["sql_custom_endpoint"] = sql_custom_endpoint
        if storage_custom_endpoint is not None: self._values["storage_custom_endpoint"] = storage_custom_endpoint
        if storage_transfer_custom_endpoint is not None: self._values["storage_transfer_custom_endpoint"] = storage_transfer_custom_endpoint
        if tpu_custom_endpoint is not None: self._values["tpu_custom_endpoint"] = tpu_custom_endpoint
        if user_project_override is not None: self._values["user_project_override"] = user_project_override
        if vpc_access_custom_endpoint is not None: self._values["vpc_access_custom_endpoint"] = vpc_access_custom_endpoint
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def access_context_manager_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('access_context_manager_custom_endpoint')

    @builtins.property
    def access_token(self) -> typing.Optional[str]:
        return self._values.get('access_token')

    @builtins.property
    def active_directory_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('active_directory_custom_endpoint')

    @builtins.property
    def alias(self) -> typing.Optional[str]:
        """Alias name."""
        return self._values.get('alias')

    @builtins.property
    def app_engine_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('app_engine_custom_endpoint')

    @builtins.property
    def batching(self) -> typing.Optional[typing.List["GoogleProviderBatching"]]:
        """batching block."""
        return self._values.get('batching')

    @builtins.property
    def big_query_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('big_query_custom_endpoint')

    @builtins.property
    def bigquery_data_transfer_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('bigquery_data_transfer_custom_endpoint')

    @builtins.property
    def bigtable_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('bigtable_custom_endpoint')

    @builtins.property
    def binary_authorization_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('binary_authorization_custom_endpoint')

    @builtins.property
    def cloud_asset_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('cloud_asset_custom_endpoint')

    @builtins.property
    def cloud_billing_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('cloud_billing_custom_endpoint')

    @builtins.property
    def cloud_build_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('cloud_build_custom_endpoint')

    @builtins.property
    def cloud_functions_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('cloud_functions_custom_endpoint')

    @builtins.property
    def cloud_iot_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('cloud_iot_custom_endpoint')

    @builtins.property
    def cloud_run_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('cloud_run_custom_endpoint')

    @builtins.property
    def cloud_scheduler_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('cloud_scheduler_custom_endpoint')

    @builtins.property
    def cloud_tasks_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('cloud_tasks_custom_endpoint')

    @builtins.property
    def composer_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('composer_custom_endpoint')

    @builtins.property
    def compute_beta_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('compute_beta_custom_endpoint')

    @builtins.property
    def compute_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('compute_custom_endpoint')

    @builtins.property
    def container_analysis_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('container_analysis_custom_endpoint')

    @builtins.property
    def container_beta_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('container_beta_custom_endpoint')

    @builtins.property
    def container_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('container_custom_endpoint')

    @builtins.property
    def credentials(self) -> typing.Optional[str]:
        return self._values.get('credentials')

    @builtins.property
    def data_catalog_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('data_catalog_custom_endpoint')

    @builtins.property
    def dataflow_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('dataflow_custom_endpoint')

    @builtins.property
    def dataproc_beta_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('dataproc_beta_custom_endpoint')

    @builtins.property
    def dataproc_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('dataproc_custom_endpoint')

    @builtins.property
    def datastore_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('datastore_custom_endpoint')

    @builtins.property
    def deployment_manager_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('deployment_manager_custom_endpoint')

    @builtins.property
    def dialogflow_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('dialogflow_custom_endpoint')

    @builtins.property
    def dns_beta_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('dns_beta_custom_endpoint')

    @builtins.property
    def dns_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('dns_custom_endpoint')

    @builtins.property
    def filestore_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('filestore_custom_endpoint')

    @builtins.property
    def firestore_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('firestore_custom_endpoint')

    @builtins.property
    def game_services_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('game_services_custom_endpoint')

    @builtins.property
    def healthcare_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('healthcare_custom_endpoint')

    @builtins.property
    def iam_credentials_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('iam_credentials_custom_endpoint')

    @builtins.property
    def iam_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('iam_custom_endpoint')

    @builtins.property
    def iap_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('iap_custom_endpoint')

    @builtins.property
    def identity_platform_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('identity_platform_custom_endpoint')

    @builtins.property
    def kms_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('kms_custom_endpoint')

    @builtins.property
    def logging_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('logging_custom_endpoint')

    @builtins.property
    def ml_engine_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('ml_engine_custom_endpoint')

    @builtins.property
    def monitoring_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('monitoring_custom_endpoint')

    @builtins.property
    def network_management_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('network_management_custom_endpoint')

    @builtins.property
    def os_config_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('os_config_custom_endpoint')

    @builtins.property
    def os_login_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('os_login_custom_endpoint')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def pubsub_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('pubsub_custom_endpoint')

    @builtins.property
    def redis_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('redis_custom_endpoint')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        return self._values.get('region')

    @builtins.property
    def request_timeout(self) -> typing.Optional[str]:
        return self._values.get('request_timeout')

    @builtins.property
    def resource_manager_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('resource_manager_custom_endpoint')

    @builtins.property
    def resource_manager_v2_beta1_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('resource_manager_v2_beta1_custom_endpoint')

    @builtins.property
    def runtimeconfig_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('runtimeconfig_custom_endpoint')

    @builtins.property
    def runtime_config_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('runtime_config_custom_endpoint')

    @builtins.property
    def scopes(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('scopes')

    @builtins.property
    def secret_manager_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('secret_manager_custom_endpoint')

    @builtins.property
    def security_center_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('security_center_custom_endpoint')

    @builtins.property
    def service_management_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('service_management_custom_endpoint')

    @builtins.property
    def service_networking_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('service_networking_custom_endpoint')

    @builtins.property
    def service_usage_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('service_usage_custom_endpoint')

    @builtins.property
    def source_repo_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('source_repo_custom_endpoint')

    @builtins.property
    def spanner_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('spanner_custom_endpoint')

    @builtins.property
    def sql_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('sql_custom_endpoint')

    @builtins.property
    def storage_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('storage_custom_endpoint')

    @builtins.property
    def storage_transfer_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('storage_transfer_custom_endpoint')

    @builtins.property
    def tpu_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('tpu_custom_endpoint')

    @builtins.property
    def user_project_override(self) -> typing.Optional[bool]:
        return self._values.get('user_project_override')

    @builtins.property
    def vpc_access_custom_endpoint(self) -> typing.Optional[str]:
        return self._values.get('vpc_access_custom_endpoint')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'GoogleProviderConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareDataset(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareDataset"):
    def __init__(self, scope: constructs.Construct, id: str, *, location: str, name: str, project: typing.Optional[str]=None, timeouts: typing.Optional["HealthcareDatasetTimeouts"]=None, time_zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param location: The location for the Dataset.
        :param name: The resource name for the Dataset.
        :param project: 
        :param timeouts: timeouts block.
        :param time_zone: The default timezone used by this dataset. Must be a either a valid IANA time zone name such as "America/New_York" or empty, which defaults to UTC. This is used for parsing times in resources (e.g., HL7 messages) where no explicit timezone is specified.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareDatasetConfig(location=location, name=name, project=project, timeouts=timeouts, time_zone=time_zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareDataset, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: str) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["HealthcareDatasetTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["HealthcareDatasetTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="timeZone")
    def time_zone(self) -> typing.Optional[str]:
        return jsii.get(self, "timeZone")

    @time_zone.setter
    def time_zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "timeZone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDatasetConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'location': 'location', 'name': 'name', 'project': 'project', 'timeouts': 'timeouts', 'time_zone': 'timeZone'})
class HealthcareDatasetConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, location: str, name: str, project: typing.Optional[str]=None, timeouts: typing.Optional["HealthcareDatasetTimeouts"]=None, time_zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: The location for the Dataset.
        :param name: The resource name for the Dataset.
        :param project: 
        :param timeouts: timeouts block.
        :param time_zone: The default timezone used by this dataset. Must be a either a valid IANA time zone name such as "America/New_York" or empty, which defaults to UTC. This is used for parsing times in resources (e.g., HL7 messages) where no explicit timezone is specified.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = HealthcareDatasetTimeouts(**timeouts)
        self._values = {
            'location': location,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if time_zone is not None: self._values["time_zone"] = time_zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def location(self) -> str:
        """The location for the Dataset."""
        return self._values.get('location')

    @builtins.property
    def name(self) -> str:
        """The resource name for the Dataset."""
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["HealthcareDatasetTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def time_zone(self) -> typing.Optional[str]:
        """The default timezone used by this dataset.

        Must be a either a valid IANA time zone name such as
        "America/New_York" or empty, which defaults to UTC. This is used for parsing times in resources
        (e.g., HL7 messages) where no explicit timezone is specified.
        """
        return self._values.get('time_zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDatasetConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareDatasetIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareDatasetIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, dataset_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["HealthcareDatasetIamBindingCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dataset_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareDatasetIamBindingConfig(dataset_id=dataset_id, members=members, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareDatasetIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="datasetId")
    def dataset_id(self) -> str:
        return jsii.get(self, "datasetId")

    @dataset_id.setter
    def dataset_id(self, value: str) -> None:
        jsii.set(self, "datasetId", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["HealthcareDatasetIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["HealthcareDatasetIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDatasetIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class HealthcareDatasetIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDatasetIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDatasetIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dataset_id': 'datasetId', 'members': 'members', 'role': 'role', 'condition': 'condition'})
class HealthcareDatasetIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dataset_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["HealthcareDatasetIamBindingCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dataset_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'dataset_id': dataset_id,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dataset_id(self) -> str:
        return self._values.get('dataset_id')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["HealthcareDatasetIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDatasetIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareDatasetIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareDatasetIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, dataset_id: str, member: str, role: str, condition: typing.Optional[typing.List["HealthcareDatasetIamMemberCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dataset_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareDatasetIamMemberConfig(dataset_id=dataset_id, member=member, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareDatasetIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="datasetId")
    def dataset_id(self) -> str:
        return jsii.get(self, "datasetId")

    @dataset_id.setter
    def dataset_id(self, value: str) -> None:
        jsii.set(self, "datasetId", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["HealthcareDatasetIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["HealthcareDatasetIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDatasetIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class HealthcareDatasetIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDatasetIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDatasetIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dataset_id': 'datasetId', 'member': 'member', 'role': 'role', 'condition': 'condition'})
class HealthcareDatasetIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dataset_id: str, member: str, role: str, condition: typing.Optional[typing.List["HealthcareDatasetIamMemberCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dataset_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'dataset_id': dataset_id,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dataset_id(self) -> str:
        return self._values.get('dataset_id')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["HealthcareDatasetIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDatasetIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareDatasetIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareDatasetIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, dataset_id: str, policy_data: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dataset_id: 
        :param policy_data: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareDatasetIamPolicyConfig(dataset_id=dataset_id, policy_data=policy_data, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareDatasetIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="datasetId")
    def dataset_id(self) -> str:
        return jsii.get(self, "datasetId")

    @dataset_id.setter
    def dataset_id(self, value: str) -> None:
        jsii.set(self, "datasetId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDatasetIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dataset_id': 'datasetId', 'policy_data': 'policyData'})
class HealthcareDatasetIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dataset_id: str, policy_data: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dataset_id: 
        :param policy_data: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'dataset_id': dataset_id,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dataset_id(self) -> str:
        return self._values.get('dataset_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDatasetIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDatasetTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class HealthcareDatasetTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDatasetTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareDicomStore(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareDicomStore"):
    def __init__(self, scope: constructs.Construct, id: str, *, dataset: str, name: str, labels: typing.Optional[typing.Mapping[str, str]]=None, notification_config: typing.Optional[typing.List["HealthcareDicomStoreNotificationConfig"]]=None, timeouts: typing.Optional["HealthcareDicomStoreTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dataset: Identifies the dataset addressed by this request. Must be in the format 'projects/{project}/locations/{location}/datasets/{dataset}'
        :param name: The resource name for the DicomStore. - Changing this property may recreate the Dicom store (removing all data) **
        :param labels: User-supplied key-value pairs used to organize DICOM stores. Label keys must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62} Label values are optional, must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63} No more than 64 labels can be associated with a given store. An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        :param notification_config: notification_config block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareDicomStoreConfig(dataset=dataset, name=name, labels=labels, notification_config=notification_config, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareDicomStore, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="dataset")
    def dataset(self) -> str:
        return jsii.get(self, "dataset")

    @dataset.setter
    def dataset(self, value: str) -> None:
        jsii.set(self, "dataset", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="notificationConfig")
    def notification_config(self) -> typing.Optional[typing.List["HealthcareDicomStoreNotificationConfig"]]:
        return jsii.get(self, "notificationConfig")

    @notification_config.setter
    def notification_config(self, value: typing.Optional[typing.List["HealthcareDicomStoreNotificationConfig"]]) -> None:
        jsii.set(self, "notificationConfig", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["HealthcareDicomStoreTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["HealthcareDicomStoreTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDicomStoreConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dataset': 'dataset', 'name': 'name', 'labels': 'labels', 'notification_config': 'notificationConfig', 'timeouts': 'timeouts'})
class HealthcareDicomStoreConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dataset: str, name: str, labels: typing.Optional[typing.Mapping[str, str]]=None, notification_config: typing.Optional[typing.List["HealthcareDicomStoreNotificationConfig"]]=None, timeouts: typing.Optional["HealthcareDicomStoreTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dataset: Identifies the dataset addressed by this request. Must be in the format 'projects/{project}/locations/{location}/datasets/{dataset}'
        :param name: The resource name for the DicomStore. - Changing this property may recreate the Dicom store (removing all data) **
        :param labels: User-supplied key-value pairs used to organize DICOM stores. Label keys must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62} Label values are optional, must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63} No more than 64 labels can be associated with a given store. An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        :param notification_config: notification_config block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = HealthcareDicomStoreTimeouts(**timeouts)
        self._values = {
            'dataset': dataset,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if labels is not None: self._values["labels"] = labels
        if notification_config is not None: self._values["notification_config"] = notification_config
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dataset(self) -> str:
        """Identifies the dataset addressed by this request.

        Must be in the format
        'projects/{project}/locations/{location}/datasets/{dataset}'
        """
        return self._values.get('dataset')

    @builtins.property
    def name(self) -> str:
        """The resource name for the DicomStore.

        - Changing this property may recreate the Dicom store (removing all data) **
        """
        return self._values.get('name')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """User-supplied key-value pairs used to organize DICOM stores.

        Label keys must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must
        conform to the following PCRE regular expression: [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62}

        Label values are optional, must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128
        bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63}

        No more than 64 labels can be associated with a given store.

        An object containing a list of "key": value pairs.
        Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        """
        return self._values.get('labels')

    @builtins.property
    def notification_config(self) -> typing.Optional[typing.List["HealthcareDicomStoreNotificationConfig"]]:
        """notification_config block."""
        return self._values.get('notification_config')

    @builtins.property
    def timeouts(self) -> typing.Optional["HealthcareDicomStoreTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDicomStoreConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareDicomStoreIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareDicomStoreIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, dicom_store_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["HealthcareDicomStoreIamBindingCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dicom_store_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareDicomStoreIamBindingConfig(dicom_store_id=dicom_store_id, members=members, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareDicomStoreIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="dicomStoreId")
    def dicom_store_id(self) -> str:
        return jsii.get(self, "dicomStoreId")

    @dicom_store_id.setter
    def dicom_store_id(self, value: str) -> None:
        jsii.set(self, "dicomStoreId", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["HealthcareDicomStoreIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["HealthcareDicomStoreIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDicomStoreIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class HealthcareDicomStoreIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDicomStoreIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDicomStoreIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dicom_store_id': 'dicomStoreId', 'members': 'members', 'role': 'role', 'condition': 'condition'})
class HealthcareDicomStoreIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dicom_store_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["HealthcareDicomStoreIamBindingCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dicom_store_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'dicom_store_id': dicom_store_id,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dicom_store_id(self) -> str:
        return self._values.get('dicom_store_id')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["HealthcareDicomStoreIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDicomStoreIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareDicomStoreIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareDicomStoreIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, dicom_store_id: str, member: str, role: str, condition: typing.Optional[typing.List["HealthcareDicomStoreIamMemberCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dicom_store_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareDicomStoreIamMemberConfig(dicom_store_id=dicom_store_id, member=member, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareDicomStoreIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="dicomStoreId")
    def dicom_store_id(self) -> str:
        return jsii.get(self, "dicomStoreId")

    @dicom_store_id.setter
    def dicom_store_id(self, value: str) -> None:
        jsii.set(self, "dicomStoreId", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["HealthcareDicomStoreIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["HealthcareDicomStoreIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDicomStoreIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class HealthcareDicomStoreIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDicomStoreIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDicomStoreIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dicom_store_id': 'dicomStoreId', 'member': 'member', 'role': 'role', 'condition': 'condition'})
class HealthcareDicomStoreIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dicom_store_id: str, member: str, role: str, condition: typing.Optional[typing.List["HealthcareDicomStoreIamMemberCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dicom_store_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'dicom_store_id': dicom_store_id,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dicom_store_id(self) -> str:
        return self._values.get('dicom_store_id')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["HealthcareDicomStoreIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDicomStoreIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareDicomStoreIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareDicomStoreIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, dicom_store_id: str, policy_data: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dicom_store_id: 
        :param policy_data: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareDicomStoreIamPolicyConfig(dicom_store_id=dicom_store_id, policy_data=policy_data, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareDicomStoreIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="dicomStoreId")
    def dicom_store_id(self) -> str:
        return jsii.get(self, "dicomStoreId")

    @dicom_store_id.setter
    def dicom_store_id(self, value: str) -> None:
        jsii.set(self, "dicomStoreId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDicomStoreIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dicom_store_id': 'dicomStoreId', 'policy_data': 'policyData'})
class HealthcareDicomStoreIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dicom_store_id: str, policy_data: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dicom_store_id: 
        :param policy_data: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'dicom_store_id': dicom_store_id,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dicom_store_id(self) -> str:
        return self._values.get('dicom_store_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDicomStoreIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDicomStoreNotificationConfig", jsii_struct_bases=[], name_mapping={'pubsub_topic': 'pubsubTopic'})
class HealthcareDicomStoreNotificationConfig():
    def __init__(self, *, pubsub_topic: str) -> None:
        """
        :param pubsub_topic: The Cloud Pub/Sub topic that notifications of changes are published on. Supplied by the client. PubsubMessage.Data will contain the resource name. PubsubMessage.MessageId is the ID of this message. It is guaranteed to be unique within the topic. PubsubMessage.PublishTime is the time at which the message was published. Notifications are only sent if the topic is non-empty. Topic names must be scoped to a project. cloud-healthcare@system.gserviceaccount.com must have publisher permissions on the given Cloud Pub/Sub topic. Not having adequate permissions will cause the calls that send notifications to fail.
        """
        self._values = {
            'pubsub_topic': pubsub_topic,
        }

    @builtins.property
    def pubsub_topic(self) -> str:
        """The Cloud Pub/Sub topic that notifications of changes are published on.

        Supplied by the client.
        PubsubMessage.Data will contain the resource name. PubsubMessage.MessageId is the ID of this message.
        It is guaranteed to be unique within the topic. PubsubMessage.PublishTime is the time at which the message
        was published. Notifications are only sent if the topic is non-empty. Topic names must be scoped to a
        project. cloud-healthcare@system.gserviceaccount.com must have publisher permissions on the given
        Cloud Pub/Sub topic. Not having adequate permissions will cause the calls that send notifications to fail.
        """
        return self._values.get('pubsub_topic')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDicomStoreNotificationConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareDicomStoreTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class HealthcareDicomStoreTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareDicomStoreTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareFhirStore(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareFhirStore"):
    def __init__(self, scope: constructs.Construct, id: str, *, dataset: str, name: str, version: str, disable_referential_integrity: typing.Optional[bool]=None, disable_resource_versioning: typing.Optional[bool]=None, enable_history_import: typing.Optional[bool]=None, enable_update_create: typing.Optional[bool]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, notification_config: typing.Optional[typing.List["HealthcareFhirStoreNotificationConfig"]]=None, stream_configs: typing.Optional[typing.List["HealthcareFhirStoreStreamConfigs"]]=None, timeouts: typing.Optional["HealthcareFhirStoreTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dataset: Identifies the dataset addressed by this request. Must be in the format 'projects/{project}/locations/{location}/datasets/{dataset}'
        :param name: The resource name for the FhirStore. - Changing this property may recreate the FHIR store (removing all data) **
        :param version: The FHIR specification version. Possible values: ["DSTU2", "STU3", "R4"]
        :param disable_referential_integrity: Whether to disable referential integrity in this FHIR store. This field is immutable after FHIR store creation. The default value is false, meaning that the API will enforce referential integrity and fail the requests that will result in inconsistent state in the FHIR store. When this field is set to true, the API will skip referential integrity check. Consequently, operations that rely on references, such as Patient.get$everything, will not return all the results if broken references exist. - Changing this property may recreate the FHIR store (removing all data) **
        :param disable_resource_versioning: Whether to disable resource versioning for this FHIR store. This field can not be changed after the creation of FHIR store. If set to false, which is the default behavior, all write operations will cause historical versions to be recorded automatically. The historical versions can be fetched through the history APIs, but cannot be updated. If set to true, no historical versions will be kept. The server will send back errors for attempts to read the historical versions. - Changing this property may recreate the FHIR store (removing all data) **
        :param enable_history_import: Whether to allow the bulk import API to accept history bundles and directly insert historical resource versions into the FHIR store. Importing resource histories creates resource interactions that appear to have occurred in the past, which clients may not want to allow. If set to false, history bundles within an import will fail with an error. - Changing this property may recreate the FHIR store (removing all data) ** - This property can be changed manually in the Google Cloud Healthcare admin console without recreating the FHIR store **
        :param enable_update_create: Whether this FHIR store has the updateCreate capability. This determines if the client can use an Update operation to create a new resource with a client-specified ID. If false, all IDs are server-assigned through the Create operation and attempts to Update a non-existent resource will return errors. Please treat the audit logs with appropriate levels of care if client-specified resource IDs contain sensitive data such as patient identifiers, those IDs will be part of the FHIR resource path recorded in Cloud audit logs and Cloud Pub/Sub notifications.
        :param labels: User-supplied key-value pairs used to organize FHIR stores. Label keys must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62} Label values are optional, must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63} No more than 64 labels can be associated with a given store. An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        :param notification_config: notification_config block.
        :param stream_configs: stream_configs block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareFhirStoreConfig(dataset=dataset, name=name, version=version, disable_referential_integrity=disable_referential_integrity, disable_resource_versioning=disable_resource_versioning, enable_history_import=enable_history_import, enable_update_create=enable_update_create, labels=labels, notification_config=notification_config, stream_configs=stream_configs, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareFhirStore, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="dataset")
    def dataset(self) -> str:
        return jsii.get(self, "dataset")

    @dataset.setter
    def dataset(self, value: str) -> None:
        jsii.set(self, "dataset", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> str:
        return jsii.get(self, "version")

    @version.setter
    def version(self, value: str) -> None:
        jsii.set(self, "version", value)

    @builtins.property
    @jsii.member(jsii_name="disableReferentialIntegrity")
    def disable_referential_integrity(self) -> typing.Optional[bool]:
        return jsii.get(self, "disableReferentialIntegrity")

    @disable_referential_integrity.setter
    def disable_referential_integrity(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "disableReferentialIntegrity", value)

    @builtins.property
    @jsii.member(jsii_name="disableResourceVersioning")
    def disable_resource_versioning(self) -> typing.Optional[bool]:
        return jsii.get(self, "disableResourceVersioning")

    @disable_resource_versioning.setter
    def disable_resource_versioning(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "disableResourceVersioning", value)

    @builtins.property
    @jsii.member(jsii_name="enableHistoryImport")
    def enable_history_import(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableHistoryImport")

    @enable_history_import.setter
    def enable_history_import(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableHistoryImport", value)

    @builtins.property
    @jsii.member(jsii_name="enableUpdateCreate")
    def enable_update_create(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableUpdateCreate")

    @enable_update_create.setter
    def enable_update_create(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableUpdateCreate", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="notificationConfig")
    def notification_config(self) -> typing.Optional[typing.List["HealthcareFhirStoreNotificationConfig"]]:
        return jsii.get(self, "notificationConfig")

    @notification_config.setter
    def notification_config(self, value: typing.Optional[typing.List["HealthcareFhirStoreNotificationConfig"]]) -> None:
        jsii.set(self, "notificationConfig", value)

    @builtins.property
    @jsii.member(jsii_name="streamConfigs")
    def stream_configs(self) -> typing.Optional[typing.List["HealthcareFhirStoreStreamConfigs"]]:
        return jsii.get(self, "streamConfigs")

    @stream_configs.setter
    def stream_configs(self, value: typing.Optional[typing.List["HealthcareFhirStoreStreamConfigs"]]) -> None:
        jsii.set(self, "streamConfigs", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["HealthcareFhirStoreTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["HealthcareFhirStoreTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareFhirStoreConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dataset': 'dataset', 'name': 'name', 'version': 'version', 'disable_referential_integrity': 'disableReferentialIntegrity', 'disable_resource_versioning': 'disableResourceVersioning', 'enable_history_import': 'enableHistoryImport', 'enable_update_create': 'enableUpdateCreate', 'labels': 'labels', 'notification_config': 'notificationConfig', 'stream_configs': 'streamConfigs', 'timeouts': 'timeouts'})
class HealthcareFhirStoreConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dataset: str, name: str, version: str, disable_referential_integrity: typing.Optional[bool]=None, disable_resource_versioning: typing.Optional[bool]=None, enable_history_import: typing.Optional[bool]=None, enable_update_create: typing.Optional[bool]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, notification_config: typing.Optional[typing.List["HealthcareFhirStoreNotificationConfig"]]=None, stream_configs: typing.Optional[typing.List["HealthcareFhirStoreStreamConfigs"]]=None, timeouts: typing.Optional["HealthcareFhirStoreTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dataset: Identifies the dataset addressed by this request. Must be in the format 'projects/{project}/locations/{location}/datasets/{dataset}'
        :param name: The resource name for the FhirStore. - Changing this property may recreate the FHIR store (removing all data) **
        :param version: The FHIR specification version. Possible values: ["DSTU2", "STU3", "R4"]
        :param disable_referential_integrity: Whether to disable referential integrity in this FHIR store. This field is immutable after FHIR store creation. The default value is false, meaning that the API will enforce referential integrity and fail the requests that will result in inconsistent state in the FHIR store. When this field is set to true, the API will skip referential integrity check. Consequently, operations that rely on references, such as Patient.get$everything, will not return all the results if broken references exist. - Changing this property may recreate the FHIR store (removing all data) **
        :param disable_resource_versioning: Whether to disable resource versioning for this FHIR store. This field can not be changed after the creation of FHIR store. If set to false, which is the default behavior, all write operations will cause historical versions to be recorded automatically. The historical versions can be fetched through the history APIs, but cannot be updated. If set to true, no historical versions will be kept. The server will send back errors for attempts to read the historical versions. - Changing this property may recreate the FHIR store (removing all data) **
        :param enable_history_import: Whether to allow the bulk import API to accept history bundles and directly insert historical resource versions into the FHIR store. Importing resource histories creates resource interactions that appear to have occurred in the past, which clients may not want to allow. If set to false, history bundles within an import will fail with an error. - Changing this property may recreate the FHIR store (removing all data) ** - This property can be changed manually in the Google Cloud Healthcare admin console without recreating the FHIR store **
        :param enable_update_create: Whether this FHIR store has the updateCreate capability. This determines if the client can use an Update operation to create a new resource with a client-specified ID. If false, all IDs are server-assigned through the Create operation and attempts to Update a non-existent resource will return errors. Please treat the audit logs with appropriate levels of care if client-specified resource IDs contain sensitive data such as patient identifiers, those IDs will be part of the FHIR resource path recorded in Cloud audit logs and Cloud Pub/Sub notifications.
        :param labels: User-supplied key-value pairs used to organize FHIR stores. Label keys must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62} Label values are optional, must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63} No more than 64 labels can be associated with a given store. An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        :param notification_config: notification_config block.
        :param stream_configs: stream_configs block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = HealthcareFhirStoreTimeouts(**timeouts)
        self._values = {
            'dataset': dataset,
            'name': name,
            'version': version,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if disable_referential_integrity is not None: self._values["disable_referential_integrity"] = disable_referential_integrity
        if disable_resource_versioning is not None: self._values["disable_resource_versioning"] = disable_resource_versioning
        if enable_history_import is not None: self._values["enable_history_import"] = enable_history_import
        if enable_update_create is not None: self._values["enable_update_create"] = enable_update_create
        if labels is not None: self._values["labels"] = labels
        if notification_config is not None: self._values["notification_config"] = notification_config
        if stream_configs is not None: self._values["stream_configs"] = stream_configs
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dataset(self) -> str:
        """Identifies the dataset addressed by this request.

        Must be in the format
        'projects/{project}/locations/{location}/datasets/{dataset}'
        """
        return self._values.get('dataset')

    @builtins.property
    def name(self) -> str:
        """The resource name for the FhirStore.

        - Changing this property may recreate the FHIR store (removing all data) **
        """
        return self._values.get('name')

    @builtins.property
    def version(self) -> str:
        """The FHIR specification version.

        Possible values: ["DSTU2", "STU3", "R4"]
        """
        return self._values.get('version')

    @builtins.property
    def disable_referential_integrity(self) -> typing.Optional[bool]:
        """Whether to disable referential integrity in this FHIR store.

        This field is immutable after FHIR store
        creation. The default value is false, meaning that the API will enforce referential integrity and fail the
        requests that will result in inconsistent state in the FHIR store. When this field is set to true, the API
        will skip referential integrity check. Consequently, operations that rely on references, such as
        Patient.get$everything, will not return all the results if broken references exist.

        - Changing this property may recreate the FHIR store (removing all data) **
        """
        return self._values.get('disable_referential_integrity')

    @builtins.property
    def disable_resource_versioning(self) -> typing.Optional[bool]:
        """Whether to disable resource versioning for this FHIR store.

        This field can not be changed after the creation
        of FHIR store. If set to false, which is the default behavior, all write operations will cause historical
        versions to be recorded automatically. The historical versions can be fetched through the history APIs, but
        cannot be updated. If set to true, no historical versions will be kept. The server will send back errors for
        attempts to read the historical versions.

        - Changing this property may recreate the FHIR store (removing all data) **
        """
        return self._values.get('disable_resource_versioning')

    @builtins.property
    def enable_history_import(self) -> typing.Optional[bool]:
        """Whether to allow the bulk import API to accept history bundles and directly insert historical resource versions into the FHIR store.

        Importing resource histories creates resource interactions that appear to have
        occurred in the past, which clients may not want to allow. If set to false, history bundles within an import
        will fail with an error.

        - Changing this property may recreate the FHIR store (removing all data) **
        - This property can be changed manually in the Google Cloud Healthcare admin console without recreating the FHIR store **
        """
        return self._values.get('enable_history_import')

    @builtins.property
    def enable_update_create(self) -> typing.Optional[bool]:
        """Whether this FHIR store has the updateCreate capability.

        This determines if the client can use an Update
        operation to create a new resource with a client-specified ID. If false, all IDs are server-assigned through
        the Create operation and attempts to Update a non-existent resource will return errors. Please treat the audit
        logs with appropriate levels of care if client-specified resource IDs contain sensitive data such as patient
        identifiers, those IDs will be part of the FHIR resource path recorded in Cloud audit logs and Cloud Pub/Sub
        notifications.
        """
        return self._values.get('enable_update_create')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """User-supplied key-value pairs used to organize FHIR stores.

        Label keys must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must
        conform to the following PCRE regular expression: [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62}

        Label values are optional, must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128
        bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63}

        No more than 64 labels can be associated with a given store.

        An object containing a list of "key": value pairs.
        Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        """
        return self._values.get('labels')

    @builtins.property
    def notification_config(self) -> typing.Optional[typing.List["HealthcareFhirStoreNotificationConfig"]]:
        """notification_config block."""
        return self._values.get('notification_config')

    @builtins.property
    def stream_configs(self) -> typing.Optional[typing.List["HealthcareFhirStoreStreamConfigs"]]:
        """stream_configs block."""
        return self._values.get('stream_configs')

    @builtins.property
    def timeouts(self) -> typing.Optional["HealthcareFhirStoreTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareFhirStoreConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareFhirStoreIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareFhirStoreIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, fhir_store_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["HealthcareFhirStoreIamBindingCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param fhir_store_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareFhirStoreIamBindingConfig(fhir_store_id=fhir_store_id, members=members, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareFhirStoreIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="fhirStoreId")
    def fhir_store_id(self) -> str:
        return jsii.get(self, "fhirStoreId")

    @fhir_store_id.setter
    def fhir_store_id(self, value: str) -> None:
        jsii.set(self, "fhirStoreId", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["HealthcareFhirStoreIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["HealthcareFhirStoreIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareFhirStoreIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class HealthcareFhirStoreIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareFhirStoreIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareFhirStoreIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'fhir_store_id': 'fhirStoreId', 'members': 'members', 'role': 'role', 'condition': 'condition'})
class HealthcareFhirStoreIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, fhir_store_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["HealthcareFhirStoreIamBindingCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param fhir_store_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'fhir_store_id': fhir_store_id,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def fhir_store_id(self) -> str:
        return self._values.get('fhir_store_id')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["HealthcareFhirStoreIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareFhirStoreIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareFhirStoreIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareFhirStoreIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, fhir_store_id: str, member: str, role: str, condition: typing.Optional[typing.List["HealthcareFhirStoreIamMemberCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param fhir_store_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareFhirStoreIamMemberConfig(fhir_store_id=fhir_store_id, member=member, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareFhirStoreIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="fhirStoreId")
    def fhir_store_id(self) -> str:
        return jsii.get(self, "fhirStoreId")

    @fhir_store_id.setter
    def fhir_store_id(self, value: str) -> None:
        jsii.set(self, "fhirStoreId", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["HealthcareFhirStoreIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["HealthcareFhirStoreIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareFhirStoreIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class HealthcareFhirStoreIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareFhirStoreIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareFhirStoreIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'fhir_store_id': 'fhirStoreId', 'member': 'member', 'role': 'role', 'condition': 'condition'})
class HealthcareFhirStoreIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, fhir_store_id: str, member: str, role: str, condition: typing.Optional[typing.List["HealthcareFhirStoreIamMemberCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param fhir_store_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'fhir_store_id': fhir_store_id,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def fhir_store_id(self) -> str:
        return self._values.get('fhir_store_id')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["HealthcareFhirStoreIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareFhirStoreIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareFhirStoreIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareFhirStoreIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, fhir_store_id: str, policy_data: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param fhir_store_id: 
        :param policy_data: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareFhirStoreIamPolicyConfig(fhir_store_id=fhir_store_id, policy_data=policy_data, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareFhirStoreIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="fhirStoreId")
    def fhir_store_id(self) -> str:
        return jsii.get(self, "fhirStoreId")

    @fhir_store_id.setter
    def fhir_store_id(self, value: str) -> None:
        jsii.set(self, "fhirStoreId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareFhirStoreIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'fhir_store_id': 'fhirStoreId', 'policy_data': 'policyData'})
class HealthcareFhirStoreIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, fhir_store_id: str, policy_data: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param fhir_store_id: 
        :param policy_data: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'fhir_store_id': fhir_store_id,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def fhir_store_id(self) -> str:
        return self._values.get('fhir_store_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareFhirStoreIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareFhirStoreNotificationConfig", jsii_struct_bases=[], name_mapping={'pubsub_topic': 'pubsubTopic'})
class HealthcareFhirStoreNotificationConfig():
    def __init__(self, *, pubsub_topic: str) -> None:
        """
        :param pubsub_topic: The Cloud Pub/Sub topic that notifications of changes are published on. Supplied by the client. PubsubMessage.Data will contain the resource name. PubsubMessage.MessageId is the ID of this message. It is guaranteed to be unique within the topic. PubsubMessage.PublishTime is the time at which the message was published. Notifications are only sent if the topic is non-empty. Topic names must be scoped to a project. cloud-healthcare@system.gserviceaccount.com must have publisher permissions on the given Cloud Pub/Sub topic. Not having adequate permissions will cause the calls that send notifications to fail.
        """
        self._values = {
            'pubsub_topic': pubsub_topic,
        }

    @builtins.property
    def pubsub_topic(self) -> str:
        """The Cloud Pub/Sub topic that notifications of changes are published on.

        Supplied by the client.
        PubsubMessage.Data will contain the resource name. PubsubMessage.MessageId is the ID of this message.
        It is guaranteed to be unique within the topic. PubsubMessage.PublishTime is the time at which the message
        was published. Notifications are only sent if the topic is non-empty. Topic names must be scoped to a
        project. cloud-healthcare@system.gserviceaccount.com must have publisher permissions on the given
        Cloud Pub/Sub topic. Not having adequate permissions will cause the calls that send notifications to fail.
        """
        return self._values.get('pubsub_topic')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareFhirStoreNotificationConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareFhirStoreStreamConfigs", jsii_struct_bases=[], name_mapping={'bigquery_destination': 'bigqueryDestination', 'resource_types': 'resourceTypes'})
class HealthcareFhirStoreStreamConfigs():
    def __init__(self, *, bigquery_destination: typing.List["HealthcareFhirStoreStreamConfigsBigqueryDestination"], resource_types: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param bigquery_destination: bigquery_destination block.
        :param resource_types: Supply a FHIR resource type (such as "Patient" or "Observation"). See https://www.hl7.org/fhir/valueset-resource-types.html for a list of all FHIR resource types. The server treats an empty list as an intent to stream all the supported resource types in this FHIR store.
        """
        self._values = {
            'bigquery_destination': bigquery_destination,
        }
        if resource_types is not None: self._values["resource_types"] = resource_types

    @builtins.property
    def bigquery_destination(self) -> typing.List["HealthcareFhirStoreStreamConfigsBigqueryDestination"]:
        """bigquery_destination block."""
        return self._values.get('bigquery_destination')

    @builtins.property
    def resource_types(self) -> typing.Optional[typing.List[str]]:
        """Supply a FHIR resource type (such as "Patient" or "Observation").

        See
        https://www.hl7.org/fhir/valueset-resource-types.html for a list of all FHIR resource types. The server treats
        an empty list as an intent to stream all the supported resource types in this FHIR store.
        """
        return self._values.get('resource_types')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareFhirStoreStreamConfigs(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareFhirStoreStreamConfigsBigqueryDestination", jsii_struct_bases=[], name_mapping={'dataset_uri': 'datasetUri', 'schema_config': 'schemaConfig'})
class HealthcareFhirStoreStreamConfigsBigqueryDestination():
    def __init__(self, *, dataset_uri: str, schema_config: typing.List["HealthcareFhirStoreStreamConfigsBigqueryDestinationSchemaConfig"]) -> None:
        """
        :param dataset_uri: BigQuery URI to a dataset, up to 2000 characters long, in the format bq://projectId.bqDatasetId.
        :param schema_config: schema_config block.
        """
        self._values = {
            'dataset_uri': dataset_uri,
            'schema_config': schema_config,
        }

    @builtins.property
    def dataset_uri(self) -> str:
        """BigQuery URI to a dataset, up to 2000 characters long, in the format bq://projectId.bqDatasetId."""
        return self._values.get('dataset_uri')

    @builtins.property
    def schema_config(self) -> typing.List["HealthcareFhirStoreStreamConfigsBigqueryDestinationSchemaConfig"]:
        """schema_config block."""
        return self._values.get('schema_config')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareFhirStoreStreamConfigsBigqueryDestination(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareFhirStoreStreamConfigsBigqueryDestinationSchemaConfig", jsii_struct_bases=[], name_mapping={'recursive_structure_depth': 'recursiveStructureDepth', 'schema_type': 'schemaType'})
class HealthcareFhirStoreStreamConfigsBigqueryDestinationSchemaConfig():
    def __init__(self, *, recursive_structure_depth: jsii.Number, schema_type: typing.Optional[str]=None) -> None:
        """
        :param recursive_structure_depth: The depth for all recursive structures in the output analytics schema. For example, concept in the CodeSystem resource is a recursive structure; when the depth is 2, the CodeSystem table will have a column called concept.concept but not concept.concept.concept. If not specified or set to 0, the server will use the default value 2. The maximum depth allowed is 5.
        :param schema_type: Specifies the output schema type. Only ANALYTICS is supported at this time. ANALYTICS: Analytics schema defined by the FHIR community. See https://github.com/FHIR/sql-on-fhir/blob/master/sql-on-fhir.md. Default value: "ANALYTICS" Possible values: ["ANALYTICS"]
        """
        self._values = {
            'recursive_structure_depth': recursive_structure_depth,
        }
        if schema_type is not None: self._values["schema_type"] = schema_type

    @builtins.property
    def recursive_structure_depth(self) -> jsii.Number:
        """The depth for all recursive structures in the output analytics schema.

        For example, concept in the CodeSystem
        resource is a recursive structure; when the depth is 2, the CodeSystem table will have a column called
        concept.concept but not concept.concept.concept. If not specified or set to 0, the server will use the default
        value 2. The maximum depth allowed is 5.
        """
        return self._values.get('recursive_structure_depth')

    @builtins.property
    def schema_type(self) -> typing.Optional[str]:
        """Specifies the output schema type.

        Only ANALYTICS is supported at this time.
        ANALYTICS: Analytics schema defined by the FHIR community.
        See https://github.com/FHIR/sql-on-fhir/blob/master/sql-on-fhir.md. Default value: "ANALYTICS" Possible values: ["ANALYTICS"]
        """
        return self._values.get('schema_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareFhirStoreStreamConfigsBigqueryDestinationSchemaConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareFhirStoreTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class HealthcareFhirStoreTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareFhirStoreTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareHl7V2Store(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareHl7V2Store"):
    def __init__(self, scope: constructs.Construct, id: str, *, dataset: str, name: str, labels: typing.Optional[typing.Mapping[str, str]]=None, notification_config: typing.Optional[typing.List["HealthcareHl7V2StoreNotificationConfig"]]=None, notification_configs: typing.Optional[typing.List["HealthcareHl7V2StoreNotificationConfigs"]]=None, parser_config: typing.Optional[typing.List["HealthcareHl7V2StoreParserConfig"]]=None, timeouts: typing.Optional["HealthcareHl7V2StoreTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dataset: Identifies the dataset addressed by this request. Must be in the format 'projects/{project}/locations/{location}/datasets/{dataset}'
        :param name: The resource name for the Hl7V2Store. - Changing this property may recreate the Hl7v2 store (removing all data) **
        :param labels: User-supplied key-value pairs used to organize HL7v2 stores. Label keys must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62} Label values are optional, must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63} No more than 64 labels can be associated with a given store. An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        :param notification_config: notification_config block.
        :param notification_configs: notification_configs block.
        :param parser_config: parser_config block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareHl7V2StoreConfig(dataset=dataset, name=name, labels=labels, notification_config=notification_config, notification_configs=notification_configs, parser_config=parser_config, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareHl7V2Store, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="dataset")
    def dataset(self) -> str:
        return jsii.get(self, "dataset")

    @dataset.setter
    def dataset(self, value: str) -> None:
        jsii.set(self, "dataset", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="notificationConfig")
    def notification_config(self) -> typing.Optional[typing.List["HealthcareHl7V2StoreNotificationConfig"]]:
        return jsii.get(self, "notificationConfig")

    @notification_config.setter
    def notification_config(self, value: typing.Optional[typing.List["HealthcareHl7V2StoreNotificationConfig"]]) -> None:
        jsii.set(self, "notificationConfig", value)

    @builtins.property
    @jsii.member(jsii_name="notificationConfigs")
    def notification_configs(self) -> typing.Optional[typing.List["HealthcareHl7V2StoreNotificationConfigs"]]:
        return jsii.get(self, "notificationConfigs")

    @notification_configs.setter
    def notification_configs(self, value: typing.Optional[typing.List["HealthcareHl7V2StoreNotificationConfigs"]]) -> None:
        jsii.set(self, "notificationConfigs", value)

    @builtins.property
    @jsii.member(jsii_name="parserConfig")
    def parser_config(self) -> typing.Optional[typing.List["HealthcareHl7V2StoreParserConfig"]]:
        return jsii.get(self, "parserConfig")

    @parser_config.setter
    def parser_config(self, value: typing.Optional[typing.List["HealthcareHl7V2StoreParserConfig"]]) -> None:
        jsii.set(self, "parserConfig", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["HealthcareHl7V2StoreTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["HealthcareHl7V2StoreTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dataset': 'dataset', 'name': 'name', 'labels': 'labels', 'notification_config': 'notificationConfig', 'notification_configs': 'notificationConfigs', 'parser_config': 'parserConfig', 'timeouts': 'timeouts'})
class HealthcareHl7V2StoreConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dataset: str, name: str, labels: typing.Optional[typing.Mapping[str, str]]=None, notification_config: typing.Optional[typing.List["HealthcareHl7V2StoreNotificationConfig"]]=None, notification_configs: typing.Optional[typing.List["HealthcareHl7V2StoreNotificationConfigs"]]=None, parser_config: typing.Optional[typing.List["HealthcareHl7V2StoreParserConfig"]]=None, timeouts: typing.Optional["HealthcareHl7V2StoreTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dataset: Identifies the dataset addressed by this request. Must be in the format 'projects/{project}/locations/{location}/datasets/{dataset}'
        :param name: The resource name for the Hl7V2Store. - Changing this property may recreate the Hl7v2 store (removing all data) **
        :param labels: User-supplied key-value pairs used to organize HL7v2 stores. Label keys must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62} Label values are optional, must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63} No more than 64 labels can be associated with a given store. An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        :param notification_config: notification_config block.
        :param notification_configs: notification_configs block.
        :param parser_config: parser_config block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = HealthcareHl7V2StoreTimeouts(**timeouts)
        self._values = {
            'dataset': dataset,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if labels is not None: self._values["labels"] = labels
        if notification_config is not None: self._values["notification_config"] = notification_config
        if notification_configs is not None: self._values["notification_configs"] = notification_configs
        if parser_config is not None: self._values["parser_config"] = parser_config
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dataset(self) -> str:
        """Identifies the dataset addressed by this request.

        Must be in the format
        'projects/{project}/locations/{location}/datasets/{dataset}'
        """
        return self._values.get('dataset')

    @builtins.property
    def name(self) -> str:
        """The resource name for the Hl7V2Store.

        - Changing this property may recreate the Hl7v2 store (removing all data) **
        """
        return self._values.get('name')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """User-supplied key-value pairs used to organize HL7v2 stores.

        Label keys must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must
        conform to the following PCRE regular expression: [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62}

        Label values are optional, must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128
        bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63}

        No more than 64 labels can be associated with a given store.

        An object containing a list of "key": value pairs.
        Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        """
        return self._values.get('labels')

    @builtins.property
    def notification_config(self) -> typing.Optional[typing.List["HealthcareHl7V2StoreNotificationConfig"]]:
        """notification_config block."""
        return self._values.get('notification_config')

    @builtins.property
    def notification_configs(self) -> typing.Optional[typing.List["HealthcareHl7V2StoreNotificationConfigs"]]:
        """notification_configs block."""
        return self._values.get('notification_configs')

    @builtins.property
    def parser_config(self) -> typing.Optional[typing.List["HealthcareHl7V2StoreParserConfig"]]:
        """parser_config block."""
        return self._values.get('parser_config')

    @builtins.property
    def timeouts(self) -> typing.Optional["HealthcareHl7V2StoreTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareHl7V2StoreConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareHl7V2StoreIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, hl7_v2_store_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["HealthcareHl7V2StoreIamBindingCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param hl7_v2_store_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareHl7V2StoreIamBindingConfig(hl7_v2_store_id=hl7_v2_store_id, members=members, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareHl7V2StoreIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="hl7V2StoreId")
    def hl7_v2_store_id(self) -> str:
        return jsii.get(self, "hl7V2StoreId")

    @hl7_v2_store_id.setter
    def hl7_v2_store_id(self, value: str) -> None:
        jsii.set(self, "hl7V2StoreId", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["HealthcareHl7V2StoreIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["HealthcareHl7V2StoreIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class HealthcareHl7V2StoreIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareHl7V2StoreIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'hl7_v2_store_id': 'hl7V2StoreId', 'members': 'members', 'role': 'role', 'condition': 'condition'})
class HealthcareHl7V2StoreIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, hl7_v2_store_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["HealthcareHl7V2StoreIamBindingCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param hl7_v2_store_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'hl7_v2_store_id': hl7_v2_store_id,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def hl7_v2_store_id(self) -> str:
        return self._values.get('hl7_v2_store_id')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["HealthcareHl7V2StoreIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareHl7V2StoreIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareHl7V2StoreIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, hl7_v2_store_id: str, member: str, role: str, condition: typing.Optional[typing.List["HealthcareHl7V2StoreIamMemberCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param hl7_v2_store_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareHl7V2StoreIamMemberConfig(hl7_v2_store_id=hl7_v2_store_id, member=member, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareHl7V2StoreIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="hl7V2StoreId")
    def hl7_v2_store_id(self) -> str:
        return jsii.get(self, "hl7V2StoreId")

    @hl7_v2_store_id.setter
    def hl7_v2_store_id(self, value: str) -> None:
        jsii.set(self, "hl7V2StoreId", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["HealthcareHl7V2StoreIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["HealthcareHl7V2StoreIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class HealthcareHl7V2StoreIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareHl7V2StoreIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'hl7_v2_store_id': 'hl7V2StoreId', 'member': 'member', 'role': 'role', 'condition': 'condition'})
class HealthcareHl7V2StoreIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, hl7_v2_store_id: str, member: str, role: str, condition: typing.Optional[typing.List["HealthcareHl7V2StoreIamMemberCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param hl7_v2_store_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'hl7_v2_store_id': hl7_v2_store_id,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def hl7_v2_store_id(self) -> str:
        return self._values.get('hl7_v2_store_id')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["HealthcareHl7V2StoreIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareHl7V2StoreIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class HealthcareHl7V2StoreIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, hl7_v2_store_id: str, policy_data: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param hl7_v2_store_id: 
        :param policy_data: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = HealthcareHl7V2StoreIamPolicyConfig(hl7_v2_store_id=hl7_v2_store_id, policy_data=policy_data, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(HealthcareHl7V2StoreIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="hl7V2StoreId")
    def hl7_v2_store_id(self) -> str:
        return jsii.get(self, "hl7V2StoreId")

    @hl7_v2_store_id.setter
    def hl7_v2_store_id(self, value: str) -> None:
        jsii.set(self, "hl7V2StoreId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'hl7_v2_store_id': 'hl7V2StoreId', 'policy_data': 'policyData'})
class HealthcareHl7V2StoreIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, hl7_v2_store_id: str, policy_data: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param hl7_v2_store_id: 
        :param policy_data: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'hl7_v2_store_id': hl7_v2_store_id,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def hl7_v2_store_id(self) -> str:
        return self._values.get('hl7_v2_store_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareHl7V2StoreIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreNotificationConfig", jsii_struct_bases=[], name_mapping={'pubsub_topic': 'pubsubTopic'})
class HealthcareHl7V2StoreNotificationConfig():
    def __init__(self, *, pubsub_topic: str) -> None:
        """
        :param pubsub_topic: The Cloud Pub/Sub topic that notifications of changes are published on. Supplied by the client. PubsubMessage.Data will contain the resource name. PubsubMessage.MessageId is the ID of this message. It is guaranteed to be unique within the topic. PubsubMessage.PublishTime is the time at which the message was published. Notifications are only sent if the topic is non-empty. Topic names must be scoped to a project. cloud-healthcare@system.gserviceaccount.com must have publisher permissions on the given Cloud Pub/Sub topic. Not having adequate permissions will cause the calls that send notifications to fail.
        """
        self._values = {
            'pubsub_topic': pubsub_topic,
        }

    @builtins.property
    def pubsub_topic(self) -> str:
        """The Cloud Pub/Sub topic that notifications of changes are published on.

        Supplied by the client.
        PubsubMessage.Data will contain the resource name. PubsubMessage.MessageId is the ID of this message.
        It is guaranteed to be unique within the topic. PubsubMessage.PublishTime is the time at which the message
        was published. Notifications are only sent if the topic is non-empty. Topic names must be scoped to a
        project. cloud-healthcare@system.gserviceaccount.com must have publisher permissions on the given
        Cloud Pub/Sub topic. Not having adequate permissions will cause the calls that send notifications to fail.
        """
        return self._values.get('pubsub_topic')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareHl7V2StoreNotificationConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreNotificationConfigs", jsii_struct_bases=[], name_mapping={'pubsub_topic': 'pubsubTopic', 'filter': 'filter'})
class HealthcareHl7V2StoreNotificationConfigs():
    def __init__(self, *, pubsub_topic: str, filter: typing.Optional[str]=None) -> None:
        """
        :param pubsub_topic: The Cloud Pub/Sub topic that notifications of changes are published on. Supplied by the client. PubsubMessage.Data will contain the resource name. PubsubMessage.MessageId is the ID of this message. It is guaranteed to be unique within the topic. PubsubMessage.PublishTime is the time at which the message was published. Notifications are only sent if the topic is non-empty. Topic names must be scoped to a project. cloud-healthcare@system.gserviceaccount.com must have publisher permissions on the given Cloud Pub/Sub topic. Not having adequate permissions will cause the calls that send notifications to fail. If a notification cannot be published to Cloud Pub/Sub, errors will be logged to Stackdriver
        :param filter: Restricts notifications sent for messages matching a filter. If this is empty, all messages are matched. Syntax: https://cloud.google.com/appengine/docs/standard/python/search/query_strings. Fields/functions available for filtering are: messageType, from the MSH-9.1 field. For example, NOT messageType = "ADT". send_date or sendDate, the YYYY-MM-DD date the message was sent in the dataset's timeZone, from the MSH-7 segment. For example, send_date < "2017-01-02". sendTime, the timestamp when the message was sent, using the RFC3339 time format for comparisons, from the MSH-7 segment. For example, sendTime < "2017-01-02T00:00:00-05:00". sendFacility, the care center that the message came from, from the MSH-4 segment. For example, sendFacility = "ABC". PatientId(value, type), which matches if the message lists a patient having an ID of the given value and type in the PID-2, PID-3, or PID-4 segments. For example, PatientId("123456", "MRN"). labels.x, a string value of the label with key x as set using the Message.labels map. For example, labels."priority"="high". The operator :* can be used to assert the existence of a label. For example, labels."priority":*.
        """
        self._values = {
            'pubsub_topic': pubsub_topic,
        }
        if filter is not None: self._values["filter"] = filter

    @builtins.property
    def pubsub_topic(self) -> str:
        """The Cloud Pub/Sub topic that notifications of changes are published on.

        Supplied by the client.
        PubsubMessage.Data will contain the resource name. PubsubMessage.MessageId is the ID of this message.
        It is guaranteed to be unique within the topic. PubsubMessage.PublishTime is the time at which the message
        was published. Notifications are only sent if the topic is non-empty. Topic names must be scoped to a
        project. cloud-healthcare@system.gserviceaccount.com must have publisher permissions on the given
        Cloud Pub/Sub topic. Not having adequate permissions will cause the calls that send notifications to fail.

        If a notification cannot be published to Cloud Pub/Sub, errors will be logged to Stackdriver
        """
        return self._values.get('pubsub_topic')

    @builtins.property
    def filter(self) -> typing.Optional[str]:
        """Restricts notifications sent for messages matching a filter. If this is empty, all messages are matched. Syntax: https://cloud.google.com/appengine/docs/standard/python/search/query_strings.

        Fields/functions available for filtering are:

        messageType, from the MSH-9.1 field. For example, NOT messageType = "ADT".
        send_date or sendDate, the YYYY-MM-DD date the message was sent in the dataset's timeZone, from the MSH-7 segment. For example, send_date < "2017-01-02".
        sendTime, the timestamp when the message was sent, using the RFC3339 time format for comparisons, from the MSH-7 segment. For example, sendTime < "2017-01-02T00:00:00-05:00".
        sendFacility, the care center that the message came from, from the MSH-4 segment. For example, sendFacility = "ABC".
        PatientId(value, type), which matches if the message lists a patient having an ID of the given value and type in the PID-2, PID-3, or PID-4 segments. For example, PatientId("123456", "MRN").
        labels.x, a string value of the label with key x as set using the Message.labels map. For example, labels."priority"="high". The operator :* can be used to assert the existence of a label. For example, labels."priority":*.
        """
        return self._values.get('filter')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareHl7V2StoreNotificationConfigs(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreParserConfig", jsii_struct_bases=[], name_mapping={'allow_null_header': 'allowNullHeader', 'schema': 'schema', 'segment_terminator': 'segmentTerminator'})
class HealthcareHl7V2StoreParserConfig():
    def __init__(self, *, allow_null_header: typing.Optional[bool]=None, schema: typing.Optional[str]=None, segment_terminator: typing.Optional[str]=None) -> None:
        """
        :param allow_null_header: Determines whether messages with no header are allowed.
        :param schema: JSON encoded string for schemas used to parse messages in this store if schematized parsing is desired.
        :param segment_terminator: Byte(s) to be used as the segment terminator. If this is unset, '\r' will be used as segment terminator. A base64-encoded string.
        """
        self._values = {
        }
        if allow_null_header is not None: self._values["allow_null_header"] = allow_null_header
        if schema is not None: self._values["schema"] = schema
        if segment_terminator is not None: self._values["segment_terminator"] = segment_terminator

    @builtins.property
    def allow_null_header(self) -> typing.Optional[bool]:
        """Determines whether messages with no header are allowed."""
        return self._values.get('allow_null_header')

    @builtins.property
    def schema(self) -> typing.Optional[str]:
        """JSON encoded string for schemas used to parse messages in this store if schematized parsing is desired."""
        return self._values.get('schema')

    @builtins.property
    def segment_terminator(self) -> typing.Optional[str]:
        """Byte(s) to be used as the segment terminator. If this is unset, '\r' will be used as segment terminator.

        A base64-encoded string.
        """
        return self._values.get('segment_terminator')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareHl7V2StoreParserConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.HealthcareHl7V2StoreTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class HealthcareHl7V2StoreTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'HealthcareHl7V2StoreTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapAppEngineServiceIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapAppEngineServiceIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, app_id: str, members: typing.List[str], role: str, service: str, condition: typing.Optional[typing.List["IapAppEngineServiceIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param app_id: 
        :param members: 
        :param role: 
        :param service: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapAppEngineServiceIamBindingConfig(app_id=app_id, members=members, role=role, service=service, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapAppEngineServiceIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="appId")
    def app_id(self) -> str:
        return jsii.get(self, "appId")

    @app_id.setter
    def app_id(self, value: str) -> None:
        jsii.set(self, "appId", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapAppEngineServiceIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapAppEngineServiceIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapAppEngineServiceIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapAppEngineServiceIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapAppEngineServiceIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapAppEngineServiceIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'app_id': 'appId', 'members': 'members', 'role': 'role', 'service': 'service', 'condition': 'condition', 'project': 'project'})
class IapAppEngineServiceIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, app_id: str, members: typing.List[str], role: str, service: str, condition: typing.Optional[typing.List["IapAppEngineServiceIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_id: 
        :param members: 
        :param role: 
        :param service: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'app_id': app_id,
            'members': members,
            'role': role,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def app_id(self) -> str:
        return self._values.get('app_id')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def service(self) -> str:
        return self._values.get('service')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapAppEngineServiceIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapAppEngineServiceIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapAppEngineServiceIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapAppEngineServiceIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, app_id: str, member: str, role: str, service: str, condition: typing.Optional[typing.List["IapAppEngineServiceIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param app_id: 
        :param member: 
        :param role: 
        :param service: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapAppEngineServiceIamMemberConfig(app_id=app_id, member=member, role=role, service=service, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapAppEngineServiceIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="appId")
    def app_id(self) -> str:
        return jsii.get(self, "appId")

    @app_id.setter
    def app_id(self, value: str) -> None:
        jsii.set(self, "appId", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapAppEngineServiceIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapAppEngineServiceIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapAppEngineServiceIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapAppEngineServiceIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapAppEngineServiceIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapAppEngineServiceIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'app_id': 'appId', 'member': 'member', 'role': 'role', 'service': 'service', 'condition': 'condition', 'project': 'project'})
class IapAppEngineServiceIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, app_id: str, member: str, role: str, service: str, condition: typing.Optional[typing.List["IapAppEngineServiceIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_id: 
        :param member: 
        :param role: 
        :param service: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'app_id': app_id,
            'member': member,
            'role': role,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def app_id(self) -> str:
        return self._values.get('app_id')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def service(self) -> str:
        return self._values.get('service')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapAppEngineServiceIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapAppEngineServiceIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapAppEngineServiceIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapAppEngineServiceIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, app_id: str, policy_data: str, service: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param app_id: 
        :param policy_data: 
        :param service: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapAppEngineServiceIamPolicyConfig(app_id=app_id, policy_data=policy_data, service=service, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapAppEngineServiceIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="appId")
    def app_id(self) -> str:
        return jsii.get(self, "appId")

    @app_id.setter
    def app_id(self, value: str) -> None:
        jsii.set(self, "appId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapAppEngineServiceIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'app_id': 'appId', 'policy_data': 'policyData', 'service': 'service', 'project': 'project'})
class IapAppEngineServiceIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, app_id: str, policy_data: str, service: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_id: 
        :param policy_data: 
        :param service: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'app_id': app_id,
            'policy_data': policy_data,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def app_id(self) -> str:
        return self._values.get('app_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def service(self) -> str:
        return self._values.get('service')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapAppEngineServiceIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapAppEngineVersionIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapAppEngineVersionIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, app_id: str, members: typing.List[str], role: str, service: str, version_id: str, condition: typing.Optional[typing.List["IapAppEngineVersionIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param app_id: 
        :param members: 
        :param role: 
        :param service: 
        :param version_id: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapAppEngineVersionIamBindingConfig(app_id=app_id, members=members, role=role, service=service, version_id=version_id, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapAppEngineVersionIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="appId")
    def app_id(self) -> str:
        return jsii.get(self, "appId")

    @app_id.setter
    def app_id(self, value: str) -> None:
        jsii.set(self, "appId", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="versionId")
    def version_id(self) -> str:
        return jsii.get(self, "versionId")

    @version_id.setter
    def version_id(self, value: str) -> None:
        jsii.set(self, "versionId", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapAppEngineVersionIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapAppEngineVersionIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapAppEngineVersionIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapAppEngineVersionIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapAppEngineVersionIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapAppEngineVersionIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'app_id': 'appId', 'members': 'members', 'role': 'role', 'service': 'service', 'version_id': 'versionId', 'condition': 'condition', 'project': 'project'})
class IapAppEngineVersionIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, app_id: str, members: typing.List[str], role: str, service: str, version_id: str, condition: typing.Optional[typing.List["IapAppEngineVersionIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_id: 
        :param members: 
        :param role: 
        :param service: 
        :param version_id: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'app_id': app_id,
            'members': members,
            'role': role,
            'service': service,
            'version_id': version_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def app_id(self) -> str:
        return self._values.get('app_id')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def service(self) -> str:
        return self._values.get('service')

    @builtins.property
    def version_id(self) -> str:
        return self._values.get('version_id')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapAppEngineVersionIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapAppEngineVersionIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapAppEngineVersionIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapAppEngineVersionIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, app_id: str, member: str, role: str, service: str, version_id: str, condition: typing.Optional[typing.List["IapAppEngineVersionIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param app_id: 
        :param member: 
        :param role: 
        :param service: 
        :param version_id: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapAppEngineVersionIamMemberConfig(app_id=app_id, member=member, role=role, service=service, version_id=version_id, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapAppEngineVersionIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="appId")
    def app_id(self) -> str:
        return jsii.get(self, "appId")

    @app_id.setter
    def app_id(self, value: str) -> None:
        jsii.set(self, "appId", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="versionId")
    def version_id(self) -> str:
        return jsii.get(self, "versionId")

    @version_id.setter
    def version_id(self, value: str) -> None:
        jsii.set(self, "versionId", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapAppEngineVersionIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapAppEngineVersionIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapAppEngineVersionIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapAppEngineVersionIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapAppEngineVersionIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapAppEngineVersionIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'app_id': 'appId', 'member': 'member', 'role': 'role', 'service': 'service', 'version_id': 'versionId', 'condition': 'condition', 'project': 'project'})
class IapAppEngineVersionIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, app_id: str, member: str, role: str, service: str, version_id: str, condition: typing.Optional[typing.List["IapAppEngineVersionIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_id: 
        :param member: 
        :param role: 
        :param service: 
        :param version_id: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'app_id': app_id,
            'member': member,
            'role': role,
            'service': service,
            'version_id': version_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def app_id(self) -> str:
        return self._values.get('app_id')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def service(self) -> str:
        return self._values.get('service')

    @builtins.property
    def version_id(self) -> str:
        return self._values.get('version_id')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapAppEngineVersionIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapAppEngineVersionIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapAppEngineVersionIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapAppEngineVersionIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, app_id: str, policy_data: str, service: str, version_id: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param app_id: 
        :param policy_data: 
        :param service: 
        :param version_id: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapAppEngineVersionIamPolicyConfig(app_id=app_id, policy_data=policy_data, service=service, version_id=version_id, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapAppEngineVersionIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="appId")
    def app_id(self) -> str:
        return jsii.get(self, "appId")

    @app_id.setter
    def app_id(self, value: str) -> None:
        jsii.set(self, "appId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="versionId")
    def version_id(self) -> str:
        return jsii.get(self, "versionId")

    @version_id.setter
    def version_id(self, value: str) -> None:
        jsii.set(self, "versionId", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapAppEngineVersionIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'app_id': 'appId', 'policy_data': 'policyData', 'service': 'service', 'version_id': 'versionId', 'project': 'project'})
class IapAppEngineVersionIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, app_id: str, policy_data: str, service: str, version_id: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_id: 
        :param policy_data: 
        :param service: 
        :param version_id: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'app_id': app_id,
            'policy_data': policy_data,
            'service': service,
            'version_id': version_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def app_id(self) -> str:
        return self._values.get('app_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def service(self) -> str:
        return self._values.get('service')

    @builtins.property
    def version_id(self) -> str:
        return self._values.get('version_id')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapAppEngineVersionIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapBrand(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapBrand"):
    def __init__(self, scope: constructs.Construct, id: str, *, application_title: str, support_email: str, project: typing.Optional[str]=None, timeouts: typing.Optional["IapBrandTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param application_title: Application name displayed on OAuth consent screen.
        :param support_email: Support email displayed on the OAuth consent screen. Can be either a user or group email. When a user email is specified, the caller must be the user with the associated email address. When a group email is specified, the caller can be either a user or a service account which is an owner of the specified group in Cloud Identity.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapBrandConfig(application_title=application_title, support_email=support_email, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapBrand, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="orgInternalOnly")
    def org_internal_only(self) -> bool:
        return jsii.get(self, "orgInternalOnly")

    @builtins.property
    @jsii.member(jsii_name="applicationTitle")
    def application_title(self) -> str:
        return jsii.get(self, "applicationTitle")

    @application_title.setter
    def application_title(self, value: str) -> None:
        jsii.set(self, "applicationTitle", value)

    @builtins.property
    @jsii.member(jsii_name="supportEmail")
    def support_email(self) -> str:
        return jsii.get(self, "supportEmail")

    @support_email.setter
    def support_email(self, value: str) -> None:
        jsii.set(self, "supportEmail", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["IapBrandTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["IapBrandTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapBrandConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'application_title': 'applicationTitle', 'support_email': 'supportEmail', 'project': 'project', 'timeouts': 'timeouts'})
class IapBrandConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, application_title: str, support_email: str, project: typing.Optional[str]=None, timeouts: typing.Optional["IapBrandTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param application_title: Application name displayed on OAuth consent screen.
        :param support_email: Support email displayed on the OAuth consent screen. Can be either a user or group email. When a user email is specified, the caller must be the user with the associated email address. When a group email is specified, the caller can be either a user or a service account which is an owner of the specified group in Cloud Identity.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = IapBrandTimeouts(**timeouts)
        self._values = {
            'application_title': application_title,
            'support_email': support_email,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def application_title(self) -> str:
        """Application name displayed on OAuth consent screen."""
        return self._values.get('application_title')

    @builtins.property
    def support_email(self) -> str:
        """Support email displayed on the OAuth consent screen.

        Can be either a
        user or group email. When a user email is specified, the caller must
        be the user with the associated email address. When a group email is
        specified, the caller can be either a user or a service account which
        is an owner of the specified group in Cloud Identity.
        """
        return self._values.get('support_email')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["IapBrandTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapBrandConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapBrandTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class IapBrandTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapBrandTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapClient(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapClient"):
    def __init__(self, scope: constructs.Construct, id: str, *, brand: str, display_name: str, timeouts: typing.Optional["IapClientTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param brand: Identifier of the brand to which this client is attached to. The format is 'projects/{project_number}/brands/{brand_id}/identityAwareProxyClients/{client_id}'.
        :param display_name: Human-friendly name given to the OAuth client.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapClientConfig(brand=brand, display_name=display_name, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapClient, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> str:
        return jsii.get(self, "clientId")

    @builtins.property
    @jsii.member(jsii_name="secret")
    def secret(self) -> str:
        return jsii.get(self, "secret")

    @builtins.property
    @jsii.member(jsii_name="brand")
    def brand(self) -> str:
        return jsii.get(self, "brand")

    @brand.setter
    def brand(self, value: str) -> None:
        jsii.set(self, "brand", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["IapClientTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["IapClientTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapClientConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'brand': 'brand', 'display_name': 'displayName', 'timeouts': 'timeouts'})
class IapClientConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, brand: str, display_name: str, timeouts: typing.Optional["IapClientTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param brand: Identifier of the brand to which this client is attached to. The format is 'projects/{project_number}/brands/{brand_id}/identityAwareProxyClients/{client_id}'.
        :param display_name: Human-friendly name given to the OAuth client.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = IapClientTimeouts(**timeouts)
        self._values = {
            'brand': brand,
            'display_name': display_name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def brand(self) -> str:
        """Identifier of the brand to which this client is attached to.

        The format is
        'projects/{project_number}/brands/{brand_id}/identityAwareProxyClients/{client_id}'.
        """
        return self._values.get('brand')

    @builtins.property
    def display_name(self) -> str:
        """Human-friendly name given to the OAuth client."""
        return self._values.get('display_name')

    @builtins.property
    def timeouts(self) -> typing.Optional["IapClientTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapClientConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapClientTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class IapClientTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapClientTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapTunnelInstanceIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapTunnelInstanceIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["IapTunnelInstanceIamBindingCondition"]]=None, project: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param zone: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapTunnelInstanceIamBindingConfig(instance=instance, members=members, role=role, condition=condition, project=project, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapTunnelInstanceIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapTunnelInstanceIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapTunnelInstanceIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapTunnelInstanceIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapTunnelInstanceIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapTunnelInstanceIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapTunnelInstanceIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project', 'zone': 'zone'})
class IapTunnelInstanceIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["IapTunnelInstanceIamBindingCondition"]]=None, project: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param zone: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance': instance,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapTunnelInstanceIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapTunnelInstanceIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapTunnelInstanceIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapTunnelInstanceIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, member: str, role: str, condition: typing.Optional[typing.List["IapTunnelInstanceIamMemberCondition"]]=None, project: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param zone: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapTunnelInstanceIamMemberConfig(instance=instance, member=member, role=role, condition=condition, project=project, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapTunnelInstanceIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapTunnelInstanceIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapTunnelInstanceIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapTunnelInstanceIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapTunnelInstanceIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapTunnelInstanceIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapTunnelInstanceIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project', 'zone': 'zone'})
class IapTunnelInstanceIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, member: str, role: str, condition: typing.Optional[typing.List["IapTunnelInstanceIamMemberCondition"]]=None, project: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param zone: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance': instance,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapTunnelInstanceIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapTunnelInstanceIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapTunnelInstanceIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapTunnelInstanceIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, policy_data: str, project: typing.Optional[str]=None, zone: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: 
        :param policy_data: 
        :param project: 
        :param zone: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapTunnelInstanceIamPolicyConfig(instance=instance, policy_data=policy_data, project=project, zone=zone, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapTunnelInstanceIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> typing.Optional[str]:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "zone", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapTunnelInstanceIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'policy_data': 'policyData', 'project': 'project', 'zone': 'zone'})
class IapTunnelInstanceIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, policy_data: str, project: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: 
        :param policy_data: 
        :param project: 
        :param zone: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance': instance,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapTunnelInstanceIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapWebBackendServiceIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapWebBackendServiceIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], role: str, web_backend_service: str, condition: typing.Optional[typing.List["IapWebBackendServiceIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param role: 
        :param web_backend_service: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapWebBackendServiceIamBindingConfig(members=members, role=role, web_backend_service=web_backend_service, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapWebBackendServiceIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="webBackendService")
    def web_backend_service(self) -> str:
        return jsii.get(self, "webBackendService")

    @web_backend_service.setter
    def web_backend_service(self, value: str) -> None:
        jsii.set(self, "webBackendService", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapWebBackendServiceIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapWebBackendServiceIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebBackendServiceIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapWebBackendServiceIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebBackendServiceIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebBackendServiceIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'role': 'role', 'web_backend_service': 'webBackendService', 'condition': 'condition', 'project': 'project'})
class IapWebBackendServiceIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], role: str, web_backend_service: str, condition: typing.Optional[typing.List["IapWebBackendServiceIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param role: 
        :param web_backend_service: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'role': role,
            'web_backend_service': web_backend_service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def web_backend_service(self) -> str:
        return self._values.get('web_backend_service')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapWebBackendServiceIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebBackendServiceIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapWebBackendServiceIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapWebBackendServiceIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, role: str, web_backend_service: str, condition: typing.Optional[typing.List["IapWebBackendServiceIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param role: 
        :param web_backend_service: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapWebBackendServiceIamMemberConfig(member=member, role=role, web_backend_service=web_backend_service, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapWebBackendServiceIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="webBackendService")
    def web_backend_service(self) -> str:
        return jsii.get(self, "webBackendService")

    @web_backend_service.setter
    def web_backend_service(self, value: str) -> None:
        jsii.set(self, "webBackendService", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapWebBackendServiceIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapWebBackendServiceIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebBackendServiceIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapWebBackendServiceIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebBackendServiceIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebBackendServiceIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'role': 'role', 'web_backend_service': 'webBackendService', 'condition': 'condition', 'project': 'project'})
class IapWebBackendServiceIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, role: str, web_backend_service: str, condition: typing.Optional[typing.List["IapWebBackendServiceIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param role: 
        :param web_backend_service: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'role': role,
            'web_backend_service': web_backend_service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def web_backend_service(self) -> str:
        return self._values.get('web_backend_service')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapWebBackendServiceIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebBackendServiceIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapWebBackendServiceIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapWebBackendServiceIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_data: str, web_backend_service: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_data: 
        :param web_backend_service: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapWebBackendServiceIamPolicyConfig(policy_data=policy_data, web_backend_service=web_backend_service, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapWebBackendServiceIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="webBackendService")
    def web_backend_service(self) -> str:
        return jsii.get(self, "webBackendService")

    @web_backend_service.setter
    def web_backend_service(self, value: str) -> None:
        jsii.set(self, "webBackendService", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebBackendServiceIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_data': 'policyData', 'web_backend_service': 'webBackendService', 'project': 'project'})
class IapWebBackendServiceIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_data: str, web_backend_service: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_data: 
        :param web_backend_service: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'policy_data': policy_data,
            'web_backend_service': web_backend_service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def web_backend_service(self) -> str:
        return self._values.get('web_backend_service')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebBackendServiceIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapWebIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapWebIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], role: str, condition: typing.Optional[typing.List["IapWebIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapWebIamBindingConfig(members=members, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapWebIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapWebIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapWebIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapWebIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class IapWebIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], role: str, condition: typing.Optional[typing.List["IapWebIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapWebIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapWebIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapWebIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, role: str, condition: typing.Optional[typing.List["IapWebIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapWebIamMemberConfig(member=member, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapWebIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapWebIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapWebIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapWebIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class IapWebIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, role: str, condition: typing.Optional[typing.List["IapWebIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapWebIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapWebIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapWebIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_data: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_data: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapWebIamPolicyConfig(policy_data=policy_data, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapWebIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_data': 'policyData', 'project': 'project'})
class IapWebIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_data: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_data: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapWebTypeAppEngineIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapWebTypeAppEngineIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, app_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["IapWebTypeAppEngineIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param app_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapWebTypeAppEngineIamBindingConfig(app_id=app_id, members=members, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapWebTypeAppEngineIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="appId")
    def app_id(self) -> str:
        return jsii.get(self, "appId")

    @app_id.setter
    def app_id(self, value: str) -> None:
        jsii.set(self, "appId", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapWebTypeAppEngineIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapWebTypeAppEngineIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebTypeAppEngineIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapWebTypeAppEngineIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebTypeAppEngineIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebTypeAppEngineIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'app_id': 'appId', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class IapWebTypeAppEngineIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, app_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["IapWebTypeAppEngineIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'app_id': app_id,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def app_id(self) -> str:
        return self._values.get('app_id')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapWebTypeAppEngineIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebTypeAppEngineIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapWebTypeAppEngineIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapWebTypeAppEngineIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, app_id: str, member: str, role: str, condition: typing.Optional[typing.List["IapWebTypeAppEngineIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param app_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapWebTypeAppEngineIamMemberConfig(app_id=app_id, member=member, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapWebTypeAppEngineIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="appId")
    def app_id(self) -> str:
        return jsii.get(self, "appId")

    @app_id.setter
    def app_id(self, value: str) -> None:
        jsii.set(self, "appId", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapWebTypeAppEngineIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapWebTypeAppEngineIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebTypeAppEngineIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapWebTypeAppEngineIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebTypeAppEngineIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebTypeAppEngineIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'app_id': 'appId', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class IapWebTypeAppEngineIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, app_id: str, member: str, role: str, condition: typing.Optional[typing.List["IapWebTypeAppEngineIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'app_id': app_id,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def app_id(self) -> str:
        return self._values.get('app_id')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapWebTypeAppEngineIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebTypeAppEngineIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapWebTypeAppEngineIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapWebTypeAppEngineIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, app_id: str, policy_data: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param app_id: 
        :param policy_data: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapWebTypeAppEngineIamPolicyConfig(app_id=app_id, policy_data=policy_data, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapWebTypeAppEngineIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="appId")
    def app_id(self) -> str:
        return jsii.get(self, "appId")

    @app_id.setter
    def app_id(self, value: str) -> None:
        jsii.set(self, "appId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebTypeAppEngineIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'app_id': 'appId', 'policy_data': 'policyData', 'project': 'project'})
class IapWebTypeAppEngineIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, app_id: str, policy_data: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param app_id: 
        :param policy_data: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'app_id': app_id,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def app_id(self) -> str:
        return self._values.get('app_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebTypeAppEngineIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapWebTypeComputeIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapWebTypeComputeIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], role: str, condition: typing.Optional[typing.List["IapWebTypeComputeIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapWebTypeComputeIamBindingConfig(members=members, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapWebTypeComputeIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapWebTypeComputeIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapWebTypeComputeIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebTypeComputeIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapWebTypeComputeIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebTypeComputeIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebTypeComputeIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class IapWebTypeComputeIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], role: str, condition: typing.Optional[typing.List["IapWebTypeComputeIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapWebTypeComputeIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebTypeComputeIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapWebTypeComputeIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapWebTypeComputeIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, role: str, condition: typing.Optional[typing.List["IapWebTypeComputeIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapWebTypeComputeIamMemberConfig(member=member, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapWebTypeComputeIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["IapWebTypeComputeIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["IapWebTypeComputeIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebTypeComputeIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class IapWebTypeComputeIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebTypeComputeIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebTypeComputeIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class IapWebTypeComputeIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, role: str, condition: typing.Optional[typing.List["IapWebTypeComputeIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["IapWebTypeComputeIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebTypeComputeIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IapWebTypeComputeIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IapWebTypeComputeIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_data: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_data: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IapWebTypeComputeIamPolicyConfig(policy_data=policy_data, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IapWebTypeComputeIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IapWebTypeComputeIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_data': 'policyData', 'project': 'project'})
class IapWebTypeComputeIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_data: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_data: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IapWebTypeComputeIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IdentityPlatformDefaultSupportedIdpConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IdentityPlatformDefaultSupportedIdpConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, client_id: str, client_secret: str, idp_id: str, enabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformDefaultSupportedIdpConfigTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param client_id: OAuth client ID.
        :param client_secret: OAuth client secret.
        :param idp_id: ID of the IDP. Possible values include:. 'apple.com' 'facebook.com' 'gc.apple.com' 'github.com' 'google.com' 'linkedin.com' 'microsoft.com' 'playgames.google.com' 'twitter.com' 'yahoo.com'
        :param enabled: If this IDP allows the user to sign in.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IdentityPlatformDefaultSupportedIdpConfigConfig(client_id=client_id, client_secret=client_secret, idp_id=idp_id, enabled=enabled, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IdentityPlatformDefaultSupportedIdpConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> str:
        return jsii.get(self, "clientId")

    @client_id.setter
    def client_id(self, value: str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property
    @jsii.member(jsii_name="clientSecret")
    def client_secret(self) -> str:
        return jsii.get(self, "clientSecret")

    @client_secret.setter
    def client_secret(self, value: str) -> None:
        jsii.set(self, "clientSecret", value)

    @builtins.property
    @jsii.member(jsii_name="idpId")
    def idp_id(self) -> str:
        return jsii.get(self, "idpId")

    @idp_id.setter
    def idp_id(self, value: str) -> None:
        jsii.set(self, "idpId", value)

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "enabled")

    @enabled.setter
    def enabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["IdentityPlatformDefaultSupportedIdpConfigTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["IdentityPlatformDefaultSupportedIdpConfigTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformDefaultSupportedIdpConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'client_id': 'clientId', 'client_secret': 'clientSecret', 'idp_id': 'idpId', 'enabled': 'enabled', 'project': 'project', 'timeouts': 'timeouts'})
class IdentityPlatformDefaultSupportedIdpConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, client_id: str, client_secret: str, idp_id: str, enabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformDefaultSupportedIdpConfigTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param client_id: OAuth client ID.
        :param client_secret: OAuth client secret.
        :param idp_id: ID of the IDP. Possible values include:. 'apple.com' 'facebook.com' 'gc.apple.com' 'github.com' 'google.com' 'linkedin.com' 'microsoft.com' 'playgames.google.com' 'twitter.com' 'yahoo.com'
        :param enabled: If this IDP allows the user to sign in.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = IdentityPlatformDefaultSupportedIdpConfigTimeouts(**timeouts)
        self._values = {
            'client_id': client_id,
            'client_secret': client_secret,
            'idp_id': idp_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if enabled is not None: self._values["enabled"] = enabled
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def client_id(self) -> str:
        """OAuth client ID."""
        return self._values.get('client_id')

    @builtins.property
    def client_secret(self) -> str:
        """OAuth client secret."""
        return self._values.get('client_secret')

    @builtins.property
    def idp_id(self) -> str:
        """ID of the IDP. Possible values include:.

        'apple.com'

        'facebook.com'

        'gc.apple.com'

        'github.com'

        'google.com'

        'linkedin.com'

        'microsoft.com'

        'playgames.google.com'

        'twitter.com'

        'yahoo.com'
        """
        return self._values.get('idp_id')

    @builtins.property
    def enabled(self) -> typing.Optional[bool]:
        """If this IDP allows the user to sign in."""
        return self._values.get('enabled')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["IdentityPlatformDefaultSupportedIdpConfigTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformDefaultSupportedIdpConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformDefaultSupportedIdpConfigTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class IdentityPlatformDefaultSupportedIdpConfigTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformDefaultSupportedIdpConfigTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IdentityPlatformInboundSamlConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IdentityPlatformInboundSamlConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, display_name: str, idp_config: typing.List["IdentityPlatformInboundSamlConfigIdpConfig"], name: str, sp_config: typing.List["IdentityPlatformInboundSamlConfigSpConfig"], enabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformInboundSamlConfigTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: Human friendly display name.
        :param idp_config: idp_config block.
        :param name: The name of the InboundSamlConfig resource. Must start with 'saml.' and can only have alphanumeric characters, hyphens, underscores or periods. The part after 'saml.' must also start with a lowercase letter, end with an alphanumeric character, and have at least 2 characters.
        :param sp_config: sp_config block.
        :param enabled: If this config allows users to sign in with the provider.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IdentityPlatformInboundSamlConfigConfig(display_name=display_name, idp_config=idp_config, name=name, sp_config=sp_config, enabled=enabled, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IdentityPlatformInboundSamlConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="idpConfig")
    def idp_config(self) -> typing.List["IdentityPlatformInboundSamlConfigIdpConfig"]:
        return jsii.get(self, "idpConfig")

    @idp_config.setter
    def idp_config(self, value: typing.List["IdentityPlatformInboundSamlConfigIdpConfig"]) -> None:
        jsii.set(self, "idpConfig", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="spConfig")
    def sp_config(self) -> typing.List["IdentityPlatformInboundSamlConfigSpConfig"]:
        return jsii.get(self, "spConfig")

    @sp_config.setter
    def sp_config(self, value: typing.List["IdentityPlatformInboundSamlConfigSpConfig"]) -> None:
        jsii.set(self, "spConfig", value)

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "enabled")

    @enabled.setter
    def enabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["IdentityPlatformInboundSamlConfigTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["IdentityPlatformInboundSamlConfigTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformInboundSamlConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'display_name': 'displayName', 'idp_config': 'idpConfig', 'name': 'name', 'sp_config': 'spConfig', 'enabled': 'enabled', 'project': 'project', 'timeouts': 'timeouts'})
class IdentityPlatformInboundSamlConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, display_name: str, idp_config: typing.List["IdentityPlatformInboundSamlConfigIdpConfig"], name: str, sp_config: typing.List["IdentityPlatformInboundSamlConfigSpConfig"], enabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformInboundSamlConfigTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: Human friendly display name.
        :param idp_config: idp_config block.
        :param name: The name of the InboundSamlConfig resource. Must start with 'saml.' and can only have alphanumeric characters, hyphens, underscores or periods. The part after 'saml.' must also start with a lowercase letter, end with an alphanumeric character, and have at least 2 characters.
        :param sp_config: sp_config block.
        :param enabled: If this config allows users to sign in with the provider.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = IdentityPlatformInboundSamlConfigTimeouts(**timeouts)
        self._values = {
            'display_name': display_name,
            'idp_config': idp_config,
            'name': name,
            'sp_config': sp_config,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if enabled is not None: self._values["enabled"] = enabled
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def display_name(self) -> str:
        """Human friendly display name."""
        return self._values.get('display_name')

    @builtins.property
    def idp_config(self) -> typing.List["IdentityPlatformInboundSamlConfigIdpConfig"]:
        """idp_config block."""
        return self._values.get('idp_config')

    @builtins.property
    def name(self) -> str:
        """The name of the InboundSamlConfig resource.

        Must start with 'saml.' and can only have alphanumeric characters,
        hyphens, underscores or periods. The part after 'saml.' must also start with a lowercase letter, end with an
        alphanumeric character, and have at least 2 characters.
        """
        return self._values.get('name')

    @builtins.property
    def sp_config(self) -> typing.List["IdentityPlatformInboundSamlConfigSpConfig"]:
        """sp_config block."""
        return self._values.get('sp_config')

    @builtins.property
    def enabled(self) -> typing.Optional[bool]:
        """If this config allows users to sign in with the provider."""
        return self._values.get('enabled')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["IdentityPlatformInboundSamlConfigTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformInboundSamlConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformInboundSamlConfigIdpConfig", jsii_struct_bases=[], name_mapping={'idp_certificates': 'idpCertificates', 'idp_entity_id': 'idpEntityId', 'sso_url': 'ssoUrl', 'sign_request': 'signRequest'})
class IdentityPlatformInboundSamlConfigIdpConfig():
    def __init__(self, *, idp_certificates: typing.List["IdentityPlatformInboundSamlConfigIdpConfigIdpCertificates"], idp_entity_id: str, sso_url: str, sign_request: typing.Optional[bool]=None) -> None:
        """
        :param idp_certificates: idp_certificates block.
        :param idp_entity_id: Unique identifier for all SAML entities.
        :param sso_url: URL to send Authentication request to.
        :param sign_request: Indicates if outbounding SAMLRequest should be signed.
        """
        self._values = {
            'idp_certificates': idp_certificates,
            'idp_entity_id': idp_entity_id,
            'sso_url': sso_url,
        }
        if sign_request is not None: self._values["sign_request"] = sign_request

    @builtins.property
    def idp_certificates(self) -> typing.List["IdentityPlatformInboundSamlConfigIdpConfigIdpCertificates"]:
        """idp_certificates block."""
        return self._values.get('idp_certificates')

    @builtins.property
    def idp_entity_id(self) -> str:
        """Unique identifier for all SAML entities."""
        return self._values.get('idp_entity_id')

    @builtins.property
    def sso_url(self) -> str:
        """URL to send Authentication request to."""
        return self._values.get('sso_url')

    @builtins.property
    def sign_request(self) -> typing.Optional[bool]:
        """Indicates if outbounding SAMLRequest should be signed."""
        return self._values.get('sign_request')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformInboundSamlConfigIdpConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformInboundSamlConfigIdpConfigIdpCertificates", jsii_struct_bases=[], name_mapping={'x509_certificate': 'x509Certificate'})
class IdentityPlatformInboundSamlConfigIdpConfigIdpCertificates():
    def __init__(self, *, x509_certificate: typing.Optional[str]=None) -> None:
        """
        :param x509_certificate: The IdP's x509 certificate.
        """
        self._values = {
        }
        if x509_certificate is not None: self._values["x509_certificate"] = x509_certificate

    @builtins.property
    def x509_certificate(self) -> typing.Optional[str]:
        """The IdP's x509 certificate."""
        return self._values.get('x509_certificate')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformInboundSamlConfigIdpConfigIdpCertificates(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformInboundSamlConfigSpConfig", jsii_struct_bases=[], name_mapping={'callback_uri': 'callbackUri', 'sp_entity_id': 'spEntityId'})
class IdentityPlatformInboundSamlConfigSpConfig():
    def __init__(self, *, callback_uri: typing.Optional[str]=None, sp_entity_id: typing.Optional[str]=None) -> None:
        """
        :param callback_uri: Callback URI where responses from IDP are handled. Must start with 'https://'.
        :param sp_entity_id: Unique identifier for all SAML entities.
        """
        self._values = {
        }
        if callback_uri is not None: self._values["callback_uri"] = callback_uri
        if sp_entity_id is not None: self._values["sp_entity_id"] = sp_entity_id

    @builtins.property
    def callback_uri(self) -> typing.Optional[str]:
        """Callback URI where responses from IDP are handled.

        Must start with 'https://'.
        """
        return self._values.get('callback_uri')

    @builtins.property
    def sp_entity_id(self) -> typing.Optional[str]:
        """Unique identifier for all SAML entities."""
        return self._values.get('sp_entity_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformInboundSamlConfigSpConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformInboundSamlConfigTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class IdentityPlatformInboundSamlConfigTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformInboundSamlConfigTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IdentityPlatformOauthIdpConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IdentityPlatformOauthIdpConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, client_id: str, issuer: str, name: str, client_secret: typing.Optional[str]=None, display_name: typing.Optional[str]=None, enabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformOauthIdpConfigTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param client_id: The client id of an OAuth client.
        :param issuer: For OIDC Idps, the issuer identifier.
        :param name: The name of the OauthIdpConfig. Must start with 'oidc.'.
        :param client_secret: The client secret of the OAuth client, to enable OIDC code flow.
        :param display_name: Human friendly display name.
        :param enabled: If this config allows users to sign in with the provider.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IdentityPlatformOauthIdpConfigConfig(client_id=client_id, issuer=issuer, name=name, client_secret=client_secret, display_name=display_name, enabled=enabled, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IdentityPlatformOauthIdpConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> str:
        return jsii.get(self, "clientId")

    @client_id.setter
    def client_id(self, value: str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property
    @jsii.member(jsii_name="issuer")
    def issuer(self) -> str:
        return jsii.get(self, "issuer")

    @issuer.setter
    def issuer(self, value: str) -> None:
        jsii.set(self, "issuer", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="clientSecret")
    def client_secret(self) -> typing.Optional[str]:
        return jsii.get(self, "clientSecret")

    @client_secret.setter
    def client_secret(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "clientSecret", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> typing.Optional[str]:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "enabled")

    @enabled.setter
    def enabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["IdentityPlatformOauthIdpConfigTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["IdentityPlatformOauthIdpConfigTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformOauthIdpConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'client_id': 'clientId', 'issuer': 'issuer', 'name': 'name', 'client_secret': 'clientSecret', 'display_name': 'displayName', 'enabled': 'enabled', 'project': 'project', 'timeouts': 'timeouts'})
class IdentityPlatformOauthIdpConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, client_id: str, issuer: str, name: str, client_secret: typing.Optional[str]=None, display_name: typing.Optional[str]=None, enabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformOauthIdpConfigTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param client_id: The client id of an OAuth client.
        :param issuer: For OIDC Idps, the issuer identifier.
        :param name: The name of the OauthIdpConfig. Must start with 'oidc.'.
        :param client_secret: The client secret of the OAuth client, to enable OIDC code flow.
        :param display_name: Human friendly display name.
        :param enabled: If this config allows users to sign in with the provider.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = IdentityPlatformOauthIdpConfigTimeouts(**timeouts)
        self._values = {
            'client_id': client_id,
            'issuer': issuer,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if client_secret is not None: self._values["client_secret"] = client_secret
        if display_name is not None: self._values["display_name"] = display_name
        if enabled is not None: self._values["enabled"] = enabled
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def client_id(self) -> str:
        """The client id of an OAuth client."""
        return self._values.get('client_id')

    @builtins.property
    def issuer(self) -> str:
        """For OIDC Idps, the issuer identifier."""
        return self._values.get('issuer')

    @builtins.property
    def name(self) -> str:
        """The name of the OauthIdpConfig.

        Must start with 'oidc.'.
        """
        return self._values.get('name')

    @builtins.property
    def client_secret(self) -> typing.Optional[str]:
        """The client secret of the OAuth client, to enable OIDC code flow."""
        return self._values.get('client_secret')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """Human friendly display name."""
        return self._values.get('display_name')

    @builtins.property
    def enabled(self) -> typing.Optional[bool]:
        """If this config allows users to sign in with the provider."""
        return self._values.get('enabled')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["IdentityPlatformOauthIdpConfigTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformOauthIdpConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformOauthIdpConfigTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class IdentityPlatformOauthIdpConfigTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformOauthIdpConfigTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IdentityPlatformTenant(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IdentityPlatformTenant"):
    def __init__(self, scope: constructs.Construct, id: str, *, display_name: str, allow_password_signup: typing.Optional[bool]=None, disable_auth: typing.Optional[bool]=None, enable_email_link_signin: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformTenantTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: Human friendly display name of the tenant.
        :param allow_password_signup: Whether to allow email/password user authentication.
        :param disable_auth: Whether authentication is disabled for the tenant. If true, the users under the disabled tenant are not allowed to sign-in. Admins of the disabled tenant are not able to manage its users.
        :param enable_email_link_signin: Whether to enable email link user authentication.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IdentityPlatformTenantConfig(display_name=display_name, allow_password_signup=allow_password_signup, disable_auth=disable_auth, enable_email_link_signin=enable_email_link_signin, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IdentityPlatformTenant, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="allowPasswordSignup")
    def allow_password_signup(self) -> typing.Optional[bool]:
        return jsii.get(self, "allowPasswordSignup")

    @allow_password_signup.setter
    def allow_password_signup(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "allowPasswordSignup", value)

    @builtins.property
    @jsii.member(jsii_name="disableAuth")
    def disable_auth(self) -> typing.Optional[bool]:
        return jsii.get(self, "disableAuth")

    @disable_auth.setter
    def disable_auth(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "disableAuth", value)

    @builtins.property
    @jsii.member(jsii_name="enableEmailLinkSignin")
    def enable_email_link_signin(self) -> typing.Optional[bool]:
        return jsii.get(self, "enableEmailLinkSignin")

    @enable_email_link_signin.setter
    def enable_email_link_signin(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enableEmailLinkSignin", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["IdentityPlatformTenantTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["IdentityPlatformTenantTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformTenantConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'display_name': 'displayName', 'allow_password_signup': 'allowPasswordSignup', 'disable_auth': 'disableAuth', 'enable_email_link_signin': 'enableEmailLinkSignin', 'project': 'project', 'timeouts': 'timeouts'})
class IdentityPlatformTenantConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, display_name: str, allow_password_signup: typing.Optional[bool]=None, disable_auth: typing.Optional[bool]=None, enable_email_link_signin: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformTenantTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: Human friendly display name of the tenant.
        :param allow_password_signup: Whether to allow email/password user authentication.
        :param disable_auth: Whether authentication is disabled for the tenant. If true, the users under the disabled tenant are not allowed to sign-in. Admins of the disabled tenant are not able to manage its users.
        :param enable_email_link_signin: Whether to enable email link user authentication.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = IdentityPlatformTenantTimeouts(**timeouts)
        self._values = {
            'display_name': display_name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if allow_password_signup is not None: self._values["allow_password_signup"] = allow_password_signup
        if disable_auth is not None: self._values["disable_auth"] = disable_auth
        if enable_email_link_signin is not None: self._values["enable_email_link_signin"] = enable_email_link_signin
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def display_name(self) -> str:
        """Human friendly display name of the tenant."""
        return self._values.get('display_name')

    @builtins.property
    def allow_password_signup(self) -> typing.Optional[bool]:
        """Whether to allow email/password user authentication."""
        return self._values.get('allow_password_signup')

    @builtins.property
    def disable_auth(self) -> typing.Optional[bool]:
        """Whether authentication is disabled for the tenant.

        If true, the users under
        the disabled tenant are not allowed to sign-in. Admins of the disabled tenant
        are not able to manage its users.
        """
        return self._values.get('disable_auth')

    @builtins.property
    def enable_email_link_signin(self) -> typing.Optional[bool]:
        """Whether to enable email link user authentication."""
        return self._values.get('enable_email_link_signin')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["IdentityPlatformTenantTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformTenantConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IdentityPlatformTenantDefaultSupportedIdpConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IdentityPlatformTenantDefaultSupportedIdpConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, client_id: str, client_secret: str, idp_id: str, tenant: str, enabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformTenantDefaultSupportedIdpConfigTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param client_id: OAuth client ID.
        :param client_secret: OAuth client secret.
        :param idp_id: ID of the IDP. Possible values include:. 'apple.com' 'facebook.com' 'gc.apple.com' 'github.com' 'google.com' 'linkedin.com' 'microsoft.com' 'playgames.google.com' 'twitter.com' 'yahoo.com'
        :param tenant: The name of the tenant where this DefaultSupportedIdpConfig resource exists.
        :param enabled: If this IDP allows the user to sign in.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IdentityPlatformTenantDefaultSupportedIdpConfigConfig(client_id=client_id, client_secret=client_secret, idp_id=idp_id, tenant=tenant, enabled=enabled, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IdentityPlatformTenantDefaultSupportedIdpConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> str:
        return jsii.get(self, "clientId")

    @client_id.setter
    def client_id(self, value: str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property
    @jsii.member(jsii_name="clientSecret")
    def client_secret(self) -> str:
        return jsii.get(self, "clientSecret")

    @client_secret.setter
    def client_secret(self, value: str) -> None:
        jsii.set(self, "clientSecret", value)

    @builtins.property
    @jsii.member(jsii_name="idpId")
    def idp_id(self) -> str:
        return jsii.get(self, "idpId")

    @idp_id.setter
    def idp_id(self, value: str) -> None:
        jsii.set(self, "idpId", value)

    @builtins.property
    @jsii.member(jsii_name="tenant")
    def tenant(self) -> str:
        return jsii.get(self, "tenant")

    @tenant.setter
    def tenant(self, value: str) -> None:
        jsii.set(self, "tenant", value)

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "enabled")

    @enabled.setter
    def enabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["IdentityPlatformTenantDefaultSupportedIdpConfigTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["IdentityPlatformTenantDefaultSupportedIdpConfigTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformTenantDefaultSupportedIdpConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'client_id': 'clientId', 'client_secret': 'clientSecret', 'idp_id': 'idpId', 'tenant': 'tenant', 'enabled': 'enabled', 'project': 'project', 'timeouts': 'timeouts'})
class IdentityPlatformTenantDefaultSupportedIdpConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, client_id: str, client_secret: str, idp_id: str, tenant: str, enabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformTenantDefaultSupportedIdpConfigTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param client_id: OAuth client ID.
        :param client_secret: OAuth client secret.
        :param idp_id: ID of the IDP. Possible values include:. 'apple.com' 'facebook.com' 'gc.apple.com' 'github.com' 'google.com' 'linkedin.com' 'microsoft.com' 'playgames.google.com' 'twitter.com' 'yahoo.com'
        :param tenant: The name of the tenant where this DefaultSupportedIdpConfig resource exists.
        :param enabled: If this IDP allows the user to sign in.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = IdentityPlatformTenantDefaultSupportedIdpConfigTimeouts(**timeouts)
        self._values = {
            'client_id': client_id,
            'client_secret': client_secret,
            'idp_id': idp_id,
            'tenant': tenant,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if enabled is not None: self._values["enabled"] = enabled
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def client_id(self) -> str:
        """OAuth client ID."""
        return self._values.get('client_id')

    @builtins.property
    def client_secret(self) -> str:
        """OAuth client secret."""
        return self._values.get('client_secret')

    @builtins.property
    def idp_id(self) -> str:
        """ID of the IDP. Possible values include:.

        'apple.com'

        'facebook.com'

        'gc.apple.com'

        'github.com'

        'google.com'

        'linkedin.com'

        'microsoft.com'

        'playgames.google.com'

        'twitter.com'

        'yahoo.com'
        """
        return self._values.get('idp_id')

    @builtins.property
    def tenant(self) -> str:
        """The name of the tenant where this DefaultSupportedIdpConfig resource exists."""
        return self._values.get('tenant')

    @builtins.property
    def enabled(self) -> typing.Optional[bool]:
        """If this IDP allows the user to sign in."""
        return self._values.get('enabled')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["IdentityPlatformTenantDefaultSupportedIdpConfigTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformTenantDefaultSupportedIdpConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformTenantDefaultSupportedIdpConfigTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class IdentityPlatformTenantDefaultSupportedIdpConfigTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformTenantDefaultSupportedIdpConfigTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IdentityPlatformTenantInboundSamlConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IdentityPlatformTenantInboundSamlConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, display_name: str, idp_config: typing.List["IdentityPlatformTenantInboundSamlConfigIdpConfig"], name: str, sp_config: typing.List["IdentityPlatformTenantInboundSamlConfigSpConfig"], tenant: str, enabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformTenantInboundSamlConfigTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: Human friendly display name.
        :param idp_config: idp_config block.
        :param name: The name of the InboundSamlConfig resource. Must start with 'saml.' and can only have alphanumeric characters, hyphens, underscores or periods. The part after 'saml.' must also start with a lowercase letter, end with an alphanumeric character, and have at least 2 characters.
        :param sp_config: sp_config block.
        :param tenant: The name of the tenant where this inbound SAML config resource exists.
        :param enabled: If this config allows users to sign in with the provider.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IdentityPlatformTenantInboundSamlConfigConfig(display_name=display_name, idp_config=idp_config, name=name, sp_config=sp_config, tenant=tenant, enabled=enabled, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IdentityPlatformTenantInboundSamlConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="idpConfig")
    def idp_config(self) -> typing.List["IdentityPlatformTenantInboundSamlConfigIdpConfig"]:
        return jsii.get(self, "idpConfig")

    @idp_config.setter
    def idp_config(self, value: typing.List["IdentityPlatformTenantInboundSamlConfigIdpConfig"]) -> None:
        jsii.set(self, "idpConfig", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="spConfig")
    def sp_config(self) -> typing.List["IdentityPlatformTenantInboundSamlConfigSpConfig"]:
        return jsii.get(self, "spConfig")

    @sp_config.setter
    def sp_config(self, value: typing.List["IdentityPlatformTenantInboundSamlConfigSpConfig"]) -> None:
        jsii.set(self, "spConfig", value)

    @builtins.property
    @jsii.member(jsii_name="tenant")
    def tenant(self) -> str:
        return jsii.get(self, "tenant")

    @tenant.setter
    def tenant(self, value: str) -> None:
        jsii.set(self, "tenant", value)

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "enabled")

    @enabled.setter
    def enabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["IdentityPlatformTenantInboundSamlConfigTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["IdentityPlatformTenantInboundSamlConfigTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformTenantInboundSamlConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'display_name': 'displayName', 'idp_config': 'idpConfig', 'name': 'name', 'sp_config': 'spConfig', 'tenant': 'tenant', 'enabled': 'enabled', 'project': 'project', 'timeouts': 'timeouts'})
class IdentityPlatformTenantInboundSamlConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, display_name: str, idp_config: typing.List["IdentityPlatformTenantInboundSamlConfigIdpConfig"], name: str, sp_config: typing.List["IdentityPlatformTenantInboundSamlConfigSpConfig"], tenant: str, enabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformTenantInboundSamlConfigTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: Human friendly display name.
        :param idp_config: idp_config block.
        :param name: The name of the InboundSamlConfig resource. Must start with 'saml.' and can only have alphanumeric characters, hyphens, underscores or periods. The part after 'saml.' must also start with a lowercase letter, end with an alphanumeric character, and have at least 2 characters.
        :param sp_config: sp_config block.
        :param tenant: The name of the tenant where this inbound SAML config resource exists.
        :param enabled: If this config allows users to sign in with the provider.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = IdentityPlatformTenantInboundSamlConfigTimeouts(**timeouts)
        self._values = {
            'display_name': display_name,
            'idp_config': idp_config,
            'name': name,
            'sp_config': sp_config,
            'tenant': tenant,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if enabled is not None: self._values["enabled"] = enabled
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def display_name(self) -> str:
        """Human friendly display name."""
        return self._values.get('display_name')

    @builtins.property
    def idp_config(self) -> typing.List["IdentityPlatformTenantInboundSamlConfigIdpConfig"]:
        """idp_config block."""
        return self._values.get('idp_config')

    @builtins.property
    def name(self) -> str:
        """The name of the InboundSamlConfig resource.

        Must start with 'saml.' and can only have alphanumeric characters,
        hyphens, underscores or periods. The part after 'saml.' must also start with a lowercase letter, end with an
        alphanumeric character, and have at least 2 characters.
        """
        return self._values.get('name')

    @builtins.property
    def sp_config(self) -> typing.List["IdentityPlatformTenantInboundSamlConfigSpConfig"]:
        """sp_config block."""
        return self._values.get('sp_config')

    @builtins.property
    def tenant(self) -> str:
        """The name of the tenant where this inbound SAML config resource exists."""
        return self._values.get('tenant')

    @builtins.property
    def enabled(self) -> typing.Optional[bool]:
        """If this config allows users to sign in with the provider."""
        return self._values.get('enabled')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["IdentityPlatformTenantInboundSamlConfigTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformTenantInboundSamlConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformTenantInboundSamlConfigIdpConfig", jsii_struct_bases=[], name_mapping={'idp_certificates': 'idpCertificates', 'idp_entity_id': 'idpEntityId', 'sso_url': 'ssoUrl', 'sign_request': 'signRequest'})
class IdentityPlatformTenantInboundSamlConfigIdpConfig():
    def __init__(self, *, idp_certificates: typing.List["IdentityPlatformTenantInboundSamlConfigIdpConfigIdpCertificates"], idp_entity_id: str, sso_url: str, sign_request: typing.Optional[bool]=None) -> None:
        """
        :param idp_certificates: idp_certificates block.
        :param idp_entity_id: Unique identifier for all SAML entities.
        :param sso_url: URL to send Authentication request to.
        :param sign_request: Indicates if outbounding SAMLRequest should be signed.
        """
        self._values = {
            'idp_certificates': idp_certificates,
            'idp_entity_id': idp_entity_id,
            'sso_url': sso_url,
        }
        if sign_request is not None: self._values["sign_request"] = sign_request

    @builtins.property
    def idp_certificates(self) -> typing.List["IdentityPlatformTenantInboundSamlConfigIdpConfigIdpCertificates"]:
        """idp_certificates block."""
        return self._values.get('idp_certificates')

    @builtins.property
    def idp_entity_id(self) -> str:
        """Unique identifier for all SAML entities."""
        return self._values.get('idp_entity_id')

    @builtins.property
    def sso_url(self) -> str:
        """URL to send Authentication request to."""
        return self._values.get('sso_url')

    @builtins.property
    def sign_request(self) -> typing.Optional[bool]:
        """Indicates if outbounding SAMLRequest should be signed."""
        return self._values.get('sign_request')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformTenantInboundSamlConfigIdpConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformTenantInboundSamlConfigIdpConfigIdpCertificates", jsii_struct_bases=[], name_mapping={'x509_certificate': 'x509Certificate'})
class IdentityPlatformTenantInboundSamlConfigIdpConfigIdpCertificates():
    def __init__(self, *, x509_certificate: typing.Optional[str]=None) -> None:
        """
        :param x509_certificate: The x509 certificate.
        """
        self._values = {
        }
        if x509_certificate is not None: self._values["x509_certificate"] = x509_certificate

    @builtins.property
    def x509_certificate(self) -> typing.Optional[str]:
        """The x509 certificate."""
        return self._values.get('x509_certificate')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformTenantInboundSamlConfigIdpConfigIdpCertificates(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformTenantInboundSamlConfigSpConfig", jsii_struct_bases=[], name_mapping={'callback_uri': 'callbackUri', 'sp_entity_id': 'spEntityId'})
class IdentityPlatformTenantInboundSamlConfigSpConfig():
    def __init__(self, *, callback_uri: str, sp_entity_id: str) -> None:
        """
        :param callback_uri: Callback URI where responses from IDP are handled. Must start with 'https://'.
        :param sp_entity_id: Unique identifier for all SAML entities.
        """
        self._values = {
            'callback_uri': callback_uri,
            'sp_entity_id': sp_entity_id,
        }

    @builtins.property
    def callback_uri(self) -> str:
        """Callback URI where responses from IDP are handled.

        Must start with 'https://'.
        """
        return self._values.get('callback_uri')

    @builtins.property
    def sp_entity_id(self) -> str:
        """Unique identifier for all SAML entities."""
        return self._values.get('sp_entity_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformTenantInboundSamlConfigSpConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformTenantInboundSamlConfigTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class IdentityPlatformTenantInboundSamlConfigTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformTenantInboundSamlConfigTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class IdentityPlatformTenantOauthIdpConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.IdentityPlatformTenantOauthIdpConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, client_id: str, display_name: str, issuer: str, name: str, tenant: str, client_secret: typing.Optional[str]=None, enabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformTenantOauthIdpConfigTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param client_id: The client id of an OAuth client.
        :param display_name: Human friendly display name.
        :param issuer: For OIDC Idps, the issuer identifier.
        :param name: The name of the OauthIdpConfig. Must start with 'oidc.'.
        :param tenant: The name of the tenant where this OIDC IDP configuration resource exists.
        :param client_secret: The client secret of the OAuth client, to enable OIDC code flow.
        :param enabled: If this config allows users to sign in with the provider.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = IdentityPlatformTenantOauthIdpConfigConfig(client_id=client_id, display_name=display_name, issuer=issuer, name=name, tenant=tenant, client_secret=client_secret, enabled=enabled, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(IdentityPlatformTenantOauthIdpConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="clientId")
    def client_id(self) -> str:
        return jsii.get(self, "clientId")

    @client_id.setter
    def client_id(self, value: str) -> None:
        jsii.set(self, "clientId", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="issuer")
    def issuer(self) -> str:
        return jsii.get(self, "issuer")

    @issuer.setter
    def issuer(self, value: str) -> None:
        jsii.set(self, "issuer", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="tenant")
    def tenant(self) -> str:
        return jsii.get(self, "tenant")

    @tenant.setter
    def tenant(self, value: str) -> None:
        jsii.set(self, "tenant", value)

    @builtins.property
    @jsii.member(jsii_name="clientSecret")
    def client_secret(self) -> typing.Optional[str]:
        return jsii.get(self, "clientSecret")

    @client_secret.setter
    def client_secret(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "clientSecret", value)

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "enabled")

    @enabled.setter
    def enabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["IdentityPlatformTenantOauthIdpConfigTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["IdentityPlatformTenantOauthIdpConfigTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformTenantOauthIdpConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'client_id': 'clientId', 'display_name': 'displayName', 'issuer': 'issuer', 'name': 'name', 'tenant': 'tenant', 'client_secret': 'clientSecret', 'enabled': 'enabled', 'project': 'project', 'timeouts': 'timeouts'})
class IdentityPlatformTenantOauthIdpConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, client_id: str, display_name: str, issuer: str, name: str, tenant: str, client_secret: typing.Optional[str]=None, enabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["IdentityPlatformTenantOauthIdpConfigTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param client_id: The client id of an OAuth client.
        :param display_name: Human friendly display name.
        :param issuer: For OIDC Idps, the issuer identifier.
        :param name: The name of the OauthIdpConfig. Must start with 'oidc.'.
        :param tenant: The name of the tenant where this OIDC IDP configuration resource exists.
        :param client_secret: The client secret of the OAuth client, to enable OIDC code flow.
        :param enabled: If this config allows users to sign in with the provider.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = IdentityPlatformTenantOauthIdpConfigTimeouts(**timeouts)
        self._values = {
            'client_id': client_id,
            'display_name': display_name,
            'issuer': issuer,
            'name': name,
            'tenant': tenant,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if client_secret is not None: self._values["client_secret"] = client_secret
        if enabled is not None: self._values["enabled"] = enabled
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def client_id(self) -> str:
        """The client id of an OAuth client."""
        return self._values.get('client_id')

    @builtins.property
    def display_name(self) -> str:
        """Human friendly display name."""
        return self._values.get('display_name')

    @builtins.property
    def issuer(self) -> str:
        """For OIDC Idps, the issuer identifier."""
        return self._values.get('issuer')

    @builtins.property
    def name(self) -> str:
        """The name of the OauthIdpConfig.

        Must start with 'oidc.'.
        """
        return self._values.get('name')

    @builtins.property
    def tenant(self) -> str:
        """The name of the tenant where this OIDC IDP configuration resource exists."""
        return self._values.get('tenant')

    @builtins.property
    def client_secret(self) -> typing.Optional[str]:
        """The client secret of the OAuth client, to enable OIDC code flow."""
        return self._values.get('client_secret')

    @builtins.property
    def enabled(self) -> typing.Optional[bool]:
        """If this config allows users to sign in with the provider."""
        return self._values.get('enabled')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["IdentityPlatformTenantOauthIdpConfigTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformTenantOauthIdpConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformTenantOauthIdpConfigTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class IdentityPlatformTenantOauthIdpConfigTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformTenantOauthIdpConfigTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.IdentityPlatformTenantTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class IdentityPlatformTenantTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'IdentityPlatformTenantTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class KmsCryptoKey(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.KmsCryptoKey"):
    def __init__(self, scope: constructs.Construct, id: str, *, key_ring: str, name: str, labels: typing.Optional[typing.Mapping[str, str]]=None, purpose: typing.Optional[str]=None, rotation_period: typing.Optional[str]=None, timeouts: typing.Optional["KmsCryptoKeyTimeouts"]=None, version_template: typing.Optional[typing.List["KmsCryptoKeyVersionTemplate"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param key_ring: The KeyRing that this key belongs to. Format: ''projects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}''.
        :param name: The resource name for the CryptoKey.
        :param labels: Labels with user-defined metadata to apply to this resource.
        :param purpose: The immutable purpose of this CryptoKey. See the `purpose reference <https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys#CryptoKeyPurpose>`_ for possible inputs. Default value: "ENCRYPT_DECRYPT" Possible values: ["ENCRYPT_DECRYPT", "ASYMMETRIC_SIGN", "ASYMMETRIC_DECRYPT"]
        :param rotation_period: Every time this period passes, generate a new CryptoKeyVersion and set it as the primary. The first rotation will take place after the specified period. The rotation period has the format of a decimal number with up to 9 fractional digits, followed by the letter 's' (seconds). It must be greater than a day (ie, 86400).
        :param timeouts: timeouts block.
        :param version_template: version_template block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KmsCryptoKeyConfig(key_ring=key_ring, name=name, labels=labels, purpose=purpose, rotation_period=rotation_period, timeouts=timeouts, version_template=version_template, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(KmsCryptoKey, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="keyRing")
    def key_ring(self) -> str:
        return jsii.get(self, "keyRing")

    @key_ring.setter
    def key_ring(self, value: str) -> None:
        jsii.set(self, "keyRing", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="purpose")
    def purpose(self) -> typing.Optional[str]:
        return jsii.get(self, "purpose")

    @purpose.setter
    def purpose(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "purpose", value)

    @builtins.property
    @jsii.member(jsii_name="rotationPeriod")
    def rotation_period(self) -> typing.Optional[str]:
        return jsii.get(self, "rotationPeriod")

    @rotation_period.setter
    def rotation_period(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "rotationPeriod", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["KmsCryptoKeyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["KmsCryptoKeyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="versionTemplate")
    def version_template(self) -> typing.Optional[typing.List["KmsCryptoKeyVersionTemplate"]]:
        return jsii.get(self, "versionTemplate")

    @version_template.setter
    def version_template(self, value: typing.Optional[typing.List["KmsCryptoKeyVersionTemplate"]]) -> None:
        jsii.set(self, "versionTemplate", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsCryptoKeyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'key_ring': 'keyRing', 'name': 'name', 'labels': 'labels', 'purpose': 'purpose', 'rotation_period': 'rotationPeriod', 'timeouts': 'timeouts', 'version_template': 'versionTemplate'})
class KmsCryptoKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, key_ring: str, name: str, labels: typing.Optional[typing.Mapping[str, str]]=None, purpose: typing.Optional[str]=None, rotation_period: typing.Optional[str]=None, timeouts: typing.Optional["KmsCryptoKeyTimeouts"]=None, version_template: typing.Optional[typing.List["KmsCryptoKeyVersionTemplate"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_ring: The KeyRing that this key belongs to. Format: ''projects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}''.
        :param name: The resource name for the CryptoKey.
        :param labels: Labels with user-defined metadata to apply to this resource.
        :param purpose: The immutable purpose of this CryptoKey. See the `purpose reference <https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys#CryptoKeyPurpose>`_ for possible inputs. Default value: "ENCRYPT_DECRYPT" Possible values: ["ENCRYPT_DECRYPT", "ASYMMETRIC_SIGN", "ASYMMETRIC_DECRYPT"]
        :param rotation_period: Every time this period passes, generate a new CryptoKeyVersion and set it as the primary. The first rotation will take place after the specified period. The rotation period has the format of a decimal number with up to 9 fractional digits, followed by the letter 's' (seconds). It must be greater than a day (ie, 86400).
        :param timeouts: timeouts block.
        :param version_template: version_template block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = KmsCryptoKeyTimeouts(**timeouts)
        self._values = {
            'key_ring': key_ring,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if labels is not None: self._values["labels"] = labels
        if purpose is not None: self._values["purpose"] = purpose
        if rotation_period is not None: self._values["rotation_period"] = rotation_period
        if timeouts is not None: self._values["timeouts"] = timeouts
        if version_template is not None: self._values["version_template"] = version_template

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def key_ring(self) -> str:
        """The KeyRing that this key belongs to.

        Format: ''projects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}''.
        """
        return self._values.get('key_ring')

    @builtins.property
    def name(self) -> str:
        """The resource name for the CryptoKey."""
        return self._values.get('name')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Labels with user-defined metadata to apply to this resource."""
        return self._values.get('labels')

    @builtins.property
    def purpose(self) -> typing.Optional[str]:
        """The immutable purpose of this CryptoKey.

        See the
        `purpose reference <https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys#CryptoKeyPurpose>`_
        for possible inputs. Default value: "ENCRYPT_DECRYPT" Possible values: ["ENCRYPT_DECRYPT", "ASYMMETRIC_SIGN", "ASYMMETRIC_DECRYPT"]
        """
        return self._values.get('purpose')

    @builtins.property
    def rotation_period(self) -> typing.Optional[str]:
        """Every time this period passes, generate a new CryptoKeyVersion and set it as the primary.

        The first rotation will take place after the specified period. The rotation period has
        the format of a decimal number with up to 9 fractional digits, followed by the
        letter 's' (seconds). It must be greater than a day (ie, 86400).
        """
        return self._values.get('rotation_period')

    @builtins.property
    def timeouts(self) -> typing.Optional["KmsCryptoKeyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def version_template(self) -> typing.Optional[typing.List["KmsCryptoKeyVersionTemplate"]]:
        """version_template block."""
        return self._values.get('version_template')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsCryptoKeyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class KmsCryptoKeyIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.KmsCryptoKeyIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, crypto_key_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["KmsCryptoKeyIamBindingCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param crypto_key_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KmsCryptoKeyIamBindingConfig(crypto_key_id=crypto_key_id, members=members, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(KmsCryptoKeyIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="cryptoKeyId")
    def crypto_key_id(self) -> str:
        return jsii.get(self, "cryptoKeyId")

    @crypto_key_id.setter
    def crypto_key_id(self, value: str) -> None:
        jsii.set(self, "cryptoKeyId", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["KmsCryptoKeyIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["KmsCryptoKeyIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsCryptoKeyIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class KmsCryptoKeyIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsCryptoKeyIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsCryptoKeyIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'crypto_key_id': 'cryptoKeyId', 'members': 'members', 'role': 'role', 'condition': 'condition'})
class KmsCryptoKeyIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, crypto_key_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["KmsCryptoKeyIamBindingCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param crypto_key_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'crypto_key_id': crypto_key_id,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def crypto_key_id(self) -> str:
        return self._values.get('crypto_key_id')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["KmsCryptoKeyIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsCryptoKeyIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class KmsCryptoKeyIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.KmsCryptoKeyIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, crypto_key_id: str, member: str, role: str, condition: typing.Optional[typing.List["KmsCryptoKeyIamMemberCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param crypto_key_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KmsCryptoKeyIamMemberConfig(crypto_key_id=crypto_key_id, member=member, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(KmsCryptoKeyIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="cryptoKeyId")
    def crypto_key_id(self) -> str:
        return jsii.get(self, "cryptoKeyId")

    @crypto_key_id.setter
    def crypto_key_id(self, value: str) -> None:
        jsii.set(self, "cryptoKeyId", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["KmsCryptoKeyIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["KmsCryptoKeyIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsCryptoKeyIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class KmsCryptoKeyIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsCryptoKeyIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsCryptoKeyIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'crypto_key_id': 'cryptoKeyId', 'member': 'member', 'role': 'role', 'condition': 'condition'})
class KmsCryptoKeyIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, crypto_key_id: str, member: str, role: str, condition: typing.Optional[typing.List["KmsCryptoKeyIamMemberCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param crypto_key_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'crypto_key_id': crypto_key_id,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def crypto_key_id(self) -> str:
        return self._values.get('crypto_key_id')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["KmsCryptoKeyIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsCryptoKeyIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class KmsCryptoKeyIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.KmsCryptoKeyIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, crypto_key_id: str, policy_data: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param crypto_key_id: 
        :param policy_data: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KmsCryptoKeyIamPolicyConfig(crypto_key_id=crypto_key_id, policy_data=policy_data, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(KmsCryptoKeyIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="cryptoKeyId")
    def crypto_key_id(self) -> str:
        return jsii.get(self, "cryptoKeyId")

    @crypto_key_id.setter
    def crypto_key_id(self, value: str) -> None:
        jsii.set(self, "cryptoKeyId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsCryptoKeyIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'crypto_key_id': 'cryptoKeyId', 'policy_data': 'policyData'})
class KmsCryptoKeyIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, crypto_key_id: str, policy_data: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param crypto_key_id: 
        :param policy_data: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'crypto_key_id': crypto_key_id,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def crypto_key_id(self) -> str:
        return self._values.get('crypto_key_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsCryptoKeyIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsCryptoKeyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class KmsCryptoKeyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsCryptoKeyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsCryptoKeyVersionTemplate", jsii_struct_bases=[], name_mapping={'algorithm': 'algorithm', 'protection_level': 'protectionLevel'})
class KmsCryptoKeyVersionTemplate():
    def __init__(self, *, algorithm: str, protection_level: typing.Optional[str]=None) -> None:
        """
        :param algorithm: The algorithm to use when creating a version based on this template. See the `algorithm reference <https://cloud.google.com/kms/docs/reference/rest/v1/CryptoKeyVersionAlgorithm>`_ for possible inputs.
        :param protection_level: The protection level to use when creating a version based on this template. Default value: "SOFTWARE" Possible values: ["SOFTWARE", "HSM"]
        """
        self._values = {
            'algorithm': algorithm,
        }
        if protection_level is not None: self._values["protection_level"] = protection_level

    @builtins.property
    def algorithm(self) -> str:
        """The algorithm to use when creating a version based on this template.

        See the `algorithm reference <https://cloud.google.com/kms/docs/reference/rest/v1/CryptoKeyVersionAlgorithm>`_ for possible inputs.
        """
        return self._values.get('algorithm')

    @builtins.property
    def protection_level(self) -> typing.Optional[str]:
        """The protection level to use when creating a version based on this template.

        Default value: "SOFTWARE" Possible values: ["SOFTWARE", "HSM"]
        """
        return self._values.get('protection_level')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsCryptoKeyVersionTemplate(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class KmsKeyRing(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.KmsKeyRing"):
    def __init__(self, scope: constructs.Construct, id: str, *, location: str, name: str, project: typing.Optional[str]=None, timeouts: typing.Optional["KmsKeyRingTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param location: The location for the KeyRing. A full list of valid locations can be found by running 'gcloud kms locations list'.
        :param name: The resource name for the KeyRing.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KmsKeyRingConfig(location=location, name=name, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(KmsKeyRing, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: str) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["KmsKeyRingTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["KmsKeyRingTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsKeyRingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'location': 'location', 'name': 'name', 'project': 'project', 'timeouts': 'timeouts'})
class KmsKeyRingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, location: str, name: str, project: typing.Optional[str]=None, timeouts: typing.Optional["KmsKeyRingTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param location: The location for the KeyRing. A full list of valid locations can be found by running 'gcloud kms locations list'.
        :param name: The resource name for the KeyRing.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = KmsKeyRingTimeouts(**timeouts)
        self._values = {
            'location': location,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def location(self) -> str:
        """The location for the KeyRing.

        A full list of valid locations can be found by running 'gcloud kms locations list'.
        """
        return self._values.get('location')

    @builtins.property
    def name(self) -> str:
        """The resource name for the KeyRing."""
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["KmsKeyRingTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsKeyRingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class KmsKeyRingIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.KmsKeyRingIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, key_ring_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["KmsKeyRingIamBindingCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param key_ring_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KmsKeyRingIamBindingConfig(key_ring_id=key_ring_id, members=members, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(KmsKeyRingIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="keyRingId")
    def key_ring_id(self) -> str:
        return jsii.get(self, "keyRingId")

    @key_ring_id.setter
    def key_ring_id(self, value: str) -> None:
        jsii.set(self, "keyRingId", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["KmsKeyRingIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["KmsKeyRingIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsKeyRingIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class KmsKeyRingIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsKeyRingIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsKeyRingIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'key_ring_id': 'keyRingId', 'members': 'members', 'role': 'role', 'condition': 'condition'})
class KmsKeyRingIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, key_ring_id: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["KmsKeyRingIamBindingCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_ring_id: 
        :param members: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'key_ring_id': key_ring_id,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def key_ring_id(self) -> str:
        return self._values.get('key_ring_id')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["KmsKeyRingIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsKeyRingIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class KmsKeyRingIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.KmsKeyRingIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, key_ring_id: str, member: str, role: str, condition: typing.Optional[typing.List["KmsKeyRingIamMemberCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param key_ring_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KmsKeyRingIamMemberConfig(key_ring_id=key_ring_id, member=member, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(KmsKeyRingIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="keyRingId")
    def key_ring_id(self) -> str:
        return jsii.get(self, "keyRingId")

    @key_ring_id.setter
    def key_ring_id(self, value: str) -> None:
        jsii.set(self, "keyRingId", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["KmsKeyRingIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["KmsKeyRingIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsKeyRingIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class KmsKeyRingIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsKeyRingIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsKeyRingIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'key_ring_id': 'keyRingId', 'member': 'member', 'role': 'role', 'condition': 'condition'})
class KmsKeyRingIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, key_ring_id: str, member: str, role: str, condition: typing.Optional[typing.List["KmsKeyRingIamMemberCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_ring_id: 
        :param member: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'key_ring_id': key_ring_id,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def key_ring_id(self) -> str:
        return self._values.get('key_ring_id')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["KmsKeyRingIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsKeyRingIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class KmsKeyRingIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.KmsKeyRingIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, key_ring_id: str, policy_data: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param key_ring_id: 
        :param policy_data: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KmsKeyRingIamPolicyConfig(key_ring_id=key_ring_id, policy_data=policy_data, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(KmsKeyRingIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="keyRingId")
    def key_ring_id(self) -> str:
        return jsii.get(self, "keyRingId")

    @key_ring_id.setter
    def key_ring_id(self, value: str) -> None:
        jsii.set(self, "keyRingId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsKeyRingIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'key_ring_id': 'keyRingId', 'policy_data': 'policyData'})
class KmsKeyRingIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, key_ring_id: str, policy_data: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key_ring_id: 
        :param policy_data: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'key_ring_id': key_ring_id,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def key_ring_id(self) -> str:
        return self._values.get('key_ring_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsKeyRingIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class KmsKeyRingImportJob(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.KmsKeyRingImportJob"):
    def __init__(self, scope: constructs.Construct, id: str, *, import_job_id: str, import_method: str, key_ring: str, protection_level: str, timeouts: typing.Optional["KmsKeyRingImportJobTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param import_job_id: It must be unique within a KeyRing and match the regular expression [a-zA-Z0-9_-]{1,63}.
        :param import_method: The wrapping method to be used for incoming key material. Possible values: ["RSA_OAEP_3072_SHA1_AES_256", "RSA_OAEP_4096_SHA1_AES_256"]
        :param key_ring: The KeyRing that this import job belongs to. Format: ''projects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}''.
        :param protection_level: The protection level of the ImportJob. This must match the protectionLevel of the versionTemplate on the CryptoKey you attempt to import into. Possible values: ["SOFTWARE", "HSM", "EXTERNAL"]
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KmsKeyRingImportJobConfig(import_job_id=import_job_id, import_method=import_method, key_ring=key_ring, protection_level=protection_level, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(KmsKeyRingImportJob, self, [scope, id, config])

    @jsii.member(jsii_name="attestation")
    def attestation(self, index: str) -> "KmsKeyRingImportJobAttestation":
        """
        :param index: -
        """
        return jsii.invoke(self, "attestation", [index])

    @jsii.member(jsii_name="publicKey")
    def public_key(self, index: str) -> "KmsKeyRingImportJobPublicKey":
        """
        :param index: -
        """
        return jsii.invoke(self, "publicKey", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="expireTime")
    def expire_time(self) -> str:
        return jsii.get(self, "expireTime")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="state")
    def state(self) -> str:
        return jsii.get(self, "state")

    @builtins.property
    @jsii.member(jsii_name="importJobId")
    def import_job_id(self) -> str:
        return jsii.get(self, "importJobId")

    @import_job_id.setter
    def import_job_id(self, value: str) -> None:
        jsii.set(self, "importJobId", value)

    @builtins.property
    @jsii.member(jsii_name="importMethod")
    def import_method(self) -> str:
        return jsii.get(self, "importMethod")

    @import_method.setter
    def import_method(self, value: str) -> None:
        jsii.set(self, "importMethod", value)

    @builtins.property
    @jsii.member(jsii_name="keyRing")
    def key_ring(self) -> str:
        return jsii.get(self, "keyRing")

    @key_ring.setter
    def key_ring(self, value: str) -> None:
        jsii.set(self, "keyRing", value)

    @builtins.property
    @jsii.member(jsii_name="protectionLevel")
    def protection_level(self) -> str:
        return jsii.get(self, "protectionLevel")

    @protection_level.setter
    def protection_level(self, value: str) -> None:
        jsii.set(self, "protectionLevel", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["KmsKeyRingImportJobTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["KmsKeyRingImportJobTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


class KmsKeyRingImportJobAttestation(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.KmsKeyRingImportJobAttestation"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(KmsKeyRingImportJobAttestation, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="content")
    def content(self) -> str:
        return jsii.get(self, "content")

    @builtins.property
    @jsii.member(jsii_name="format")
    def format(self) -> str:
        return jsii.get(self, "format")


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsKeyRingImportJobConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'import_job_id': 'importJobId', 'import_method': 'importMethod', 'key_ring': 'keyRing', 'protection_level': 'protectionLevel', 'timeouts': 'timeouts'})
class KmsKeyRingImportJobConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, import_job_id: str, import_method: str, key_ring: str, protection_level: str, timeouts: typing.Optional["KmsKeyRingImportJobTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param import_job_id: It must be unique within a KeyRing and match the regular expression [a-zA-Z0-9_-]{1,63}.
        :param import_method: The wrapping method to be used for incoming key material. Possible values: ["RSA_OAEP_3072_SHA1_AES_256", "RSA_OAEP_4096_SHA1_AES_256"]
        :param key_ring: The KeyRing that this import job belongs to. Format: ''projects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}''.
        :param protection_level: The protection level of the ImportJob. This must match the protectionLevel of the versionTemplate on the CryptoKey you attempt to import into. Possible values: ["SOFTWARE", "HSM", "EXTERNAL"]
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = KmsKeyRingImportJobTimeouts(**timeouts)
        self._values = {
            'import_job_id': import_job_id,
            'import_method': import_method,
            'key_ring': key_ring,
            'protection_level': protection_level,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def import_job_id(self) -> str:
        """It must be unique within a KeyRing and match the regular expression [a-zA-Z0-9_-]{1,63}."""
        return self._values.get('import_job_id')

    @builtins.property
    def import_method(self) -> str:
        """The wrapping method to be used for incoming key material.

        Possible values: ["RSA_OAEP_3072_SHA1_AES_256", "RSA_OAEP_4096_SHA1_AES_256"]
        """
        return self._values.get('import_method')

    @builtins.property
    def key_ring(self) -> str:
        """The KeyRing that this import job belongs to.

        Format: ''projects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}''.
        """
        return self._values.get('key_ring')

    @builtins.property
    def protection_level(self) -> str:
        """The protection level of the ImportJob.

        This must match the protectionLevel of the
        versionTemplate on the CryptoKey you attempt to import into. Possible values: ["SOFTWARE", "HSM", "EXTERNAL"]
        """
        return self._values.get('protection_level')

    @builtins.property
    def timeouts(self) -> typing.Optional["KmsKeyRingImportJobTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsKeyRingImportJobConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class KmsKeyRingImportJobPublicKey(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.KmsKeyRingImportJobPublicKey"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(KmsKeyRingImportJobPublicKey, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="pem")
    def pem(self) -> str:
        return jsii.get(self, "pem")


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsKeyRingImportJobTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class KmsKeyRingImportJobTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsKeyRingImportJobTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsKeyRingTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class KmsKeyRingTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsKeyRingTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class KmsSecretCiphertext(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.KmsSecretCiphertext"):
    def __init__(self, scope: constructs.Construct, id: str, *, crypto_key: str, plaintext: str, additional_authenticated_data: typing.Optional[str]=None, timeouts: typing.Optional["KmsSecretCiphertextTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param crypto_key: The full name of the CryptoKey that will be used to encrypt the provided plaintext. Format: ''projects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}/cryptoKeys/{{cryptoKey}}''
        :param plaintext: The plaintext to be encrypted.
        :param additional_authenticated_data: The additional authenticated data used for integrity checks during encryption and decryption.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = KmsSecretCiphertextConfig(crypto_key=crypto_key, plaintext=plaintext, additional_authenticated_data=additional_authenticated_data, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(KmsSecretCiphertext, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="ciphertext")
    def ciphertext(self) -> str:
        return jsii.get(self, "ciphertext")

    @builtins.property
    @jsii.member(jsii_name="cryptoKey")
    def crypto_key(self) -> str:
        return jsii.get(self, "cryptoKey")

    @crypto_key.setter
    def crypto_key(self, value: str) -> None:
        jsii.set(self, "cryptoKey", value)

    @builtins.property
    @jsii.member(jsii_name="plaintext")
    def plaintext(self) -> str:
        return jsii.get(self, "plaintext")

    @plaintext.setter
    def plaintext(self, value: str) -> None:
        jsii.set(self, "plaintext", value)

    @builtins.property
    @jsii.member(jsii_name="additionalAuthenticatedData")
    def additional_authenticated_data(self) -> typing.Optional[str]:
        return jsii.get(self, "additionalAuthenticatedData")

    @additional_authenticated_data.setter
    def additional_authenticated_data(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "additionalAuthenticatedData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["KmsSecretCiphertextTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["KmsSecretCiphertextTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsSecretCiphertextConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'crypto_key': 'cryptoKey', 'plaintext': 'plaintext', 'additional_authenticated_data': 'additionalAuthenticatedData', 'timeouts': 'timeouts'})
class KmsSecretCiphertextConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, crypto_key: str, plaintext: str, additional_authenticated_data: typing.Optional[str]=None, timeouts: typing.Optional["KmsSecretCiphertextTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param crypto_key: The full name of the CryptoKey that will be used to encrypt the provided plaintext. Format: ''projects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}/cryptoKeys/{{cryptoKey}}''
        :param plaintext: The plaintext to be encrypted.
        :param additional_authenticated_data: The additional authenticated data used for integrity checks during encryption and decryption.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = KmsSecretCiphertextTimeouts(**timeouts)
        self._values = {
            'crypto_key': crypto_key,
            'plaintext': plaintext,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if additional_authenticated_data is not None: self._values["additional_authenticated_data"] = additional_authenticated_data
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def crypto_key(self) -> str:
        """The full name of the CryptoKey that will be used to encrypt the provided plaintext.

        Format: ''projects/{{project}}/locations/{{location}}/keyRings/{{keyRing}}/cryptoKeys/{{cryptoKey}}''
        """
        return self._values.get('crypto_key')

    @builtins.property
    def plaintext(self) -> str:
        """The plaintext to be encrypted."""
        return self._values.get('plaintext')

    @builtins.property
    def additional_authenticated_data(self) -> typing.Optional[str]:
        """The additional authenticated data used for integrity checks during encryption and decryption."""
        return self._values.get('additional_authenticated_data')

    @builtins.property
    def timeouts(self) -> typing.Optional["KmsSecretCiphertextTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsSecretCiphertextConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.KmsSecretCiphertextTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class KmsSecretCiphertextTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'KmsSecretCiphertextTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingBillingAccountBucketConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingBillingAccountBucketConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, billing_account: str, bucket_id: str, location: str, description: typing.Optional[str]=None, retention_days: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param billing_account: The parent resource that contains the logging bucket.
        :param bucket_id: The name of the logging bucket. Logging automatically creates two log buckets: _Required and _Default.
        :param location: The location of the bucket. The supported locations are: "global" "us-central1"
        :param description: An optional description for this bucket.
        :param retention_days: Logs will be retained by default for this amount of time, after which they will automatically be deleted. The minimum retention period is 1 day. If this value is set to zero at bucket creation time, the default time of 30 days will be used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingBillingAccountBucketConfigConfig(billing_account=billing_account, bucket_id=bucket_id, location=location, description=description, retention_days=retention_days, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingBillingAccountBucketConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="lifecycleState")
    def lifecycle_state(self) -> str:
        return jsii.get(self, "lifecycleState")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="billingAccount")
    def billing_account(self) -> str:
        return jsii.get(self, "billingAccount")

    @billing_account.setter
    def billing_account(self, value: str) -> None:
        jsii.set(self, "billingAccount", value)

    @builtins.property
    @jsii.member(jsii_name="bucketId")
    def bucket_id(self) -> str:
        return jsii.get(self, "bucketId")

    @bucket_id.setter
    def bucket_id(self, value: str) -> None:
        jsii.set(self, "bucketId", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: str) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="retentionDays")
    def retention_days(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "retentionDays")

    @retention_days.setter
    def retention_days(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "retentionDays", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingBillingAccountBucketConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'billing_account': 'billingAccount', 'bucket_id': 'bucketId', 'location': 'location', 'description': 'description', 'retention_days': 'retentionDays'})
class LoggingBillingAccountBucketConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, billing_account: str, bucket_id: str, location: str, description: typing.Optional[str]=None, retention_days: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param billing_account: The parent resource that contains the logging bucket.
        :param bucket_id: The name of the logging bucket. Logging automatically creates two log buckets: _Required and _Default.
        :param location: The location of the bucket. The supported locations are: "global" "us-central1"
        :param description: An optional description for this bucket.
        :param retention_days: Logs will be retained by default for this amount of time, after which they will automatically be deleted. The minimum retention period is 1 day. If this value is set to zero at bucket creation time, the default time of 30 days will be used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'billing_account': billing_account,
            'bucket_id': bucket_id,
            'location': location,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if retention_days is not None: self._values["retention_days"] = retention_days

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def billing_account(self) -> str:
        """The parent resource that contains the logging bucket."""
        return self._values.get('billing_account')

    @builtins.property
    def bucket_id(self) -> str:
        """The name of the logging bucket.

        Logging automatically creates two log buckets: _Required and _Default.
        """
        return self._values.get('bucket_id')

    @builtins.property
    def location(self) -> str:
        """The location of the bucket.

        The supported locations are: "global" "us-central1"
        """
        return self._values.get('location')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description for this bucket."""
        return self._values.get('description')

    @builtins.property
    def retention_days(self) -> typing.Optional[jsii.Number]:
        """Logs will be retained by default for this amount of time, after which they will automatically be deleted.

        The minimum retention period is 1 day. If this value is set to zero at bucket creation time, the default time of 30 days will be used.
        """
        return self._values.get('retention_days')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingBillingAccountBucketConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingBillingAccountExclusion(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingBillingAccountExclusion"):
    def __init__(self, scope: constructs.Construct, id: str, *, billing_account: str, filter: str, name: str, description: typing.Optional[str]=None, disabled: typing.Optional[bool]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param billing_account: 
        :param filter: The filter to apply when excluding logs. Only log entries that match the filter are excluded.
        :param name: The name of the logging exclusion.
        :param description: A human-readable description.
        :param disabled: Whether this exclusion rule should be disabled or not. This defaults to false.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingBillingAccountExclusionConfig(billing_account=billing_account, filter=filter, name=name, description=description, disabled=disabled, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingBillingAccountExclusion, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="billingAccount")
    def billing_account(self) -> str:
        return jsii.get(self, "billingAccount")

    @billing_account.setter
    def billing_account(self, value: str) -> None:
        jsii.set(self, "billingAccount", value)

    @builtins.property
    @jsii.member(jsii_name="filter")
    def filter(self) -> str:
        return jsii.get(self, "filter")

    @filter.setter
    def filter(self, value: str) -> None:
        jsii.set(self, "filter", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="disabled")
    def disabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "disabled")

    @disabled.setter
    def disabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "disabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingBillingAccountExclusionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'billing_account': 'billingAccount', 'filter': 'filter', 'name': 'name', 'description': 'description', 'disabled': 'disabled'})
class LoggingBillingAccountExclusionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, billing_account: str, filter: str, name: str, description: typing.Optional[str]=None, disabled: typing.Optional[bool]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param billing_account: 
        :param filter: The filter to apply when excluding logs. Only log entries that match the filter are excluded.
        :param name: The name of the logging exclusion.
        :param description: A human-readable description.
        :param disabled: Whether this exclusion rule should be disabled or not. This defaults to false.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'billing_account': billing_account,
            'filter': filter,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if disabled is not None: self._values["disabled"] = disabled

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def billing_account(self) -> str:
        return self._values.get('billing_account')

    @builtins.property
    def filter(self) -> str:
        """The filter to apply when excluding logs.

        Only log entries that match the filter are excluded.
        """
        return self._values.get('filter')

    @builtins.property
    def name(self) -> str:
        """The name of the logging exclusion."""
        return self._values.get('name')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A human-readable description."""
        return self._values.get('description')

    @builtins.property
    def disabled(self) -> typing.Optional[bool]:
        """Whether this exclusion rule should be disabled or not.

        This defaults to false.
        """
        return self._values.get('disabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingBillingAccountExclusionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingBillingAccountSink(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingBillingAccountSink"):
    def __init__(self, scope: constructs.Construct, id: str, *, billing_account: str, destination: str, name: str, bigquery_options: typing.Optional[typing.List["LoggingBillingAccountSinkBigqueryOptions"]]=None, filter: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param billing_account: The billing account exported to the sink.
        :param destination: The destination of the sink (or, in other words, where logs are written to). Can be a Cloud Storage bucket, a PubSub topic, or a BigQuery dataset. Examples: "storage.googleapis.com/[GCS_BUCKET]" "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]" "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]" The writer associated with the sink must have access to write to the above resource.
        :param name: The name of the logging sink.
        :param bigquery_options: bigquery_options block.
        :param filter: The filter to apply when exporting logs. Only log entries that match the filter are exported.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingBillingAccountSinkConfig(billing_account=billing_account, destination=destination, name=name, bigquery_options=bigquery_options, filter=filter, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingBillingAccountSink, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="writerIdentity")
    def writer_identity(self) -> str:
        return jsii.get(self, "writerIdentity")

    @builtins.property
    @jsii.member(jsii_name="billingAccount")
    def billing_account(self) -> str:
        return jsii.get(self, "billingAccount")

    @billing_account.setter
    def billing_account(self, value: str) -> None:
        jsii.set(self, "billingAccount", value)

    @builtins.property
    @jsii.member(jsii_name="destination")
    def destination(self) -> str:
        return jsii.get(self, "destination")

    @destination.setter
    def destination(self, value: str) -> None:
        jsii.set(self, "destination", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="bigqueryOptions")
    def bigquery_options(self) -> typing.Optional[typing.List["LoggingBillingAccountSinkBigqueryOptions"]]:
        return jsii.get(self, "bigqueryOptions")

    @bigquery_options.setter
    def bigquery_options(self, value: typing.Optional[typing.List["LoggingBillingAccountSinkBigqueryOptions"]]) -> None:
        jsii.set(self, "bigqueryOptions", value)

    @builtins.property
    @jsii.member(jsii_name="filter")
    def filter(self) -> typing.Optional[str]:
        return jsii.get(self, "filter")

    @filter.setter
    def filter(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "filter", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingBillingAccountSinkBigqueryOptions", jsii_struct_bases=[], name_mapping={'use_partitioned_tables': 'usePartitionedTables'})
class LoggingBillingAccountSinkBigqueryOptions():
    def __init__(self, *, use_partitioned_tables: bool) -> None:
        """
        :param use_partitioned_tables: Whether to use BigQuery's partition tables. By default, Logging creates dated tables based on the log entries' timestamps, e.g. syslog_20170523. With partitioned tables the date suffix is no longer present and special query syntax has to be used instead. In both cases, tables are sharded based on UTC timezone.
        """
        self._values = {
            'use_partitioned_tables': use_partitioned_tables,
        }

    @builtins.property
    def use_partitioned_tables(self) -> bool:
        """Whether to use BigQuery's partition tables.

        By default, Logging creates dated tables based on the log entries' timestamps, e.g. syslog_20170523. With partitioned tables the date suffix is no longer present and special query syntax has to be used instead. In both cases, tables are sharded based on UTC timezone.
        """
        return self._values.get('use_partitioned_tables')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingBillingAccountSinkBigqueryOptions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingBillingAccountSinkConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'billing_account': 'billingAccount', 'destination': 'destination', 'name': 'name', 'bigquery_options': 'bigqueryOptions', 'filter': 'filter'})
class LoggingBillingAccountSinkConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, billing_account: str, destination: str, name: str, bigquery_options: typing.Optional[typing.List["LoggingBillingAccountSinkBigqueryOptions"]]=None, filter: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param billing_account: The billing account exported to the sink.
        :param destination: The destination of the sink (or, in other words, where logs are written to). Can be a Cloud Storage bucket, a PubSub topic, or a BigQuery dataset. Examples: "storage.googleapis.com/[GCS_BUCKET]" "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]" "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]" The writer associated with the sink must have access to write to the above resource.
        :param name: The name of the logging sink.
        :param bigquery_options: bigquery_options block.
        :param filter: The filter to apply when exporting logs. Only log entries that match the filter are exported.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'billing_account': billing_account,
            'destination': destination,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if bigquery_options is not None: self._values["bigquery_options"] = bigquery_options
        if filter is not None: self._values["filter"] = filter

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def billing_account(self) -> str:
        """The billing account exported to the sink."""
        return self._values.get('billing_account')

    @builtins.property
    def destination(self) -> str:
        """The destination of the sink (or, in other words, where logs are written to).

        Can be a Cloud Storage bucket, a PubSub topic, or a BigQuery dataset. Examples: "storage.googleapis.com/[GCS_BUCKET]" "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]" "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]" The writer associated with the sink must have access to write to the above resource.
        """
        return self._values.get('destination')

    @builtins.property
    def name(self) -> str:
        """The name of the logging sink."""
        return self._values.get('name')

    @builtins.property
    def bigquery_options(self) -> typing.Optional[typing.List["LoggingBillingAccountSinkBigqueryOptions"]]:
        """bigquery_options block."""
        return self._values.get('bigquery_options')

    @builtins.property
    def filter(self) -> typing.Optional[str]:
        """The filter to apply when exporting logs.

        Only log entries that match the filter are exported.
        """
        return self._values.get('filter')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingBillingAccountSinkConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingFolderBucketConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingFolderBucketConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket_id: str, folder: str, location: str, description: typing.Optional[str]=None, retention_days: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket_id: The name of the logging bucket. Logging automatically creates two log buckets: _Required and _Default.
        :param folder: The parent resource that contains the logging bucket.
        :param location: The location of the bucket. The supported locations are: "global" "us-central1"
        :param description: An optional description for this bucket.
        :param retention_days: Logs will be retained by default for this amount of time, after which they will automatically be deleted. The minimum retention period is 1 day. If this value is set to zero at bucket creation time, the default time of 30 days will be used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingFolderBucketConfigConfig(bucket_id=bucket_id, folder=folder, location=location, description=description, retention_days=retention_days, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingFolderBucketConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="lifecycleState")
    def lifecycle_state(self) -> str:
        return jsii.get(self, "lifecycleState")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="bucketId")
    def bucket_id(self) -> str:
        return jsii.get(self, "bucketId")

    @bucket_id.setter
    def bucket_id(self, value: str) -> None:
        jsii.set(self, "bucketId", value)

    @builtins.property
    @jsii.member(jsii_name="folder")
    def folder(self) -> str:
        return jsii.get(self, "folder")

    @folder.setter
    def folder(self, value: str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: str) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="retentionDays")
    def retention_days(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "retentionDays")

    @retention_days.setter
    def retention_days(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "retentionDays", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingFolderBucketConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket_id': 'bucketId', 'folder': 'folder', 'location': 'location', 'description': 'description', 'retention_days': 'retentionDays'})
class LoggingFolderBucketConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket_id: str, folder: str, location: str, description: typing.Optional[str]=None, retention_days: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket_id: The name of the logging bucket. Logging automatically creates two log buckets: _Required and _Default.
        :param folder: The parent resource that contains the logging bucket.
        :param location: The location of the bucket. The supported locations are: "global" "us-central1"
        :param description: An optional description for this bucket.
        :param retention_days: Logs will be retained by default for this amount of time, after which they will automatically be deleted. The minimum retention period is 1 day. If this value is set to zero at bucket creation time, the default time of 30 days will be used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'bucket_id': bucket_id,
            'folder': folder,
            'location': location,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if retention_days is not None: self._values["retention_days"] = retention_days

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket_id(self) -> str:
        """The name of the logging bucket.

        Logging automatically creates two log buckets: _Required and _Default.
        """
        return self._values.get('bucket_id')

    @builtins.property
    def folder(self) -> str:
        """The parent resource that contains the logging bucket."""
        return self._values.get('folder')

    @builtins.property
    def location(self) -> str:
        """The location of the bucket.

        The supported locations are: "global" "us-central1"
        """
        return self._values.get('location')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description for this bucket."""
        return self._values.get('description')

    @builtins.property
    def retention_days(self) -> typing.Optional[jsii.Number]:
        """Logs will be retained by default for this amount of time, after which they will automatically be deleted.

        The minimum retention period is 1 day. If this value is set to zero at bucket creation time, the default time of 30 days will be used.
        """
        return self._values.get('retention_days')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingFolderBucketConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingFolderExclusion(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingFolderExclusion"):
    def __init__(self, scope: constructs.Construct, id: str, *, filter: str, folder: str, name: str, description: typing.Optional[str]=None, disabled: typing.Optional[bool]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param filter: The filter to apply when excluding logs. Only log entries that match the filter are excluded.
        :param folder: 
        :param name: The name of the logging exclusion.
        :param description: A human-readable description.
        :param disabled: Whether this exclusion rule should be disabled or not. This defaults to false.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingFolderExclusionConfig(filter=filter, folder=folder, name=name, description=description, disabled=disabled, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingFolderExclusion, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="filter")
    def filter(self) -> str:
        return jsii.get(self, "filter")

    @filter.setter
    def filter(self, value: str) -> None:
        jsii.set(self, "filter", value)

    @builtins.property
    @jsii.member(jsii_name="folder")
    def folder(self) -> str:
        return jsii.get(self, "folder")

    @folder.setter
    def folder(self, value: str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="disabled")
    def disabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "disabled")

    @disabled.setter
    def disabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "disabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingFolderExclusionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'filter': 'filter', 'folder': 'folder', 'name': 'name', 'description': 'description', 'disabled': 'disabled'})
class LoggingFolderExclusionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, filter: str, folder: str, name: str, description: typing.Optional[str]=None, disabled: typing.Optional[bool]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param filter: The filter to apply when excluding logs. Only log entries that match the filter are excluded.
        :param folder: 
        :param name: The name of the logging exclusion.
        :param description: A human-readable description.
        :param disabled: Whether this exclusion rule should be disabled or not. This defaults to false.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'filter': filter,
            'folder': folder,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if disabled is not None: self._values["disabled"] = disabled

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def filter(self) -> str:
        """The filter to apply when excluding logs.

        Only log entries that match the filter are excluded.
        """
        return self._values.get('filter')

    @builtins.property
    def folder(self) -> str:
        return self._values.get('folder')

    @builtins.property
    def name(self) -> str:
        """The name of the logging exclusion."""
        return self._values.get('name')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A human-readable description."""
        return self._values.get('description')

    @builtins.property
    def disabled(self) -> typing.Optional[bool]:
        """Whether this exclusion rule should be disabled or not.

        This defaults to false.
        """
        return self._values.get('disabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingFolderExclusionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingFolderSink(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingFolderSink"):
    def __init__(self, scope: constructs.Construct, id: str, *, destination: str, folder: str, name: str, bigquery_options: typing.Optional[typing.List["LoggingFolderSinkBigqueryOptions"]]=None, filter: typing.Optional[str]=None, include_children: typing.Optional[bool]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param destination: The destination of the sink (or, in other words, where logs are written to). Can be a Cloud Storage bucket, a PubSub topic, or a BigQuery dataset. Examples: "storage.googleapis.com/[GCS_BUCKET]" "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]" "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]" The writer associated with the sink must have access to write to the above resource.
        :param folder: The folder to be exported to the sink. Note that either [FOLDER_ID] or "folders/[FOLDER_ID]" is accepted.
        :param name: The name of the logging sink.
        :param bigquery_options: bigquery_options block.
        :param filter: The filter to apply when exporting logs. Only log entries that match the filter are exported.
        :param include_children: Whether or not to include children folders in the sink export. If true, logs associated with child projects are also exported; otherwise only logs relating to the provided folder are included.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingFolderSinkConfig(destination=destination, folder=folder, name=name, bigquery_options=bigquery_options, filter=filter, include_children=include_children, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingFolderSink, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="writerIdentity")
    def writer_identity(self) -> str:
        return jsii.get(self, "writerIdentity")

    @builtins.property
    @jsii.member(jsii_name="destination")
    def destination(self) -> str:
        return jsii.get(self, "destination")

    @destination.setter
    def destination(self, value: str) -> None:
        jsii.set(self, "destination", value)

    @builtins.property
    @jsii.member(jsii_name="folder")
    def folder(self) -> str:
        return jsii.get(self, "folder")

    @folder.setter
    def folder(self, value: str) -> None:
        jsii.set(self, "folder", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="bigqueryOptions")
    def bigquery_options(self) -> typing.Optional[typing.List["LoggingFolderSinkBigqueryOptions"]]:
        return jsii.get(self, "bigqueryOptions")

    @bigquery_options.setter
    def bigquery_options(self, value: typing.Optional[typing.List["LoggingFolderSinkBigqueryOptions"]]) -> None:
        jsii.set(self, "bigqueryOptions", value)

    @builtins.property
    @jsii.member(jsii_name="filter")
    def filter(self) -> typing.Optional[str]:
        return jsii.get(self, "filter")

    @filter.setter
    def filter(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "filter", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="includeChildren")
    def include_children(self) -> typing.Optional[bool]:
        return jsii.get(self, "includeChildren")

    @include_children.setter
    def include_children(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "includeChildren", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingFolderSinkBigqueryOptions", jsii_struct_bases=[], name_mapping={'use_partitioned_tables': 'usePartitionedTables'})
class LoggingFolderSinkBigqueryOptions():
    def __init__(self, *, use_partitioned_tables: bool) -> None:
        """
        :param use_partitioned_tables: Whether to use BigQuery's partition tables. By default, Logging creates dated tables based on the log entries' timestamps, e.g. syslog_20170523. With partitioned tables the date suffix is no longer present and special query syntax has to be used instead. In both cases, tables are sharded based on UTC timezone.
        """
        self._values = {
            'use_partitioned_tables': use_partitioned_tables,
        }

    @builtins.property
    def use_partitioned_tables(self) -> bool:
        """Whether to use BigQuery's partition tables.

        By default, Logging creates dated tables based on the log entries' timestamps, e.g. syslog_20170523. With partitioned tables the date suffix is no longer present and special query syntax has to be used instead. In both cases, tables are sharded based on UTC timezone.
        """
        return self._values.get('use_partitioned_tables')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingFolderSinkBigqueryOptions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingFolderSinkConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'destination': 'destination', 'folder': 'folder', 'name': 'name', 'bigquery_options': 'bigqueryOptions', 'filter': 'filter', 'include_children': 'includeChildren'})
class LoggingFolderSinkConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, destination: str, folder: str, name: str, bigquery_options: typing.Optional[typing.List["LoggingFolderSinkBigqueryOptions"]]=None, filter: typing.Optional[str]=None, include_children: typing.Optional[bool]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param destination: The destination of the sink (or, in other words, where logs are written to). Can be a Cloud Storage bucket, a PubSub topic, or a BigQuery dataset. Examples: "storage.googleapis.com/[GCS_BUCKET]" "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]" "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]" The writer associated with the sink must have access to write to the above resource.
        :param folder: The folder to be exported to the sink. Note that either [FOLDER_ID] or "folders/[FOLDER_ID]" is accepted.
        :param name: The name of the logging sink.
        :param bigquery_options: bigquery_options block.
        :param filter: The filter to apply when exporting logs. Only log entries that match the filter are exported.
        :param include_children: Whether or not to include children folders in the sink export. If true, logs associated with child projects are also exported; otherwise only logs relating to the provided folder are included.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'destination': destination,
            'folder': folder,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if bigquery_options is not None: self._values["bigquery_options"] = bigquery_options
        if filter is not None: self._values["filter"] = filter
        if include_children is not None: self._values["include_children"] = include_children

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def destination(self) -> str:
        """The destination of the sink (or, in other words, where logs are written to).

        Can be a Cloud Storage bucket, a PubSub topic, or a BigQuery dataset. Examples: "storage.googleapis.com/[GCS_BUCKET]" "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]" "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]" The writer associated with the sink must have access to write to the above resource.
        """
        return self._values.get('destination')

    @builtins.property
    def folder(self) -> str:
        """The folder to be exported to the sink.

        Note that either [FOLDER_ID] or "folders/[FOLDER_ID]" is accepted.
        """
        return self._values.get('folder')

    @builtins.property
    def name(self) -> str:
        """The name of the logging sink."""
        return self._values.get('name')

    @builtins.property
    def bigquery_options(self) -> typing.Optional[typing.List["LoggingFolderSinkBigqueryOptions"]]:
        """bigquery_options block."""
        return self._values.get('bigquery_options')

    @builtins.property
    def filter(self) -> typing.Optional[str]:
        """The filter to apply when exporting logs.

        Only log entries that match the filter are exported.
        """
        return self._values.get('filter')

    @builtins.property
    def include_children(self) -> typing.Optional[bool]:
        """Whether or not to include children folders in the sink export.

        If true, logs associated with child projects are also exported; otherwise only logs relating to the provided folder are included.
        """
        return self._values.get('include_children')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingFolderSinkConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingMetric(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingMetric"):
    def __init__(self, scope: constructs.Construct, id: str, *, filter: str, metric_descriptor: typing.List["LoggingMetricMetricDescriptor"], name: str, bucket_options: typing.Optional[typing.List["LoggingMetricBucketOptions"]]=None, description: typing.Optional[str]=None, label_extractors: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["LoggingMetricTimeouts"]=None, value_extractor: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param filter: An advanced logs filter (https://cloud.google.com/logging/docs/view/advanced-filters) which is used to match log entries.
        :param metric_descriptor: metric_descriptor block.
        :param name: The client-assigned metric identifier. Examples - "error_count", "nginx/requests". Metric identifiers are limited to 100 characters and can include only the following characters A-Z, a-z, 0-9, and the special characters _-.,+!*',()%/. The forward-slash character (/) denotes a hierarchy of name pieces, and it cannot be the first character of the name.
        :param bucket_options: bucket_options block.
        :param description: A description of this metric, which is used in documentation. The maximum length of the description is 8000 characters.
        :param label_extractors: A map from a label key string to an extractor expression which is used to extract data from a log entry field and assign as the label value. Each label key specified in the LabelDescriptor must have an associated extractor expression in this map. The syntax of the extractor expression is the same as for the valueExtractor field.
        :param project: 
        :param timeouts: timeouts block.
        :param value_extractor: A valueExtractor is required when using a distribution logs-based metric to extract the values to record from a log entry. Two functions are supported for value extraction - EXTRACT(field) or REGEXP_EXTRACT(field, regex). The argument are 1. field - The name of the log entry field from which the value is to be extracted. 2. regex - A regular expression using the Google RE2 syntax (https://github.com/google/re2/wiki/Syntax) with a single capture group to extract data from the specified log entry field. The value of the field is converted to a string before applying the regex. It is an error to specify a regex that does not include exactly one capture group.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingMetricConfig(filter=filter, metric_descriptor=metric_descriptor, name=name, bucket_options=bucket_options, description=description, label_extractors=label_extractors, project=project, timeouts=timeouts, value_extractor=value_extractor, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingMetric, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="filter")
    def filter(self) -> str:
        return jsii.get(self, "filter")

    @filter.setter
    def filter(self, value: str) -> None:
        jsii.set(self, "filter", value)

    @builtins.property
    @jsii.member(jsii_name="metricDescriptor")
    def metric_descriptor(self) -> typing.List["LoggingMetricMetricDescriptor"]:
        return jsii.get(self, "metricDescriptor")

    @metric_descriptor.setter
    def metric_descriptor(self, value: typing.List["LoggingMetricMetricDescriptor"]) -> None:
        jsii.set(self, "metricDescriptor", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="bucketOptions")
    def bucket_options(self) -> typing.Optional[typing.List["LoggingMetricBucketOptions"]]:
        return jsii.get(self, "bucketOptions")

    @bucket_options.setter
    def bucket_options(self, value: typing.Optional[typing.List["LoggingMetricBucketOptions"]]) -> None:
        jsii.set(self, "bucketOptions", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labelExtractors")
    def label_extractors(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labelExtractors")

    @label_extractors.setter
    def label_extractors(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labelExtractors", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["LoggingMetricTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["LoggingMetricTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="valueExtractor")
    def value_extractor(self) -> typing.Optional[str]:
        return jsii.get(self, "valueExtractor")

    @value_extractor.setter
    def value_extractor(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "valueExtractor", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingMetricBucketOptions", jsii_struct_bases=[], name_mapping={'explicit_buckets': 'explicitBuckets', 'exponential_buckets': 'exponentialBuckets', 'linear_buckets': 'linearBuckets'})
class LoggingMetricBucketOptions():
    def __init__(self, *, explicit_buckets: typing.Optional[typing.List["LoggingMetricBucketOptionsExplicitBuckets"]]=None, exponential_buckets: typing.Optional[typing.List["LoggingMetricBucketOptionsExponentialBuckets"]]=None, linear_buckets: typing.Optional[typing.List["LoggingMetricBucketOptionsLinearBuckets"]]=None) -> None:
        """
        :param explicit_buckets: explicit_buckets block.
        :param exponential_buckets: exponential_buckets block.
        :param linear_buckets: linear_buckets block.
        """
        self._values = {
        }
        if explicit_buckets is not None: self._values["explicit_buckets"] = explicit_buckets
        if exponential_buckets is not None: self._values["exponential_buckets"] = exponential_buckets
        if linear_buckets is not None: self._values["linear_buckets"] = linear_buckets

    @builtins.property
    def explicit_buckets(self) -> typing.Optional[typing.List["LoggingMetricBucketOptionsExplicitBuckets"]]:
        """explicit_buckets block."""
        return self._values.get('explicit_buckets')

    @builtins.property
    def exponential_buckets(self) -> typing.Optional[typing.List["LoggingMetricBucketOptionsExponentialBuckets"]]:
        """exponential_buckets block."""
        return self._values.get('exponential_buckets')

    @builtins.property
    def linear_buckets(self) -> typing.Optional[typing.List["LoggingMetricBucketOptionsLinearBuckets"]]:
        """linear_buckets block."""
        return self._values.get('linear_buckets')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingMetricBucketOptions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingMetricBucketOptionsExplicitBuckets", jsii_struct_bases=[], name_mapping={'bounds': 'bounds'})
class LoggingMetricBucketOptionsExplicitBuckets():
    def __init__(self, *, bounds: typing.List[jsii.Number]) -> None:
        """
        :param bounds: The values must be monotonically increasing.
        """
        self._values = {
            'bounds': bounds,
        }

    @builtins.property
    def bounds(self) -> typing.List[jsii.Number]:
        """The values must be monotonically increasing."""
        return self._values.get('bounds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingMetricBucketOptionsExplicitBuckets(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingMetricBucketOptionsExponentialBuckets", jsii_struct_bases=[], name_mapping={'growth_factor': 'growthFactor', 'num_finite_buckets': 'numFiniteBuckets', 'scale': 'scale'})
class LoggingMetricBucketOptionsExponentialBuckets():
    def __init__(self, *, growth_factor: typing.Optional[jsii.Number]=None, num_finite_buckets: typing.Optional[jsii.Number]=None, scale: typing.Optional[jsii.Number]=None) -> None:
        """
        :param growth_factor: Must be greater than 1.
        :param num_finite_buckets: Must be greater than 0.
        :param scale: Must be greater than 0.
        """
        self._values = {
        }
        if growth_factor is not None: self._values["growth_factor"] = growth_factor
        if num_finite_buckets is not None: self._values["num_finite_buckets"] = num_finite_buckets
        if scale is not None: self._values["scale"] = scale

    @builtins.property
    def growth_factor(self) -> typing.Optional[jsii.Number]:
        """Must be greater than 1."""
        return self._values.get('growth_factor')

    @builtins.property
    def num_finite_buckets(self) -> typing.Optional[jsii.Number]:
        """Must be greater than 0."""
        return self._values.get('num_finite_buckets')

    @builtins.property
    def scale(self) -> typing.Optional[jsii.Number]:
        """Must be greater than 0."""
        return self._values.get('scale')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingMetricBucketOptionsExponentialBuckets(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingMetricBucketOptionsLinearBuckets", jsii_struct_bases=[], name_mapping={'num_finite_buckets': 'numFiniteBuckets', 'offset': 'offset', 'width': 'width'})
class LoggingMetricBucketOptionsLinearBuckets():
    def __init__(self, *, num_finite_buckets: typing.Optional[jsii.Number]=None, offset: typing.Optional[jsii.Number]=None, width: typing.Optional[jsii.Number]=None) -> None:
        """
        :param num_finite_buckets: Must be greater than 0.
        :param offset: Lower bound of the first bucket.
        :param width: Must be greater than 0.
        """
        self._values = {
        }
        if num_finite_buckets is not None: self._values["num_finite_buckets"] = num_finite_buckets
        if offset is not None: self._values["offset"] = offset
        if width is not None: self._values["width"] = width

    @builtins.property
    def num_finite_buckets(self) -> typing.Optional[jsii.Number]:
        """Must be greater than 0."""
        return self._values.get('num_finite_buckets')

    @builtins.property
    def offset(self) -> typing.Optional[jsii.Number]:
        """Lower bound of the first bucket."""
        return self._values.get('offset')

    @builtins.property
    def width(self) -> typing.Optional[jsii.Number]:
        """Must be greater than 0."""
        return self._values.get('width')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingMetricBucketOptionsLinearBuckets(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingMetricConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'filter': 'filter', 'metric_descriptor': 'metricDescriptor', 'name': 'name', 'bucket_options': 'bucketOptions', 'description': 'description', 'label_extractors': 'labelExtractors', 'project': 'project', 'timeouts': 'timeouts', 'value_extractor': 'valueExtractor'})
class LoggingMetricConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, filter: str, metric_descriptor: typing.List["LoggingMetricMetricDescriptor"], name: str, bucket_options: typing.Optional[typing.List["LoggingMetricBucketOptions"]]=None, description: typing.Optional[str]=None, label_extractors: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["LoggingMetricTimeouts"]=None, value_extractor: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param filter: An advanced logs filter (https://cloud.google.com/logging/docs/view/advanced-filters) which is used to match log entries.
        :param metric_descriptor: metric_descriptor block.
        :param name: The client-assigned metric identifier. Examples - "error_count", "nginx/requests". Metric identifiers are limited to 100 characters and can include only the following characters A-Z, a-z, 0-9, and the special characters _-.,+!*',()%/. The forward-slash character (/) denotes a hierarchy of name pieces, and it cannot be the first character of the name.
        :param bucket_options: bucket_options block.
        :param description: A description of this metric, which is used in documentation. The maximum length of the description is 8000 characters.
        :param label_extractors: A map from a label key string to an extractor expression which is used to extract data from a log entry field and assign as the label value. Each label key specified in the LabelDescriptor must have an associated extractor expression in this map. The syntax of the extractor expression is the same as for the valueExtractor field.
        :param project: 
        :param timeouts: timeouts block.
        :param value_extractor: A valueExtractor is required when using a distribution logs-based metric to extract the values to record from a log entry. Two functions are supported for value extraction - EXTRACT(field) or REGEXP_EXTRACT(field, regex). The argument are 1. field - The name of the log entry field from which the value is to be extracted. 2. regex - A regular expression using the Google RE2 syntax (https://github.com/google/re2/wiki/Syntax) with a single capture group to extract data from the specified log entry field. The value of the field is converted to a string before applying the regex. It is an error to specify a regex that does not include exactly one capture group.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = LoggingMetricTimeouts(**timeouts)
        self._values = {
            'filter': filter,
            'metric_descriptor': metric_descriptor,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if bucket_options is not None: self._values["bucket_options"] = bucket_options
        if description is not None: self._values["description"] = description
        if label_extractors is not None: self._values["label_extractors"] = label_extractors
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if value_extractor is not None: self._values["value_extractor"] = value_extractor

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def filter(self) -> str:
        """An advanced logs filter (https://cloud.google.com/logging/docs/view/advanced-filters) which is used to match log entries."""
        return self._values.get('filter')

    @builtins.property
    def metric_descriptor(self) -> typing.List["LoggingMetricMetricDescriptor"]:
        """metric_descriptor block."""
        return self._values.get('metric_descriptor')

    @builtins.property
    def name(self) -> str:
        """The client-assigned metric identifier.

        Examples - "error_count", "nginx/requests".
        Metric identifiers are limited to 100 characters and can include only the following
        characters A-Z, a-z, 0-9, and the special characters _-.,+!*',()%/. The forward-slash
        character (/) denotes a hierarchy of name pieces, and it cannot be the first character
        of the name.
        """
        return self._values.get('name')

    @builtins.property
    def bucket_options(self) -> typing.Optional[typing.List["LoggingMetricBucketOptions"]]:
        """bucket_options block."""
        return self._values.get('bucket_options')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A description of this metric, which is used in documentation.

        The maximum length of the
        description is 8000 characters.
        """
        return self._values.get('description')

    @builtins.property
    def label_extractors(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A map from a label key string to an extractor expression which is used to extract data from a log entry field and assign as the label value.

        Each label key specified in the LabelDescriptor must
        have an associated extractor expression in this map. The syntax of the extractor expression is
        the same as for the valueExtractor field.
        """
        return self._values.get('label_extractors')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["LoggingMetricTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def value_extractor(self) -> typing.Optional[str]:
        """A valueExtractor is required when using a distribution logs-based metric to extract the values to record from a log entry.

        Two functions are supported for value extraction - EXTRACT(field) or
        REGEXP_EXTRACT(field, regex). The argument are 1. field - The name of the log entry field from which
        the value is to be extracted. 2. regex - A regular expression using the Google RE2 syntax
        (https://github.com/google/re2/wiki/Syntax) with a single capture group to extract data from the specified
        log entry field. The value of the field is converted to a string before applying the regex. It is an
        error to specify a regex that does not include exactly one capture group.
        """
        return self._values.get('value_extractor')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingMetricConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingMetricMetricDescriptor", jsii_struct_bases=[], name_mapping={'metric_kind': 'metricKind', 'value_type': 'valueType', 'display_name': 'displayName', 'labels': 'labels', 'unit': 'unit'})
class LoggingMetricMetricDescriptor():
    def __init__(self, *, metric_kind: str, value_type: str, display_name: typing.Optional[str]=None, labels: typing.Optional[typing.List["LoggingMetricMetricDescriptorLabels"]]=None, unit: typing.Optional[str]=None) -> None:
        """
        :param metric_kind: Whether the metric records instantaneous values, changes to a value, etc. Some combinations of metricKind and valueType might not be supported. For counter metrics, set this to DELTA. Possible values: ["DELTA", "GAUGE", "CUMULATIVE"]
        :param value_type: Whether the measurement is an integer, a floating-point number, etc. Some combinations of metricKind and valueType might not be supported. For counter metrics, set this to INT64. Possible values: ["BOOL", "INT64", "DOUBLE", "STRING", "DISTRIBUTION", "MONEY"]
        :param display_name: A concise name for the metric, which can be displayed in user interfaces. Use sentence case without an ending period, for example "Request count". This field is optional but it is recommended to be set for any metrics associated with user-visible concepts, such as Quota.
        :param labels: labels block.
        :param unit: The unit in which the metric value is reported. It is only applicable if the valueType is 'INT64', 'DOUBLE', or 'DISTRIBUTION'. The supported units are a subset of `The Unified Code for Units of Measure <http://unitsofmeasure.org/ucum.html>`_ standard
        """
        self._values = {
            'metric_kind': metric_kind,
            'value_type': value_type,
        }
        if display_name is not None: self._values["display_name"] = display_name
        if labels is not None: self._values["labels"] = labels
        if unit is not None: self._values["unit"] = unit

    @builtins.property
    def metric_kind(self) -> str:
        """Whether the metric records instantaneous values, changes to a value, etc.

        Some combinations of metricKind and valueType might not be supported.
        For counter metrics, set this to DELTA. Possible values: ["DELTA", "GAUGE", "CUMULATIVE"]
        """
        return self._values.get('metric_kind')

    @builtins.property
    def value_type(self) -> str:
        """Whether the measurement is an integer, a floating-point number, etc.

        Some combinations of metricKind and valueType might not be supported.
        For counter metrics, set this to INT64. Possible values: ["BOOL", "INT64", "DOUBLE", "STRING", "DISTRIBUTION", "MONEY"]
        """
        return self._values.get('value_type')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """A concise name for the metric, which can be displayed in user interfaces.

        Use sentence case
        without an ending period, for example "Request count". This field is optional but it is
        recommended to be set for any metrics associated with user-visible concepts, such as Quota.
        """
        return self._values.get('display_name')

    @builtins.property
    def labels(self) -> typing.Optional[typing.List["LoggingMetricMetricDescriptorLabels"]]:
        """labels block."""
        return self._values.get('labels')

    @builtins.property
    def unit(self) -> typing.Optional[str]:
        """The unit in which the metric value is reported.

        It is only applicable if the valueType is
        'INT64', 'DOUBLE', or 'DISTRIBUTION'. The supported units are a subset of
        `The Unified Code for Units of Measure <http://unitsofmeasure.org/ucum.html>`_ standard
        """
        return self._values.get('unit')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingMetricMetricDescriptor(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingMetricMetricDescriptorLabels", jsii_struct_bases=[], name_mapping={'key': 'key', 'description': 'description', 'value_type': 'valueType'})
class LoggingMetricMetricDescriptorLabels():
    def __init__(self, *, key: str, description: typing.Optional[str]=None, value_type: typing.Optional[str]=None) -> None:
        """
        :param key: The label key.
        :param description: A human-readable description for the label.
        :param value_type: The type of data that can be assigned to the label. Default value: "STRING" Possible values: ["BOOL", "INT64", "STRING"]
        """
        self._values = {
            'key': key,
        }
        if description is not None: self._values["description"] = description
        if value_type is not None: self._values["value_type"] = value_type

    @builtins.property
    def key(self) -> str:
        """The label key."""
        return self._values.get('key')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A human-readable description for the label."""
        return self._values.get('description')

    @builtins.property
    def value_type(self) -> typing.Optional[str]:
        """The type of data that can be assigned to the label.

        Default value: "STRING" Possible values: ["BOOL", "INT64", "STRING"]
        """
        return self._values.get('value_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingMetricMetricDescriptorLabels(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingMetricTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class LoggingMetricTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingMetricTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingOrganizationBucketConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingOrganizationBucketConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket_id: str, location: str, organization: str, description: typing.Optional[str]=None, retention_days: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket_id: The name of the logging bucket. Logging automatically creates two log buckets: _Required and _Default.
        :param location: The location of the bucket. The supported locations are: "global" "us-central1"
        :param organization: The parent resource that contains the logging bucket.
        :param description: An optional description for this bucket.
        :param retention_days: Logs will be retained by default for this amount of time, after which they will automatically be deleted. The minimum retention period is 1 day. If this value is set to zero at bucket creation time, the default time of 30 days will be used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingOrganizationBucketConfigConfig(bucket_id=bucket_id, location=location, organization=organization, description=description, retention_days=retention_days, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingOrganizationBucketConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="lifecycleState")
    def lifecycle_state(self) -> str:
        return jsii.get(self, "lifecycleState")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="bucketId")
    def bucket_id(self) -> str:
        return jsii.get(self, "bucketId")

    @bucket_id.setter
    def bucket_id(self, value: str) -> None:
        jsii.set(self, "bucketId", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: str) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="organization")
    def organization(self) -> str:
        return jsii.get(self, "organization")

    @organization.setter
    def organization(self, value: str) -> None:
        jsii.set(self, "organization", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="retentionDays")
    def retention_days(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "retentionDays")

    @retention_days.setter
    def retention_days(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "retentionDays", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingOrganizationBucketConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket_id': 'bucketId', 'location': 'location', 'organization': 'organization', 'description': 'description', 'retention_days': 'retentionDays'})
class LoggingOrganizationBucketConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket_id: str, location: str, organization: str, description: typing.Optional[str]=None, retention_days: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket_id: The name of the logging bucket. Logging automatically creates two log buckets: _Required and _Default.
        :param location: The location of the bucket. The supported locations are: "global" "us-central1"
        :param organization: The parent resource that contains the logging bucket.
        :param description: An optional description for this bucket.
        :param retention_days: Logs will be retained by default for this amount of time, after which they will automatically be deleted. The minimum retention period is 1 day. If this value is set to zero at bucket creation time, the default time of 30 days will be used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'bucket_id': bucket_id,
            'location': location,
            'organization': organization,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if retention_days is not None: self._values["retention_days"] = retention_days

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket_id(self) -> str:
        """The name of the logging bucket.

        Logging automatically creates two log buckets: _Required and _Default.
        """
        return self._values.get('bucket_id')

    @builtins.property
    def location(self) -> str:
        """The location of the bucket.

        The supported locations are: "global" "us-central1"
        """
        return self._values.get('location')

    @builtins.property
    def organization(self) -> str:
        """The parent resource that contains the logging bucket."""
        return self._values.get('organization')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description for this bucket."""
        return self._values.get('description')

    @builtins.property
    def retention_days(self) -> typing.Optional[jsii.Number]:
        """Logs will be retained by default for this amount of time, after which they will automatically be deleted.

        The minimum retention period is 1 day. If this value is set to zero at bucket creation time, the default time of 30 days will be used.
        """
        return self._values.get('retention_days')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingOrganizationBucketConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingOrganizationExclusion(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingOrganizationExclusion"):
    def __init__(self, scope: constructs.Construct, id: str, *, filter: str, name: str, org_id: str, description: typing.Optional[str]=None, disabled: typing.Optional[bool]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param filter: The filter to apply when excluding logs. Only log entries that match the filter are excluded.
        :param name: The name of the logging exclusion.
        :param org_id: 
        :param description: A human-readable description.
        :param disabled: Whether this exclusion rule should be disabled or not. This defaults to false.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingOrganizationExclusionConfig(filter=filter, name=name, org_id=org_id, description=description, disabled=disabled, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingOrganizationExclusion, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="filter")
    def filter(self) -> str:
        return jsii.get(self, "filter")

    @filter.setter
    def filter(self, value: str) -> None:
        jsii.set(self, "filter", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> str:
        return jsii.get(self, "orgId")

    @org_id.setter
    def org_id(self, value: str) -> None:
        jsii.set(self, "orgId", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="disabled")
    def disabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "disabled")

    @disabled.setter
    def disabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "disabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingOrganizationExclusionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'filter': 'filter', 'name': 'name', 'org_id': 'orgId', 'description': 'description', 'disabled': 'disabled'})
class LoggingOrganizationExclusionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, filter: str, name: str, org_id: str, description: typing.Optional[str]=None, disabled: typing.Optional[bool]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param filter: The filter to apply when excluding logs. Only log entries that match the filter are excluded.
        :param name: The name of the logging exclusion.
        :param org_id: 
        :param description: A human-readable description.
        :param disabled: Whether this exclusion rule should be disabled or not. This defaults to false.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'filter': filter,
            'name': name,
            'org_id': org_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if disabled is not None: self._values["disabled"] = disabled

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def filter(self) -> str:
        """The filter to apply when excluding logs.

        Only log entries that match the filter are excluded.
        """
        return self._values.get('filter')

    @builtins.property
    def name(self) -> str:
        """The name of the logging exclusion."""
        return self._values.get('name')

    @builtins.property
    def org_id(self) -> str:
        return self._values.get('org_id')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A human-readable description."""
        return self._values.get('description')

    @builtins.property
    def disabled(self) -> typing.Optional[bool]:
        """Whether this exclusion rule should be disabled or not.

        This defaults to false.
        """
        return self._values.get('disabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingOrganizationExclusionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingOrganizationSink(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingOrganizationSink"):
    def __init__(self, scope: constructs.Construct, id: str, *, destination: str, name: str, org_id: str, bigquery_options: typing.Optional[typing.List["LoggingOrganizationSinkBigqueryOptions"]]=None, filter: typing.Optional[str]=None, include_children: typing.Optional[bool]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param destination: The destination of the sink (or, in other words, where logs are written to). Can be a Cloud Storage bucket, a PubSub topic, or a BigQuery dataset. Examples: "storage.googleapis.com/[GCS_BUCKET]" "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]" "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]" The writer associated with the sink must have access to write to the above resource.
        :param name: The name of the logging sink.
        :param org_id: The numeric ID of the organization to be exported to the sink.
        :param bigquery_options: bigquery_options block.
        :param filter: The filter to apply when exporting logs. Only log entries that match the filter are exported.
        :param include_children: Whether or not to include children organizations in the sink export. If true, logs associated with child projects are also exported; otherwise only logs relating to the provided organization are included.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingOrganizationSinkConfig(destination=destination, name=name, org_id=org_id, bigquery_options=bigquery_options, filter=filter, include_children=include_children, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingOrganizationSink, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="writerIdentity")
    def writer_identity(self) -> str:
        return jsii.get(self, "writerIdentity")

    @builtins.property
    @jsii.member(jsii_name="destination")
    def destination(self) -> str:
        return jsii.get(self, "destination")

    @destination.setter
    def destination(self, value: str) -> None:
        jsii.set(self, "destination", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> str:
        return jsii.get(self, "orgId")

    @org_id.setter
    def org_id(self, value: str) -> None:
        jsii.set(self, "orgId", value)

    @builtins.property
    @jsii.member(jsii_name="bigqueryOptions")
    def bigquery_options(self) -> typing.Optional[typing.List["LoggingOrganizationSinkBigqueryOptions"]]:
        return jsii.get(self, "bigqueryOptions")

    @bigquery_options.setter
    def bigquery_options(self, value: typing.Optional[typing.List["LoggingOrganizationSinkBigqueryOptions"]]) -> None:
        jsii.set(self, "bigqueryOptions", value)

    @builtins.property
    @jsii.member(jsii_name="filter")
    def filter(self) -> typing.Optional[str]:
        return jsii.get(self, "filter")

    @filter.setter
    def filter(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "filter", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="includeChildren")
    def include_children(self) -> typing.Optional[bool]:
        return jsii.get(self, "includeChildren")

    @include_children.setter
    def include_children(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "includeChildren", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingOrganizationSinkBigqueryOptions", jsii_struct_bases=[], name_mapping={'use_partitioned_tables': 'usePartitionedTables'})
class LoggingOrganizationSinkBigqueryOptions():
    def __init__(self, *, use_partitioned_tables: bool) -> None:
        """
        :param use_partitioned_tables: Whether to use BigQuery's partition tables. By default, Logging creates dated tables based on the log entries' timestamps, e.g. syslog_20170523. With partitioned tables the date suffix is no longer present and special query syntax has to be used instead. In both cases, tables are sharded based on UTC timezone.
        """
        self._values = {
            'use_partitioned_tables': use_partitioned_tables,
        }

    @builtins.property
    def use_partitioned_tables(self) -> bool:
        """Whether to use BigQuery's partition tables.

        By default, Logging creates dated tables based on the log entries' timestamps, e.g. syslog_20170523. With partitioned tables the date suffix is no longer present and special query syntax has to be used instead. In both cases, tables are sharded based on UTC timezone.
        """
        return self._values.get('use_partitioned_tables')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingOrganizationSinkBigqueryOptions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingOrganizationSinkConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'destination': 'destination', 'name': 'name', 'org_id': 'orgId', 'bigquery_options': 'bigqueryOptions', 'filter': 'filter', 'include_children': 'includeChildren'})
class LoggingOrganizationSinkConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, destination: str, name: str, org_id: str, bigquery_options: typing.Optional[typing.List["LoggingOrganizationSinkBigqueryOptions"]]=None, filter: typing.Optional[str]=None, include_children: typing.Optional[bool]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param destination: The destination of the sink (or, in other words, where logs are written to). Can be a Cloud Storage bucket, a PubSub topic, or a BigQuery dataset. Examples: "storage.googleapis.com/[GCS_BUCKET]" "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]" "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]" The writer associated with the sink must have access to write to the above resource.
        :param name: The name of the logging sink.
        :param org_id: The numeric ID of the organization to be exported to the sink.
        :param bigquery_options: bigquery_options block.
        :param filter: The filter to apply when exporting logs. Only log entries that match the filter are exported.
        :param include_children: Whether or not to include children organizations in the sink export. If true, logs associated with child projects are also exported; otherwise only logs relating to the provided organization are included.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'destination': destination,
            'name': name,
            'org_id': org_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if bigquery_options is not None: self._values["bigquery_options"] = bigquery_options
        if filter is not None: self._values["filter"] = filter
        if include_children is not None: self._values["include_children"] = include_children

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def destination(self) -> str:
        """The destination of the sink (or, in other words, where logs are written to).

        Can be a Cloud Storage bucket, a PubSub topic, or a BigQuery dataset. Examples: "storage.googleapis.com/[GCS_BUCKET]" "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]" "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]" The writer associated with the sink must have access to write to the above resource.
        """
        return self._values.get('destination')

    @builtins.property
    def name(self) -> str:
        """The name of the logging sink."""
        return self._values.get('name')

    @builtins.property
    def org_id(self) -> str:
        """The numeric ID of the organization to be exported to the sink."""
        return self._values.get('org_id')

    @builtins.property
    def bigquery_options(self) -> typing.Optional[typing.List["LoggingOrganizationSinkBigqueryOptions"]]:
        """bigquery_options block."""
        return self._values.get('bigquery_options')

    @builtins.property
    def filter(self) -> typing.Optional[str]:
        """The filter to apply when exporting logs.

        Only log entries that match the filter are exported.
        """
        return self._values.get('filter')

    @builtins.property
    def include_children(self) -> typing.Optional[bool]:
        """Whether or not to include children organizations in the sink export.

        If true, logs associated with child projects are also exported; otherwise only logs relating to the provided organization are included.
        """
        return self._values.get('include_children')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingOrganizationSinkConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingProjectBucketConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingProjectBucketConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket_id: str, location: str, project: str, description: typing.Optional[str]=None, retention_days: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket_id: The name of the logging bucket. Logging automatically creates two log buckets: _Required and _Default.
        :param location: The location of the bucket. The supported locations are: "global" "us-central1"
        :param project: The parent project that contains the logging bucket.
        :param description: An optional description for this bucket.
        :param retention_days: Logs will be retained by default for this amount of time, after which they will automatically be deleted. The minimum retention period is 1 day. If this value is set to zero at bucket creation time, the default time of 30 days will be used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingProjectBucketConfigConfig(bucket_id=bucket_id, location=location, project=project, description=description, retention_days=retention_days, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingProjectBucketConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="lifecycleState")
    def lifecycle_state(self) -> str:
        return jsii.get(self, "lifecycleState")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="bucketId")
    def bucket_id(self) -> str:
        return jsii.get(self, "bucketId")

    @bucket_id.setter
    def bucket_id(self, value: str) -> None:
        jsii.set(self, "bucketId", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> str:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: str) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> str:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: str) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="retentionDays")
    def retention_days(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "retentionDays")

    @retention_days.setter
    def retention_days(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "retentionDays", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingProjectBucketConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket_id': 'bucketId', 'location': 'location', 'project': 'project', 'description': 'description', 'retention_days': 'retentionDays'})
class LoggingProjectBucketConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket_id: str, location: str, project: str, description: typing.Optional[str]=None, retention_days: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket_id: The name of the logging bucket. Logging automatically creates two log buckets: _Required and _Default.
        :param location: The location of the bucket. The supported locations are: "global" "us-central1"
        :param project: The parent project that contains the logging bucket.
        :param description: An optional description for this bucket.
        :param retention_days: Logs will be retained by default for this amount of time, after which they will automatically be deleted. The minimum retention period is 1 day. If this value is set to zero at bucket creation time, the default time of 30 days will be used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'bucket_id': bucket_id,
            'location': location,
            'project': project,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if retention_days is not None: self._values["retention_days"] = retention_days

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket_id(self) -> str:
        """The name of the logging bucket.

        Logging automatically creates two log buckets: _Required and _Default.
        """
        return self._values.get('bucket_id')

    @builtins.property
    def location(self) -> str:
        """The location of the bucket.

        The supported locations are: "global" "us-central1"
        """
        return self._values.get('location')

    @builtins.property
    def project(self) -> str:
        """The parent project that contains the logging bucket."""
        return self._values.get('project')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional description for this bucket."""
        return self._values.get('description')

    @builtins.property
    def retention_days(self) -> typing.Optional[jsii.Number]:
        """Logs will be retained by default for this amount of time, after which they will automatically be deleted.

        The minimum retention period is 1 day. If this value is set to zero at bucket creation time, the default time of 30 days will be used.
        """
        return self._values.get('retention_days')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingProjectBucketConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingProjectExclusion(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingProjectExclusion"):
    def __init__(self, scope: constructs.Construct, id: str, *, filter: str, name: str, description: typing.Optional[str]=None, disabled: typing.Optional[bool]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param filter: The filter to apply when excluding logs. Only log entries that match the filter are excluded.
        :param name: The name of the logging exclusion.
        :param description: A human-readable description.
        :param disabled: Whether this exclusion rule should be disabled or not. This defaults to false.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingProjectExclusionConfig(filter=filter, name=name, description=description, disabled=disabled, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingProjectExclusion, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="filter")
    def filter(self) -> str:
        return jsii.get(self, "filter")

    @filter.setter
    def filter(self, value: str) -> None:
        jsii.set(self, "filter", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="disabled")
    def disabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "disabled")

    @disabled.setter
    def disabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "disabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingProjectExclusionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'filter': 'filter', 'name': 'name', 'description': 'description', 'disabled': 'disabled', 'project': 'project'})
class LoggingProjectExclusionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, filter: str, name: str, description: typing.Optional[str]=None, disabled: typing.Optional[bool]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param filter: The filter to apply when excluding logs. Only log entries that match the filter are excluded.
        :param name: The name of the logging exclusion.
        :param description: A human-readable description.
        :param disabled: Whether this exclusion rule should be disabled or not. This defaults to false.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'filter': filter,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if disabled is not None: self._values["disabled"] = disabled
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def filter(self) -> str:
        """The filter to apply when excluding logs.

        Only log entries that match the filter are excluded.
        """
        return self._values.get('filter')

    @builtins.property
    def name(self) -> str:
        """The name of the logging exclusion."""
        return self._values.get('name')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A human-readable description."""
        return self._values.get('description')

    @builtins.property
    def disabled(self) -> typing.Optional[bool]:
        """Whether this exclusion rule should be disabled or not.

        This defaults to false.
        """
        return self._values.get('disabled')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingProjectExclusionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class LoggingProjectSink(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.LoggingProjectSink"):
    def __init__(self, scope: constructs.Construct, id: str, *, destination: str, name: str, bigquery_options: typing.Optional[typing.List["LoggingProjectSinkBigqueryOptions"]]=None, filter: typing.Optional[str]=None, project: typing.Optional[str]=None, unique_writer_identity: typing.Optional[bool]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param destination: The destination of the sink (or, in other words, where logs are written to). Can be a Cloud Storage bucket, a PubSub topic, or a BigQuery dataset. Examples: "storage.googleapis.com/[GCS_BUCKET]" "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]" "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]" The writer associated with the sink must have access to write to the above resource.
        :param name: The name of the logging sink.
        :param bigquery_options: bigquery_options block.
        :param filter: The filter to apply when exporting logs. Only log entries that match the filter are exported.
        :param project: The ID of the project to create the sink in. If omitted, the project associated with the provider is used.
        :param unique_writer_identity: Whether or not to create a unique identity associated with this sink. If false (the default), then the writer_identity used is serviceAccount:cloud-logs@system.gserviceaccount.com. If true, then a unique service account is created and used for this sink. If you wish to publish logs across projects, you must set unique_writer_identity to true.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = LoggingProjectSinkConfig(destination=destination, name=name, bigquery_options=bigquery_options, filter=filter, project=project, unique_writer_identity=unique_writer_identity, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(LoggingProjectSink, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="writerIdentity")
    def writer_identity(self) -> str:
        return jsii.get(self, "writerIdentity")

    @builtins.property
    @jsii.member(jsii_name="destination")
    def destination(self) -> str:
        return jsii.get(self, "destination")

    @destination.setter
    def destination(self, value: str) -> None:
        jsii.set(self, "destination", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="bigqueryOptions")
    def bigquery_options(self) -> typing.Optional[typing.List["LoggingProjectSinkBigqueryOptions"]]:
        return jsii.get(self, "bigqueryOptions")

    @bigquery_options.setter
    def bigquery_options(self, value: typing.Optional[typing.List["LoggingProjectSinkBigqueryOptions"]]) -> None:
        jsii.set(self, "bigqueryOptions", value)

    @builtins.property
    @jsii.member(jsii_name="filter")
    def filter(self) -> typing.Optional[str]:
        return jsii.get(self, "filter")

    @filter.setter
    def filter(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "filter", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="uniqueWriterIdentity")
    def unique_writer_identity(self) -> typing.Optional[bool]:
        return jsii.get(self, "uniqueWriterIdentity")

    @unique_writer_identity.setter
    def unique_writer_identity(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "uniqueWriterIdentity", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingProjectSinkBigqueryOptions", jsii_struct_bases=[], name_mapping={'use_partitioned_tables': 'usePartitionedTables'})
class LoggingProjectSinkBigqueryOptions():
    def __init__(self, *, use_partitioned_tables: bool) -> None:
        """
        :param use_partitioned_tables: Whether to use BigQuery's partition tables. By default, Logging creates dated tables based on the log entries' timestamps, e.g. syslog_20170523. With partitioned tables the date suffix is no longer present and special query syntax has to be used instead. In both cases, tables are sharded based on UTC timezone.
        """
        self._values = {
            'use_partitioned_tables': use_partitioned_tables,
        }

    @builtins.property
    def use_partitioned_tables(self) -> bool:
        """Whether to use BigQuery's partition tables.

        By default, Logging creates dated tables based on the log entries' timestamps, e.g. syslog_20170523. With partitioned tables the date suffix is no longer present and special query syntax has to be used instead. In both cases, tables are sharded based on UTC timezone.
        """
        return self._values.get('use_partitioned_tables')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingProjectSinkBigqueryOptions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.LoggingProjectSinkConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'destination': 'destination', 'name': 'name', 'bigquery_options': 'bigqueryOptions', 'filter': 'filter', 'project': 'project', 'unique_writer_identity': 'uniqueWriterIdentity'})
class LoggingProjectSinkConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, destination: str, name: str, bigquery_options: typing.Optional[typing.List["LoggingProjectSinkBigqueryOptions"]]=None, filter: typing.Optional[str]=None, project: typing.Optional[str]=None, unique_writer_identity: typing.Optional[bool]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param destination: The destination of the sink (or, in other words, where logs are written to). Can be a Cloud Storage bucket, a PubSub topic, or a BigQuery dataset. Examples: "storage.googleapis.com/[GCS_BUCKET]" "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]" "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]" The writer associated with the sink must have access to write to the above resource.
        :param name: The name of the logging sink.
        :param bigquery_options: bigquery_options block.
        :param filter: The filter to apply when exporting logs. Only log entries that match the filter are exported.
        :param project: The ID of the project to create the sink in. If omitted, the project associated with the provider is used.
        :param unique_writer_identity: Whether or not to create a unique identity associated with this sink. If false (the default), then the writer_identity used is serviceAccount:cloud-logs@system.gserviceaccount.com. If true, then a unique service account is created and used for this sink. If you wish to publish logs across projects, you must set unique_writer_identity to true.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'destination': destination,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if bigquery_options is not None: self._values["bigquery_options"] = bigquery_options
        if filter is not None: self._values["filter"] = filter
        if project is not None: self._values["project"] = project
        if unique_writer_identity is not None: self._values["unique_writer_identity"] = unique_writer_identity

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def destination(self) -> str:
        """The destination of the sink (or, in other words, where logs are written to).

        Can be a Cloud Storage bucket, a PubSub topic, or a BigQuery dataset. Examples: "storage.googleapis.com/[GCS_BUCKET]" "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]" "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]" The writer associated with the sink must have access to write to the above resource.
        """
        return self._values.get('destination')

    @builtins.property
    def name(self) -> str:
        """The name of the logging sink."""
        return self._values.get('name')

    @builtins.property
    def bigquery_options(self) -> typing.Optional[typing.List["LoggingProjectSinkBigqueryOptions"]]:
        """bigquery_options block."""
        return self._values.get('bigquery_options')

    @builtins.property
    def filter(self) -> typing.Optional[str]:
        """The filter to apply when exporting logs.

        Only log entries that match the filter are exported.
        """
        return self._values.get('filter')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project to create the sink in.

        If omitted, the project associated with the provider is used.
        """
        return self._values.get('project')

    @builtins.property
    def unique_writer_identity(self) -> typing.Optional[bool]:
        """Whether or not to create a unique identity associated with this sink.

        If false (the default), then the writer_identity used is serviceAccount:cloud-logs@system.gserviceaccount.com. If true, then a unique service account is created and used for this sink. If you wish to publish logs across projects, you must set unique_writer_identity to true.
        """
        return self._values.get('unique_writer_identity')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'LoggingProjectSinkConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class MlEngineModel(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.MlEngineModel"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, default_version: typing.Optional[typing.List["MlEngineModelDefaultVersion"]]=None, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, online_prediction_console_logging: typing.Optional[bool]=None, online_prediction_logging: typing.Optional[bool]=None, project: typing.Optional[str]=None, regions: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["MlEngineModelTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name specified for the model.
        :param default_version: default_version block.
        :param description: The description specified for the model when it was created.
        :param labels: One or more labels that you can add, to organize your models.
        :param online_prediction_console_logging: If true, online prediction nodes send stderr and stdout streams to Stackdriver Logging.
        :param online_prediction_logging: If true, online prediction access logs are sent to StackDriver Logging.
        :param project: 
        :param regions: The list of regions where the model is going to be deployed. Currently only one region per model is supported
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MlEngineModelConfig(name=name, default_version=default_version, description=description, labels=labels, online_prediction_console_logging=online_prediction_console_logging, online_prediction_logging=online_prediction_logging, project=project, regions=regions, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(MlEngineModel, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="defaultVersion")
    def default_version(self) -> typing.Optional[typing.List["MlEngineModelDefaultVersion"]]:
        return jsii.get(self, "defaultVersion")

    @default_version.setter
    def default_version(self, value: typing.Optional[typing.List["MlEngineModelDefaultVersion"]]) -> None:
        jsii.set(self, "defaultVersion", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="onlinePredictionConsoleLogging")
    def online_prediction_console_logging(self) -> typing.Optional[bool]:
        return jsii.get(self, "onlinePredictionConsoleLogging")

    @online_prediction_console_logging.setter
    def online_prediction_console_logging(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "onlinePredictionConsoleLogging", value)

    @builtins.property
    @jsii.member(jsii_name="onlinePredictionLogging")
    def online_prediction_logging(self) -> typing.Optional[bool]:
        return jsii.get(self, "onlinePredictionLogging")

    @online_prediction_logging.setter
    def online_prediction_logging(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "onlinePredictionLogging", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="regions")
    def regions(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "regions")

    @regions.setter
    def regions(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "regions", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["MlEngineModelTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["MlEngineModelTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.MlEngineModelConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'default_version': 'defaultVersion', 'description': 'description', 'labels': 'labels', 'online_prediction_console_logging': 'onlinePredictionConsoleLogging', 'online_prediction_logging': 'onlinePredictionLogging', 'project': 'project', 'regions': 'regions', 'timeouts': 'timeouts'})
class MlEngineModelConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, default_version: typing.Optional[typing.List["MlEngineModelDefaultVersion"]]=None, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, online_prediction_console_logging: typing.Optional[bool]=None, online_prediction_logging: typing.Optional[bool]=None, project: typing.Optional[str]=None, regions: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["MlEngineModelTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name specified for the model.
        :param default_version: default_version block.
        :param description: The description specified for the model when it was created.
        :param labels: One or more labels that you can add, to organize your models.
        :param online_prediction_console_logging: If true, online prediction nodes send stderr and stdout streams to Stackdriver Logging.
        :param online_prediction_logging: If true, online prediction access logs are sent to StackDriver Logging.
        :param project: 
        :param regions: The list of regions where the model is going to be deployed. Currently only one region per model is supported
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = MlEngineModelTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if default_version is not None: self._values["default_version"] = default_version
        if description is not None: self._values["description"] = description
        if labels is not None: self._values["labels"] = labels
        if online_prediction_console_logging is not None: self._values["online_prediction_console_logging"] = online_prediction_console_logging
        if online_prediction_logging is not None: self._values["online_prediction_logging"] = online_prediction_logging
        if project is not None: self._values["project"] = project
        if regions is not None: self._values["regions"] = regions
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name specified for the model."""
        return self._values.get('name')

    @builtins.property
    def default_version(self) -> typing.Optional[typing.List["MlEngineModelDefaultVersion"]]:
        """default_version block."""
        return self._values.get('default_version')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """The description specified for the model when it was created."""
        return self._values.get('description')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """One or more labels that you can add, to organize your models."""
        return self._values.get('labels')

    @builtins.property
    def online_prediction_console_logging(self) -> typing.Optional[bool]:
        """If true, online prediction nodes send stderr and stdout streams to Stackdriver Logging."""
        return self._values.get('online_prediction_console_logging')

    @builtins.property
    def online_prediction_logging(self) -> typing.Optional[bool]:
        """If true, online prediction access logs are sent to StackDriver Logging."""
        return self._values.get('online_prediction_logging')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def regions(self) -> typing.Optional[typing.List[str]]:
        """The list of regions where the model is going to be deployed.

        Currently only one region per model is supported
        """
        return self._values.get('regions')

    @builtins.property
    def timeouts(self) -> typing.Optional["MlEngineModelTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MlEngineModelConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MlEngineModelDefaultVersion", jsii_struct_bases=[], name_mapping={'name': 'name'})
class MlEngineModelDefaultVersion():
    def __init__(self, *, name: str) -> None:
        """
        :param name: The name specified for the version when it was created.
        """
        self._values = {
            'name': name,
        }

    @builtins.property
    def name(self) -> str:
        """The name specified for the version when it was created."""
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MlEngineModelDefaultVersion(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MlEngineModelTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class MlEngineModelTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MlEngineModelTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class MonitoringAlertPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.MonitoringAlertPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, combiner: str, conditions: typing.List["MonitoringAlertPolicyConditions"], display_name: str, documentation: typing.Optional[typing.List["MonitoringAlertPolicyDocumentation"]]=None, enabled: typing.Optional[bool]=None, labels: typing.Optional[typing.List[str]]=None, notification_channels: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["MonitoringAlertPolicyTimeouts"]=None, user_labels: typing.Optional[typing.Mapping[str, str]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param combiner: How to combine the results of multiple conditions to determine if an incident should be opened. Possible values: ["AND", "OR", "AND_WITH_MATCHING_RESOURCE"]
        :param conditions: conditions block.
        :param display_name: A short name or phrase used to identify the policy in dashboards, notifications, and incidents. To avoid confusion, don't use the same display name for multiple policies in the same project. The name is limited to 512 Unicode characters.
        :param documentation: documentation block.
        :param enabled: Whether or not the policy is enabled. The default is true.
        :param labels: 
        :param notification_channels: Identifies the notification channels to which notifications should be sent when incidents are opened or closed or when new violations occur on an already opened incident. Each element of this array corresponds to the name field in each of the NotificationChannel objects that are returned from the notificationChannels.list method. The syntax of the entries in this field is 'projects/[PROJECT_ID]/notificationChannels/[CHANNEL_ID]'
        :param project: 
        :param timeouts: timeouts block.
        :param user_labels: This field is intended to be used for organizing and identifying the AlertPolicy objects.The field can contain up to 64 entries. Each key and value is limited to 63 Unicode characters or 128 bytes, whichever is smaller. Labels and values can contain only lowercase letters, numerals, underscores, and dashes. Keys must begin with a letter.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitoringAlertPolicyConfig(combiner=combiner, conditions=conditions, display_name=display_name, documentation=documentation, enabled=enabled, labels=labels, notification_channels=notification_channels, project=project, timeouts=timeouts, user_labels=user_labels, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(MonitoringAlertPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="creationRecord")
    def creation_record(self, index: str) -> "MonitoringAlertPolicyCreationRecord":
        """
        :param index: -
        """
        return jsii.invoke(self, "creationRecord", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="combiner")
    def combiner(self) -> str:
        return jsii.get(self, "combiner")

    @combiner.setter
    def combiner(self, value: str) -> None:
        jsii.set(self, "combiner", value)

    @builtins.property
    @jsii.member(jsii_name="conditions")
    def conditions(self) -> typing.List["MonitoringAlertPolicyConditions"]:
        return jsii.get(self, "conditions")

    @conditions.setter
    def conditions(self, value: typing.List["MonitoringAlertPolicyConditions"]) -> None:
        jsii.set(self, "conditions", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="documentation")
    def documentation(self) -> typing.Optional[typing.List["MonitoringAlertPolicyDocumentation"]]:
        return jsii.get(self, "documentation")

    @documentation.setter
    def documentation(self, value: typing.Optional[typing.List["MonitoringAlertPolicyDocumentation"]]) -> None:
        jsii.set(self, "documentation", value)

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "enabled")

    @enabled.setter
    def enabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="notificationChannels")
    def notification_channels(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "notificationChannels")

    @notification_channels.setter
    def notification_channels(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "notificationChannels", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["MonitoringAlertPolicyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["MonitoringAlertPolicyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="userLabels")
    def user_labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "userLabels")

    @user_labels.setter
    def user_labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "userLabels", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringAlertPolicyConditions", jsii_struct_bases=[], name_mapping={'display_name': 'displayName', 'condition_absent': 'conditionAbsent', 'condition_threshold': 'conditionThreshold'})
class MonitoringAlertPolicyConditions():
    def __init__(self, *, display_name: str, condition_absent: typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionAbsent"]]=None, condition_threshold: typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionThreshold"]]=None) -> None:
        """
        :param display_name: A short name or phrase used to identify the condition in dashboards, notifications, and incidents. To avoid confusion, don't use the same display name for multiple conditions in the same policy.
        :param condition_absent: condition_absent block.
        :param condition_threshold: condition_threshold block.
        """
        self._values = {
            'display_name': display_name,
        }
        if condition_absent is not None: self._values["condition_absent"] = condition_absent
        if condition_threshold is not None: self._values["condition_threshold"] = condition_threshold

    @builtins.property
    def display_name(self) -> str:
        """A short name or phrase used to identify the condition in dashboards, notifications, and incidents.

        To avoid confusion, don't use the same
        display name for multiple conditions in the same
        policy.
        """
        return self._values.get('display_name')

    @builtins.property
    def condition_absent(self) -> typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionAbsent"]]:
        """condition_absent block."""
        return self._values.get('condition_absent')

    @builtins.property
    def condition_threshold(self) -> typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionThreshold"]]:
        """condition_threshold block."""
        return self._values.get('condition_threshold')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringAlertPolicyConditions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringAlertPolicyConditionsConditionAbsent", jsii_struct_bases=[], name_mapping={'duration': 'duration', 'aggregations': 'aggregations', 'filter': 'filter', 'trigger': 'trigger'})
class MonitoringAlertPolicyConditionsConditionAbsent():
    def __init__(self, *, duration: str, aggregations: typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionAbsentAggregations"]]=None, filter: typing.Optional[str]=None, trigger: typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionAbsentTrigger"]]=None) -> None:
        """
        :param duration: The amount of time that a time series must fail to report new data to be considered failing. Currently, only values that are a multiple of a minute--e.g. 60s, 120s, or 300s --are supported.
        :param aggregations: aggregations block.
        :param filter: A filter that identifies which time series should be compared with the threshold.The filter is similar to the one that is specified in the MetricService.ListTimeSeries request (that call is useful to verify the time series that will be retrieved / processed) and must specify the metric type and optionally may contain restrictions on resource type, resource labels, and metric labels. This field may not exceed 2048 Unicode characters in length.
        :param trigger: trigger block.
        """
        self._values = {
            'duration': duration,
        }
        if aggregations is not None: self._values["aggregations"] = aggregations
        if filter is not None: self._values["filter"] = filter
        if trigger is not None: self._values["trigger"] = trigger

    @builtins.property
    def duration(self) -> str:
        """The amount of time that a time series must fail to report new data to be considered failing.

        Currently, only values that are a
        multiple of a minute--e.g. 60s, 120s, or 300s
        --are supported.
        """
        return self._values.get('duration')

    @builtins.property
    def aggregations(self) -> typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionAbsentAggregations"]]:
        """aggregations block."""
        return self._values.get('aggregations')

    @builtins.property
    def filter(self) -> typing.Optional[str]:
        """A filter that identifies which time series should be compared with the threshold.The filter is similar to the one that is specified in the MetricService.ListTimeSeries request (that call is useful to verify the time series that will be retrieved / processed) and must specify the metric type and optionally may contain restrictions on resource type, resource labels, and metric labels. This field may not exceed 2048 Unicode characters in length."""
        return self._values.get('filter')

    @builtins.property
    def trigger(self) -> typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionAbsentTrigger"]]:
        """trigger block."""
        return self._values.get('trigger')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringAlertPolicyConditionsConditionAbsent(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringAlertPolicyConditionsConditionAbsentAggregations", jsii_struct_bases=[], name_mapping={'alignment_period': 'alignmentPeriod', 'cross_series_reducer': 'crossSeriesReducer', 'group_by_fields': 'groupByFields', 'per_series_aligner': 'perSeriesAligner'})
class MonitoringAlertPolicyConditionsConditionAbsentAggregations():
    def __init__(self, *, alignment_period: typing.Optional[str]=None, cross_series_reducer: typing.Optional[str]=None, group_by_fields: typing.Optional[typing.List[str]]=None, per_series_aligner: typing.Optional[str]=None) -> None:
        """
        :param alignment_period: The alignment period for per-time series alignment. If present, alignmentPeriod must be at least 60 seconds. After per-time series alignment, each time series will contain data points only on the period boundaries. If perSeriesAligner is not specified or equals ALIGN_NONE, then this field is ignored. If perSeriesAligner is specified and does not equal ALIGN_NONE, then this field must be defined; otherwise an error is returned.
        :param cross_series_reducer: The approach to be used to combine time series. Not all reducer functions may be applied to all time series, depending on the metric type and the value type of the original time series. Reduction may change the metric type of value type of the time series.Time series data must be aligned in order to perform cross- time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned. Possible values: ["REDUCE_NONE", "REDUCE_MEAN", "REDUCE_MIN", "REDUCE_MAX", "REDUCE_SUM", "REDUCE_STDDEV", "REDUCE_COUNT", "REDUCE_COUNT_TRUE", "REDUCE_COUNT_FALSE", "REDUCE_FRACTION_TRUE", "REDUCE_PERCENTILE_99", "REDUCE_PERCENTILE_95", "REDUCE_PERCENTILE_50", "REDUCE_PERCENTILE_05"]
        :param group_by_fields: The set of fields to preserve when crossSeriesReducer is specified. The groupByFields determine how the time series are partitioned into subsets prior to applying the aggregation function. Each subset contains time series that have the same value for each of the grouping fields. Each individual time series is a member of exactly one subset. The crossSeriesReducer is applied to each subset of time series. It is not possible to reduce across different resource types, so this field implicitly contains resource.type. Fields not specified in groupByFields are aggregated away. If groupByFields is not specified and all the time series have the same resource type, then the time series are aggregated into a single output time series. If crossSeriesReducer is not defined, this field is ignored.
        :param per_series_aligner: The approach to be used to align individual time series. Not all alignment functions may be applied to all time series, depending on the metric type and value type of the original time series. Alignment may change the metric type or the value type of the time series.Time series data must be aligned in order to perform cross- time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned. Possible values: ["ALIGN_NONE", "ALIGN_DELTA", "ALIGN_RATE", "ALIGN_INTERPOLATE", "ALIGN_NEXT_OLDER", "ALIGN_MIN", "ALIGN_MAX", "ALIGN_MEAN", "ALIGN_COUNT", "ALIGN_SUM", "ALIGN_STDDEV", "ALIGN_COUNT_TRUE", "ALIGN_COUNT_FALSE", "ALIGN_FRACTION_TRUE", "ALIGN_PERCENTILE_99", "ALIGN_PERCENTILE_95", "ALIGN_PERCENTILE_50", "ALIGN_PERCENTILE_05", "ALIGN_PERCENT_CHANGE"]
        """
        self._values = {
        }
        if alignment_period is not None: self._values["alignment_period"] = alignment_period
        if cross_series_reducer is not None: self._values["cross_series_reducer"] = cross_series_reducer
        if group_by_fields is not None: self._values["group_by_fields"] = group_by_fields
        if per_series_aligner is not None: self._values["per_series_aligner"] = per_series_aligner

    @builtins.property
    def alignment_period(self) -> typing.Optional[str]:
        """The alignment period for per-time series alignment.

        If present,
        alignmentPeriod must be at least
        60 seconds. After per-time series
        alignment, each time series will
        contain data points only on the
        period boundaries. If
        perSeriesAligner is not specified
        or equals ALIGN_NONE, then this
        field is ignored. If
        perSeriesAligner is specified and
        does not equal ALIGN_NONE, then
        this field must be defined;
        otherwise an error is returned.
        """
        return self._values.get('alignment_period')

    @builtins.property
    def cross_series_reducer(self) -> typing.Optional[str]:
        """The approach to be used to combine time series.

        Not all reducer
        functions may be applied to all
        time series, depending on the
        metric type and the value type of
        the original time series.
        Reduction may change the metric
        type of value type of the time
        series.Time series data must be
        aligned in order to perform cross-
        time series reduction. If
        crossSeriesReducer is specified,
        then perSeriesAligner must be
        specified and not equal ALIGN_NONE
        and alignmentPeriod must be
        specified; otherwise, an error is
        returned. Possible values: ["REDUCE_NONE", "REDUCE_MEAN", "REDUCE_MIN", "REDUCE_MAX", "REDUCE_SUM", "REDUCE_STDDEV", "REDUCE_COUNT", "REDUCE_COUNT_TRUE", "REDUCE_COUNT_FALSE", "REDUCE_FRACTION_TRUE", "REDUCE_PERCENTILE_99", "REDUCE_PERCENTILE_95", "REDUCE_PERCENTILE_50", "REDUCE_PERCENTILE_05"]
        """
        return self._values.get('cross_series_reducer')

    @builtins.property
    def group_by_fields(self) -> typing.Optional[typing.List[str]]:
        """The set of fields to preserve when crossSeriesReducer is specified.

        The groupByFields determine how
        the time series are partitioned
        into subsets prior to applying the
        aggregation function. Each subset
        contains time series that have the
        same value for each of the
        grouping fields. Each individual
        time series is a member of exactly
        one subset. The crossSeriesReducer
        is applied to each subset of time
        series. It is not possible to
        reduce across different resource
        types, so this field implicitly
        contains resource.type. Fields not
        specified in groupByFields are
        aggregated away. If groupByFields
        is not specified and all the time
        series have the same resource
        type, then the time series are
        aggregated into a single output
        time series. If crossSeriesReducer
        is not defined, this field is
        ignored.
        """
        return self._values.get('group_by_fields')

    @builtins.property
    def per_series_aligner(self) -> typing.Optional[str]:
        """The approach to be used to align individual time series.

        Not all
        alignment functions may be applied
        to all time series, depending on
        the metric type and value type of
        the original time series.
        Alignment may change the metric
        type or the value type of the time
        series.Time series data must be
        aligned in order to perform cross-
        time series reduction. If
        crossSeriesReducer is specified,
        then perSeriesAligner must be
        specified and not equal ALIGN_NONE
        and alignmentPeriod must be
        specified; otherwise, an error is
        returned. Possible values: ["ALIGN_NONE", "ALIGN_DELTA", "ALIGN_RATE", "ALIGN_INTERPOLATE", "ALIGN_NEXT_OLDER", "ALIGN_MIN", "ALIGN_MAX", "ALIGN_MEAN", "ALIGN_COUNT", "ALIGN_SUM", "ALIGN_STDDEV", "ALIGN_COUNT_TRUE", "ALIGN_COUNT_FALSE", "ALIGN_FRACTION_TRUE", "ALIGN_PERCENTILE_99", "ALIGN_PERCENTILE_95", "ALIGN_PERCENTILE_50", "ALIGN_PERCENTILE_05", "ALIGN_PERCENT_CHANGE"]
        """
        return self._values.get('per_series_aligner')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringAlertPolicyConditionsConditionAbsentAggregations(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringAlertPolicyConditionsConditionAbsentTrigger", jsii_struct_bases=[], name_mapping={'count': 'count', 'percent': 'percent'})
class MonitoringAlertPolicyConditionsConditionAbsentTrigger():
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, percent: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: The absolute number of time series that must fail the predicate for the condition to be triggered.
        :param percent: The percentage of time series that must fail the predicate for the condition to be triggered.
        """
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if percent is not None: self._values["percent"] = percent

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """The absolute number of time series that must fail the predicate for the condition to be triggered."""
        return self._values.get('count')

    @builtins.property
    def percent(self) -> typing.Optional[jsii.Number]:
        """The percentage of time series that must fail the predicate for the condition to be triggered."""
        return self._values.get('percent')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringAlertPolicyConditionsConditionAbsentTrigger(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringAlertPolicyConditionsConditionThreshold", jsii_struct_bases=[], name_mapping={'comparison': 'comparison', 'duration': 'duration', 'aggregations': 'aggregations', 'denominator_aggregations': 'denominatorAggregations', 'denominator_filter': 'denominatorFilter', 'filter': 'filter', 'threshold_value': 'thresholdValue', 'trigger': 'trigger'})
class MonitoringAlertPolicyConditionsConditionThreshold():
    def __init__(self, *, comparison: str, duration: str, aggregations: typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionThresholdAggregations"]]=None, denominator_aggregations: typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionThresholdDenominatorAggregations"]]=None, denominator_filter: typing.Optional[str]=None, filter: typing.Optional[str]=None, threshold_value: typing.Optional[jsii.Number]=None, trigger: typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionThresholdTrigger"]]=None) -> None:
        """
        :param comparison: The comparison to apply between the time series (indicated by filter and aggregation) and the threshold (indicated by threshold_value). The comparison is applied on each time series, with the time series on the left-hand side and the threshold on the right-hand side. Only COMPARISON_LT and COMPARISON_GT are supported currently. Possible values: ["COMPARISON_GT", "COMPARISON_GE", "COMPARISON_LT", "COMPARISON_LE", "COMPARISON_EQ", "COMPARISON_NE"]
        :param duration: The amount of time that a time series must violate the threshold to be considered failing. Currently, only values that are a multiple of a minute--e.g., 0, 60, 120, or 300 seconds--are supported. If an invalid value is given, an error will be returned. When choosing a duration, it is useful to keep in mind the frequency of the underlying time series data (which may also be affected by any alignments specified in the aggregations field); a good duration is long enough so that a single outlier does not generate spurious alerts, but short enough that unhealthy states are detected and alerted on quickly.
        :param aggregations: aggregations block.
        :param denominator_aggregations: denominator_aggregations block.
        :param denominator_filter: A filter that identifies a time series that should be used as the denominator of a ratio that will be compared with the threshold. If a denominator_filter is specified, the time series specified by the filter field will be used as the numerator.The filter is similar to the one that is specified in the MetricService.ListTimeSeries request (that call is useful to verify the time series that will be retrieved / processed) and must specify the metric type and optionally may contain restrictions on resource type, resource labels, and metric labels. This field may not exceed 2048 Unicode characters in length.
        :param filter: A filter that identifies which time series should be compared with the threshold.The filter is similar to the one that is specified in the MetricService.ListTimeSeries request (that call is useful to verify the time series that will be retrieved / processed) and must specify the metric type and optionally may contain restrictions on resource type, resource labels, and metric labels. This field may not exceed 2048 Unicode characters in length.
        :param threshold_value: A value against which to compare the time series.
        :param trigger: trigger block.
        """
        self._values = {
            'comparison': comparison,
            'duration': duration,
        }
        if aggregations is not None: self._values["aggregations"] = aggregations
        if denominator_aggregations is not None: self._values["denominator_aggregations"] = denominator_aggregations
        if denominator_filter is not None: self._values["denominator_filter"] = denominator_filter
        if filter is not None: self._values["filter"] = filter
        if threshold_value is not None: self._values["threshold_value"] = threshold_value
        if trigger is not None: self._values["trigger"] = trigger

    @builtins.property
    def comparison(self) -> str:
        """The comparison to apply between the time series (indicated by filter and aggregation) and the threshold (indicated by threshold_value).

        The comparison is applied
        on each time series, with the time series on
        the left-hand side and the threshold on the
        right-hand side. Only COMPARISON_LT and
        COMPARISON_GT are supported currently. Possible values: ["COMPARISON_GT", "COMPARISON_GE", "COMPARISON_LT", "COMPARISON_LE", "COMPARISON_EQ", "COMPARISON_NE"]
        """
        return self._values.get('comparison')

    @builtins.property
    def duration(self) -> str:
        """The amount of time that a time series must violate the threshold to be considered failing.

        Currently, only values that are a
        multiple of a minute--e.g., 0, 60, 120, or
        300 seconds--are supported. If an invalid
        value is given, an error will be returned.
        When choosing a duration, it is useful to
        keep in mind the frequency of the underlying
        time series data (which may also be affected
        by any alignments specified in the
        aggregations field); a good duration is long
        enough so that a single outlier does not
        generate spurious alerts, but short enough
        that unhealthy states are detected and
        alerted on quickly.
        """
        return self._values.get('duration')

    @builtins.property
    def aggregations(self) -> typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionThresholdAggregations"]]:
        """aggregations block."""
        return self._values.get('aggregations')

    @builtins.property
    def denominator_aggregations(self) -> typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionThresholdDenominatorAggregations"]]:
        """denominator_aggregations block."""
        return self._values.get('denominator_aggregations')

    @builtins.property
    def denominator_filter(self) -> typing.Optional[str]:
        """A filter that identifies a time series that should be used as the denominator of a ratio that will be compared with the threshold.

        If
        a denominator_filter is specified, the time
        series specified by the filter field will be
        used as the numerator.The filter is similar
        to the one that is specified in the
        MetricService.ListTimeSeries request (that
        call is useful to verify the time series
        that will be retrieved / processed) and must
        specify the metric type and optionally may
        contain restrictions on resource type,
        resource labels, and metric labels. This
        field may not exceed 2048 Unicode characters
        in length.
        """
        return self._values.get('denominator_filter')

    @builtins.property
    def filter(self) -> typing.Optional[str]:
        """A filter that identifies which time series should be compared with the threshold.The filter is similar to the one that is specified in the MetricService.ListTimeSeries request (that call is useful to verify the time series that will be retrieved / processed) and must specify the metric type and optionally may contain restrictions on resource type, resource labels, and metric labels. This field may not exceed 2048 Unicode characters in length."""
        return self._values.get('filter')

    @builtins.property
    def threshold_value(self) -> typing.Optional[jsii.Number]:
        """A value against which to compare the time series."""
        return self._values.get('threshold_value')

    @builtins.property
    def trigger(self) -> typing.Optional[typing.List["MonitoringAlertPolicyConditionsConditionThresholdTrigger"]]:
        """trigger block."""
        return self._values.get('trigger')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringAlertPolicyConditionsConditionThreshold(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringAlertPolicyConditionsConditionThresholdAggregations", jsii_struct_bases=[], name_mapping={'alignment_period': 'alignmentPeriod', 'cross_series_reducer': 'crossSeriesReducer', 'group_by_fields': 'groupByFields', 'per_series_aligner': 'perSeriesAligner'})
class MonitoringAlertPolicyConditionsConditionThresholdAggregations():
    def __init__(self, *, alignment_period: typing.Optional[str]=None, cross_series_reducer: typing.Optional[str]=None, group_by_fields: typing.Optional[typing.List[str]]=None, per_series_aligner: typing.Optional[str]=None) -> None:
        """
        :param alignment_period: The alignment period for per-time series alignment. If present, alignmentPeriod must be at least 60 seconds. After per-time series alignment, each time series will contain data points only on the period boundaries. If perSeriesAligner is not specified or equals ALIGN_NONE, then this field is ignored. If perSeriesAligner is specified and does not equal ALIGN_NONE, then this field must be defined; otherwise an error is returned.
        :param cross_series_reducer: The approach to be used to combine time series. Not all reducer functions may be applied to all time series, depending on the metric type and the value type of the original time series. Reduction may change the metric type of value type of the time series.Time series data must be aligned in order to perform cross- time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned. Possible values: ["REDUCE_NONE", "REDUCE_MEAN", "REDUCE_MIN", "REDUCE_MAX", "REDUCE_SUM", "REDUCE_STDDEV", "REDUCE_COUNT", "REDUCE_COUNT_TRUE", "REDUCE_COUNT_FALSE", "REDUCE_FRACTION_TRUE", "REDUCE_PERCENTILE_99", "REDUCE_PERCENTILE_95", "REDUCE_PERCENTILE_50", "REDUCE_PERCENTILE_05"]
        :param group_by_fields: The set of fields to preserve when crossSeriesReducer is specified. The groupByFields determine how the time series are partitioned into subsets prior to applying the aggregation function. Each subset contains time series that have the same value for each of the grouping fields. Each individual time series is a member of exactly one subset. The crossSeriesReducer is applied to each subset of time series. It is not possible to reduce across different resource types, so this field implicitly contains resource.type. Fields not specified in groupByFields are aggregated away. If groupByFields is not specified and all the time series have the same resource type, then the time series are aggregated into a single output time series. If crossSeriesReducer is not defined, this field is ignored.
        :param per_series_aligner: The approach to be used to align individual time series. Not all alignment functions may be applied to all time series, depending on the metric type and value type of the original time series. Alignment may change the metric type or the value type of the time series.Time series data must be aligned in order to perform cross- time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned. Possible values: ["ALIGN_NONE", "ALIGN_DELTA", "ALIGN_RATE", "ALIGN_INTERPOLATE", "ALIGN_NEXT_OLDER", "ALIGN_MIN", "ALIGN_MAX", "ALIGN_MEAN", "ALIGN_COUNT", "ALIGN_SUM", "ALIGN_STDDEV", "ALIGN_COUNT_TRUE", "ALIGN_COUNT_FALSE", "ALIGN_FRACTION_TRUE", "ALIGN_PERCENTILE_99", "ALIGN_PERCENTILE_95", "ALIGN_PERCENTILE_50", "ALIGN_PERCENTILE_05", "ALIGN_PERCENT_CHANGE"]
        """
        self._values = {
        }
        if alignment_period is not None: self._values["alignment_period"] = alignment_period
        if cross_series_reducer is not None: self._values["cross_series_reducer"] = cross_series_reducer
        if group_by_fields is not None: self._values["group_by_fields"] = group_by_fields
        if per_series_aligner is not None: self._values["per_series_aligner"] = per_series_aligner

    @builtins.property
    def alignment_period(self) -> typing.Optional[str]:
        """The alignment period for per-time series alignment.

        If present,
        alignmentPeriod must be at least
        60 seconds. After per-time series
        alignment, each time series will
        contain data points only on the
        period boundaries. If
        perSeriesAligner is not specified
        or equals ALIGN_NONE, then this
        field is ignored. If
        perSeriesAligner is specified and
        does not equal ALIGN_NONE, then
        this field must be defined;
        otherwise an error is returned.
        """
        return self._values.get('alignment_period')

    @builtins.property
    def cross_series_reducer(self) -> typing.Optional[str]:
        """The approach to be used to combine time series.

        Not all reducer
        functions may be applied to all
        time series, depending on the
        metric type and the value type of
        the original time series.
        Reduction may change the metric
        type of value type of the time
        series.Time series data must be
        aligned in order to perform cross-
        time series reduction. If
        crossSeriesReducer is specified,
        then perSeriesAligner must be
        specified and not equal ALIGN_NONE
        and alignmentPeriod must be
        specified; otherwise, an error is
        returned. Possible values: ["REDUCE_NONE", "REDUCE_MEAN", "REDUCE_MIN", "REDUCE_MAX", "REDUCE_SUM", "REDUCE_STDDEV", "REDUCE_COUNT", "REDUCE_COUNT_TRUE", "REDUCE_COUNT_FALSE", "REDUCE_FRACTION_TRUE", "REDUCE_PERCENTILE_99", "REDUCE_PERCENTILE_95", "REDUCE_PERCENTILE_50", "REDUCE_PERCENTILE_05"]
        """
        return self._values.get('cross_series_reducer')

    @builtins.property
    def group_by_fields(self) -> typing.Optional[typing.List[str]]:
        """The set of fields to preserve when crossSeriesReducer is specified.

        The groupByFields determine how
        the time series are partitioned
        into subsets prior to applying the
        aggregation function. Each subset
        contains time series that have the
        same value for each of the
        grouping fields. Each individual
        time series is a member of exactly
        one subset. The crossSeriesReducer
        is applied to each subset of time
        series. It is not possible to
        reduce across different resource
        types, so this field implicitly
        contains resource.type. Fields not
        specified in groupByFields are
        aggregated away. If groupByFields
        is not specified and all the time
        series have the same resource
        type, then the time series are
        aggregated into a single output
        time series. If crossSeriesReducer
        is not defined, this field is
        ignored.
        """
        return self._values.get('group_by_fields')

    @builtins.property
    def per_series_aligner(self) -> typing.Optional[str]:
        """The approach to be used to align individual time series.

        Not all
        alignment functions may be applied
        to all time series, depending on
        the metric type and value type of
        the original time series.
        Alignment may change the metric
        type or the value type of the time
        series.Time series data must be
        aligned in order to perform cross-
        time series reduction. If
        crossSeriesReducer is specified,
        then perSeriesAligner must be
        specified and not equal ALIGN_NONE
        and alignmentPeriod must be
        specified; otherwise, an error is
        returned. Possible values: ["ALIGN_NONE", "ALIGN_DELTA", "ALIGN_RATE", "ALIGN_INTERPOLATE", "ALIGN_NEXT_OLDER", "ALIGN_MIN", "ALIGN_MAX", "ALIGN_MEAN", "ALIGN_COUNT", "ALIGN_SUM", "ALIGN_STDDEV", "ALIGN_COUNT_TRUE", "ALIGN_COUNT_FALSE", "ALIGN_FRACTION_TRUE", "ALIGN_PERCENTILE_99", "ALIGN_PERCENTILE_95", "ALIGN_PERCENTILE_50", "ALIGN_PERCENTILE_05", "ALIGN_PERCENT_CHANGE"]
        """
        return self._values.get('per_series_aligner')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringAlertPolicyConditionsConditionThresholdAggregations(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringAlertPolicyConditionsConditionThresholdDenominatorAggregations", jsii_struct_bases=[], name_mapping={'alignment_period': 'alignmentPeriod', 'cross_series_reducer': 'crossSeriesReducer', 'group_by_fields': 'groupByFields', 'per_series_aligner': 'perSeriesAligner'})
class MonitoringAlertPolicyConditionsConditionThresholdDenominatorAggregations():
    def __init__(self, *, alignment_period: typing.Optional[str]=None, cross_series_reducer: typing.Optional[str]=None, group_by_fields: typing.Optional[typing.List[str]]=None, per_series_aligner: typing.Optional[str]=None) -> None:
        """
        :param alignment_period: The alignment period for per-time series alignment. If present, alignmentPeriod must be at least 60 seconds. After per-time series alignment, each time series will contain data points only on the period boundaries. If perSeriesAligner is not specified or equals ALIGN_NONE, then this field is ignored. If perSeriesAligner is specified and does not equal ALIGN_NONE, then this field must be defined; otherwise an error is returned.
        :param cross_series_reducer: The approach to be used to combine time series. Not all reducer functions may be applied to all time series, depending on the metric type and the value type of the original time series. Reduction may change the metric type of value type of the time series.Time series data must be aligned in order to perform cross- time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned. Possible values: ["REDUCE_NONE", "REDUCE_MEAN", "REDUCE_MIN", "REDUCE_MAX", "REDUCE_SUM", "REDUCE_STDDEV", "REDUCE_COUNT", "REDUCE_COUNT_TRUE", "REDUCE_COUNT_FALSE", "REDUCE_FRACTION_TRUE", "REDUCE_PERCENTILE_99", "REDUCE_PERCENTILE_95", "REDUCE_PERCENTILE_50", "REDUCE_PERCENTILE_05"]
        :param group_by_fields: The set of fields to preserve when crossSeriesReducer is specified. The groupByFields determine how the time series are partitioned into subsets prior to applying the aggregation function. Each subset contains time series that have the same value for each of the grouping fields. Each individual time series is a member of exactly one subset. The crossSeriesReducer is applied to each subset of time series. It is not possible to reduce across different resource types, so this field implicitly contains resource.type. Fields not specified in groupByFields are aggregated away. If groupByFields is not specified and all the time series have the same resource type, then the time series are aggregated into a single output time series. If crossSeriesReducer is not defined, this field is ignored.
        :param per_series_aligner: The approach to be used to align individual time series. Not all alignment functions may be applied to all time series, depending on the metric type and value type of the original time series. Alignment may change the metric type or the value type of the time series.Time series data must be aligned in order to perform cross- time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned. Possible values: ["ALIGN_NONE", "ALIGN_DELTA", "ALIGN_RATE", "ALIGN_INTERPOLATE", "ALIGN_NEXT_OLDER", "ALIGN_MIN", "ALIGN_MAX", "ALIGN_MEAN", "ALIGN_COUNT", "ALIGN_SUM", "ALIGN_STDDEV", "ALIGN_COUNT_TRUE", "ALIGN_COUNT_FALSE", "ALIGN_FRACTION_TRUE", "ALIGN_PERCENTILE_99", "ALIGN_PERCENTILE_95", "ALIGN_PERCENTILE_50", "ALIGN_PERCENTILE_05", "ALIGN_PERCENT_CHANGE"]
        """
        self._values = {
        }
        if alignment_period is not None: self._values["alignment_period"] = alignment_period
        if cross_series_reducer is not None: self._values["cross_series_reducer"] = cross_series_reducer
        if group_by_fields is not None: self._values["group_by_fields"] = group_by_fields
        if per_series_aligner is not None: self._values["per_series_aligner"] = per_series_aligner

    @builtins.property
    def alignment_period(self) -> typing.Optional[str]:
        """The alignment period for per-time series alignment.

        If present,
        alignmentPeriod must be at least
        60 seconds. After per-time series
        alignment, each time series will
        contain data points only on the
        period boundaries. If
        perSeriesAligner is not specified
        or equals ALIGN_NONE, then this
        field is ignored. If
        perSeriesAligner is specified and
        does not equal ALIGN_NONE, then
        this field must be defined;
        otherwise an error is returned.
        """
        return self._values.get('alignment_period')

    @builtins.property
    def cross_series_reducer(self) -> typing.Optional[str]:
        """The approach to be used to combine time series.

        Not all reducer
        functions may be applied to all
        time series, depending on the
        metric type and the value type of
        the original time series.
        Reduction may change the metric
        type of value type of the time
        series.Time series data must be
        aligned in order to perform cross-
        time series reduction. If
        crossSeriesReducer is specified,
        then perSeriesAligner must be
        specified and not equal ALIGN_NONE
        and alignmentPeriod must be
        specified; otherwise, an error is
        returned. Possible values: ["REDUCE_NONE", "REDUCE_MEAN", "REDUCE_MIN", "REDUCE_MAX", "REDUCE_SUM", "REDUCE_STDDEV", "REDUCE_COUNT", "REDUCE_COUNT_TRUE", "REDUCE_COUNT_FALSE", "REDUCE_FRACTION_TRUE", "REDUCE_PERCENTILE_99", "REDUCE_PERCENTILE_95", "REDUCE_PERCENTILE_50", "REDUCE_PERCENTILE_05"]
        """
        return self._values.get('cross_series_reducer')

    @builtins.property
    def group_by_fields(self) -> typing.Optional[typing.List[str]]:
        """The set of fields to preserve when crossSeriesReducer is specified.

        The groupByFields determine how
        the time series are partitioned
        into subsets prior to applying the
        aggregation function. Each subset
        contains time series that have the
        same value for each of the
        grouping fields. Each individual
        time series is a member of exactly
        one subset. The crossSeriesReducer
        is applied to each subset of time
        series. It is not possible to
        reduce across different resource
        types, so this field implicitly
        contains resource.type. Fields not
        specified in groupByFields are
        aggregated away. If groupByFields
        is not specified and all the time
        series have the same resource
        type, then the time series are
        aggregated into a single output
        time series. If crossSeriesReducer
        is not defined, this field is
        ignored.
        """
        return self._values.get('group_by_fields')

    @builtins.property
    def per_series_aligner(self) -> typing.Optional[str]:
        """The approach to be used to align individual time series.

        Not all
        alignment functions may be applied
        to all time series, depending on
        the metric type and value type of
        the original time series.
        Alignment may change the metric
        type or the value type of the time
        series.Time series data must be
        aligned in order to perform cross-
        time series reduction. If
        crossSeriesReducer is specified,
        then perSeriesAligner must be
        specified and not equal ALIGN_NONE
        and alignmentPeriod must be
        specified; otherwise, an error is
        returned. Possible values: ["ALIGN_NONE", "ALIGN_DELTA", "ALIGN_RATE", "ALIGN_INTERPOLATE", "ALIGN_NEXT_OLDER", "ALIGN_MIN", "ALIGN_MAX", "ALIGN_MEAN", "ALIGN_COUNT", "ALIGN_SUM", "ALIGN_STDDEV", "ALIGN_COUNT_TRUE", "ALIGN_COUNT_FALSE", "ALIGN_FRACTION_TRUE", "ALIGN_PERCENTILE_99", "ALIGN_PERCENTILE_95", "ALIGN_PERCENTILE_50", "ALIGN_PERCENTILE_05", "ALIGN_PERCENT_CHANGE"]
        """
        return self._values.get('per_series_aligner')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringAlertPolicyConditionsConditionThresholdDenominatorAggregations(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringAlertPolicyConditionsConditionThresholdTrigger", jsii_struct_bases=[], name_mapping={'count': 'count', 'percent': 'percent'})
class MonitoringAlertPolicyConditionsConditionThresholdTrigger():
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, percent: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: The absolute number of time series that must fail the predicate for the condition to be triggered.
        :param percent: The percentage of time series that must fail the predicate for the condition to be triggered.
        """
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if percent is not None: self._values["percent"] = percent

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """The absolute number of time series that must fail the predicate for the condition to be triggered."""
        return self._values.get('count')

    @builtins.property
    def percent(self) -> typing.Optional[jsii.Number]:
        """The percentage of time series that must fail the predicate for the condition to be triggered."""
        return self._values.get('percent')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringAlertPolicyConditionsConditionThresholdTrigger(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringAlertPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'combiner': 'combiner', 'conditions': 'conditions', 'display_name': 'displayName', 'documentation': 'documentation', 'enabled': 'enabled', 'labels': 'labels', 'notification_channels': 'notificationChannels', 'project': 'project', 'timeouts': 'timeouts', 'user_labels': 'userLabels'})
class MonitoringAlertPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, combiner: str, conditions: typing.List["MonitoringAlertPolicyConditions"], display_name: str, documentation: typing.Optional[typing.List["MonitoringAlertPolicyDocumentation"]]=None, enabled: typing.Optional[bool]=None, labels: typing.Optional[typing.List[str]]=None, notification_channels: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["MonitoringAlertPolicyTimeouts"]=None, user_labels: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param combiner: How to combine the results of multiple conditions to determine if an incident should be opened. Possible values: ["AND", "OR", "AND_WITH_MATCHING_RESOURCE"]
        :param conditions: conditions block.
        :param display_name: A short name or phrase used to identify the policy in dashboards, notifications, and incidents. To avoid confusion, don't use the same display name for multiple policies in the same project. The name is limited to 512 Unicode characters.
        :param documentation: documentation block.
        :param enabled: Whether or not the policy is enabled. The default is true.
        :param labels: 
        :param notification_channels: Identifies the notification channels to which notifications should be sent when incidents are opened or closed or when new violations occur on an already opened incident. Each element of this array corresponds to the name field in each of the NotificationChannel objects that are returned from the notificationChannels.list method. The syntax of the entries in this field is 'projects/[PROJECT_ID]/notificationChannels/[CHANNEL_ID]'
        :param project: 
        :param timeouts: timeouts block.
        :param user_labels: This field is intended to be used for organizing and identifying the AlertPolicy objects.The field can contain up to 64 entries. Each key and value is limited to 63 Unicode characters or 128 bytes, whichever is smaller. Labels and values can contain only lowercase letters, numerals, underscores, and dashes. Keys must begin with a letter.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = MonitoringAlertPolicyTimeouts(**timeouts)
        self._values = {
            'combiner': combiner,
            'conditions': conditions,
            'display_name': display_name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if documentation is not None: self._values["documentation"] = documentation
        if enabled is not None: self._values["enabled"] = enabled
        if labels is not None: self._values["labels"] = labels
        if notification_channels is not None: self._values["notification_channels"] = notification_channels
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if user_labels is not None: self._values["user_labels"] = user_labels

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def combiner(self) -> str:
        """How to combine the results of multiple conditions to determine if an incident should be opened.

        Possible values: ["AND", "OR", "AND_WITH_MATCHING_RESOURCE"]
        """
        return self._values.get('combiner')

    @builtins.property
    def conditions(self) -> typing.List["MonitoringAlertPolicyConditions"]:
        """conditions block."""
        return self._values.get('conditions')

    @builtins.property
    def display_name(self) -> str:
        """A short name or phrase used to identify the policy in dashboards, notifications, and incidents.

        To avoid confusion, don't use
        the same display name for multiple policies in the same project. The
        name is limited to 512 Unicode characters.
        """
        return self._values.get('display_name')

    @builtins.property
    def documentation(self) -> typing.Optional[typing.List["MonitoringAlertPolicyDocumentation"]]:
        """documentation block."""
        return self._values.get('documentation')

    @builtins.property
    def enabled(self) -> typing.Optional[bool]:
        """Whether or not the policy is enabled.

        The default is true.
        """
        return self._values.get('enabled')

    @builtins.property
    def labels(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('labels')

    @builtins.property
    def notification_channels(self) -> typing.Optional[typing.List[str]]:
        """Identifies the notification channels to which notifications should be sent when incidents are opened or closed or when new violations occur on an already opened incident.

        Each element of this array corresponds
        to the name field in each of the NotificationChannel objects that are
        returned from the notificationChannels.list method. The syntax of the
        entries in this field is
        'projects/[PROJECT_ID]/notificationChannels/[CHANNEL_ID]'
        """
        return self._values.get('notification_channels')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitoringAlertPolicyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def user_labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """This field is intended to be used for organizing and identifying the AlertPolicy objects.The field can contain up to 64 entries. Each key and value is limited to 63 Unicode characters or 128 bytes, whichever is smaller. Labels and values can contain only lowercase letters, numerals, underscores, and dashes. Keys must begin with a letter."""
        return self._values.get('user_labels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringAlertPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class MonitoringAlertPolicyCreationRecord(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.MonitoringAlertPolicyCreationRecord"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(MonitoringAlertPolicyCreationRecord, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="mutatedBy")
    def mutated_by(self) -> str:
        return jsii.get(self, "mutatedBy")

    @builtins.property
    @jsii.member(jsii_name="mutateTime")
    def mutate_time(self) -> str:
        return jsii.get(self, "mutateTime")


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringAlertPolicyDocumentation", jsii_struct_bases=[], name_mapping={'content': 'content', 'mime_type': 'mimeType'})
class MonitoringAlertPolicyDocumentation():
    def __init__(self, *, content: typing.Optional[str]=None, mime_type: typing.Optional[str]=None) -> None:
        """
        :param content: The text of the documentation, interpreted according to mimeType. The content may not exceed 8,192 Unicode characters and may not exceed more than 10,240 bytes when encoded in UTF-8 format, whichever is smaller.
        :param mime_type: The format of the content field. Presently, only the value "text/markdown" is supported.
        """
        self._values = {
        }
        if content is not None: self._values["content"] = content
        if mime_type is not None: self._values["mime_type"] = mime_type

    @builtins.property
    def content(self) -> typing.Optional[str]:
        """The text of the documentation, interpreted according to mimeType.

        The content may not exceed 8,192 Unicode characters and may not
        exceed more than 10,240 bytes when encoded in UTF-8 format,
        whichever is smaller.
        """
        return self._values.get('content')

    @builtins.property
    def mime_type(self) -> typing.Optional[str]:
        """The format of the content field.

        Presently, only the value
        "text/markdown" is supported.
        """
        return self._values.get('mime_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringAlertPolicyDocumentation(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringAlertPolicyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class MonitoringAlertPolicyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringAlertPolicyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class MonitoringCustomService(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.MonitoringCustomService"):
    def __init__(self, scope: constructs.Construct, id: str, *, display_name: typing.Optional[str]=None, project: typing.Optional[str]=None, service_id: typing.Optional[str]=None, telemetry: typing.Optional[typing.List["MonitoringCustomServiceTelemetry"]]=None, timeouts: typing.Optional["MonitoringCustomServiceTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: Name used for UI elements listing this Service.
        :param project: 
        :param service_id: An optional service ID to use. If not given, the server will generate a service ID.
        :param telemetry: telemetry block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitoringCustomServiceConfig(display_name=display_name, project=project, service_id=service_id, telemetry=telemetry, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(MonitoringCustomService, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> typing.Optional[str]:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="serviceId")
    def service_id(self) -> typing.Optional[str]:
        return jsii.get(self, "serviceId")

    @service_id.setter
    def service_id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "serviceId", value)

    @builtins.property
    @jsii.member(jsii_name="telemetry")
    def telemetry(self) -> typing.Optional[typing.List["MonitoringCustomServiceTelemetry"]]:
        return jsii.get(self, "telemetry")

    @telemetry.setter
    def telemetry(self, value: typing.Optional[typing.List["MonitoringCustomServiceTelemetry"]]) -> None:
        jsii.set(self, "telemetry", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["MonitoringCustomServiceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["MonitoringCustomServiceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringCustomServiceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'display_name': 'displayName', 'project': 'project', 'service_id': 'serviceId', 'telemetry': 'telemetry', 'timeouts': 'timeouts'})
class MonitoringCustomServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, display_name: typing.Optional[str]=None, project: typing.Optional[str]=None, service_id: typing.Optional[str]=None, telemetry: typing.Optional[typing.List["MonitoringCustomServiceTelemetry"]]=None, timeouts: typing.Optional["MonitoringCustomServiceTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: Name used for UI elements listing this Service.
        :param project: 
        :param service_id: An optional service ID to use. If not given, the server will generate a service ID.
        :param telemetry: telemetry block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = MonitoringCustomServiceTimeouts(**timeouts)
        self._values = {
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if display_name is not None: self._values["display_name"] = display_name
        if project is not None: self._values["project"] = project
        if service_id is not None: self._values["service_id"] = service_id
        if telemetry is not None: self._values["telemetry"] = telemetry
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """Name used for UI elements listing this Service."""
        return self._values.get('display_name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def service_id(self) -> typing.Optional[str]:
        """An optional service ID to use.

        If not given, the server will generate a
        service ID.
        """
        return self._values.get('service_id')

    @builtins.property
    def telemetry(self) -> typing.Optional[typing.List["MonitoringCustomServiceTelemetry"]]:
        """telemetry block."""
        return self._values.get('telemetry')

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitoringCustomServiceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringCustomServiceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringCustomServiceTelemetry", jsii_struct_bases=[], name_mapping={'resource_name': 'resourceName'})
class MonitoringCustomServiceTelemetry():
    def __init__(self, *, resource_name: typing.Optional[str]=None) -> None:
        """
        :param resource_name: The full name of the resource that defines this service. Formatted as described in https://cloud.google.com/apis/design/resource_names.
        """
        self._values = {
        }
        if resource_name is not None: self._values["resource_name"] = resource_name

    @builtins.property
    def resource_name(self) -> typing.Optional[str]:
        """The full name of the resource that defines this service.

        Formatted as described in
        https://cloud.google.com/apis/design/resource_names.
        """
        return self._values.get('resource_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringCustomServiceTelemetry(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringCustomServiceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class MonitoringCustomServiceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringCustomServiceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class MonitoringDashboard(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.MonitoringDashboard"):
    def __init__(self, scope: constructs.Construct, id: str, *, dashboard_json: str, project: typing.Optional[str]=None, timeouts: typing.Optional["MonitoringDashboardTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param dashboard_json: The JSON representation of a dashboard, following the format at https://cloud.google.com/monitoring/api/ref_v3/rest/v1/projects.dashboards.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitoringDashboardConfig(dashboard_json=dashboard_json, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(MonitoringDashboard, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="dashboardJson")
    def dashboard_json(self) -> str:
        return jsii.get(self, "dashboardJson")

    @dashboard_json.setter
    def dashboard_json(self, value: str) -> None:
        jsii.set(self, "dashboardJson", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["MonitoringDashboardTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["MonitoringDashboardTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringDashboardConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'dashboard_json': 'dashboardJson', 'project': 'project', 'timeouts': 'timeouts'})
class MonitoringDashboardConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, dashboard_json: str, project: typing.Optional[str]=None, timeouts: typing.Optional["MonitoringDashboardTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param dashboard_json: The JSON representation of a dashboard, following the format at https://cloud.google.com/monitoring/api/ref_v3/rest/v1/projects.dashboards.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = MonitoringDashboardTimeouts(**timeouts)
        self._values = {
            'dashboard_json': dashboard_json,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def dashboard_json(self) -> str:
        """The JSON representation of a dashboard, following the format at https://cloud.google.com/monitoring/api/ref_v3/rest/v1/projects.dashboards."""
        return self._values.get('dashboard_json')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitoringDashboardTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringDashboardConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringDashboardTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class MonitoringDashboardTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringDashboardTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class MonitoringGroup(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.MonitoringGroup"):
    def __init__(self, scope: constructs.Construct, id: str, *, display_name: str, filter: str, is_cluster: typing.Optional[bool]=None, parent_name: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["MonitoringGroupTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: A user-assigned name for this group, used only for display purposes.
        :param filter: The filter used to determine which monitored resources belong to this group.
        :param is_cluster: If true, the members of this group are considered to be a cluster. The system can perform additional analysis on groups that are clusters.
        :param parent_name: The name of the group's parent, if it has one. The format is "projects/{project_id_or_number}/groups/{group_id}". For groups with no parent, parentName is the empty string, "".
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitoringGroupConfig(display_name=display_name, filter=filter, is_cluster=is_cluster, parent_name=parent_name, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(MonitoringGroup, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="filter")
    def filter(self) -> str:
        return jsii.get(self, "filter")

    @filter.setter
    def filter(self, value: str) -> None:
        jsii.set(self, "filter", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="isCluster")
    def is_cluster(self) -> typing.Optional[bool]:
        return jsii.get(self, "isCluster")

    @is_cluster.setter
    def is_cluster(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "isCluster", value)

    @builtins.property
    @jsii.member(jsii_name="parentName")
    def parent_name(self) -> typing.Optional[str]:
        return jsii.get(self, "parentName")

    @parent_name.setter
    def parent_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "parentName", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["MonitoringGroupTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["MonitoringGroupTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringGroupConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'display_name': 'displayName', 'filter': 'filter', 'is_cluster': 'isCluster', 'parent_name': 'parentName', 'project': 'project', 'timeouts': 'timeouts'})
class MonitoringGroupConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, display_name: str, filter: str, is_cluster: typing.Optional[bool]=None, parent_name: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["MonitoringGroupTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: A user-assigned name for this group, used only for display purposes.
        :param filter: The filter used to determine which monitored resources belong to this group.
        :param is_cluster: If true, the members of this group are considered to be a cluster. The system can perform additional analysis on groups that are clusters.
        :param parent_name: The name of the group's parent, if it has one. The format is "projects/{project_id_or_number}/groups/{group_id}". For groups with no parent, parentName is the empty string, "".
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = MonitoringGroupTimeouts(**timeouts)
        self._values = {
            'display_name': display_name,
            'filter': filter,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if is_cluster is not None: self._values["is_cluster"] = is_cluster
        if parent_name is not None: self._values["parent_name"] = parent_name
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def display_name(self) -> str:
        """A user-assigned name for this group, used only for display purposes."""
        return self._values.get('display_name')

    @builtins.property
    def filter(self) -> str:
        """The filter used to determine which monitored resources belong to this group."""
        return self._values.get('filter')

    @builtins.property
    def is_cluster(self) -> typing.Optional[bool]:
        """If true, the members of this group are considered to be a cluster.

        The system can perform additional analysis on
        groups that are clusters.
        """
        return self._values.get('is_cluster')

    @builtins.property
    def parent_name(self) -> typing.Optional[str]:
        """The name of the group's parent, if it has one.

        The format is
        "projects/{project_id_or_number}/groups/{group_id}". For
        groups with no parent, parentName is the empty string, "".
        """
        return self._values.get('parent_name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitoringGroupTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringGroupConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringGroupTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class MonitoringGroupTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringGroupTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class MonitoringMetricDescriptor(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.MonitoringMetricDescriptor"):
    def __init__(self, scope: constructs.Construct, id: str, *, description: str, display_name: str, metric_kind: str, type: str, value_type: str, labels: typing.Optional[typing.List["MonitoringMetricDescriptorLabels"]]=None, launch_stage: typing.Optional[str]=None, metadata: typing.Optional[typing.List["MonitoringMetricDescriptorMetadata"]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["MonitoringMetricDescriptorTimeouts"]=None, unit: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param description: A detailed description of the metric, which can be used in documentation.
        :param display_name: A concise name for the metric, which can be displayed in user interfaces. Use sentence case without an ending period, for example "Request count".
        :param metric_kind: Whether the metric records instantaneous values, changes to a value, etc. Some combinations of metricKind and valueType might not be supported. Possible values: ["METRIC_KIND_UNSPECIFIED", "GAUGE", "DELTA", "CUMULATIVE"]
        :param type: The metric type, including its DNS name prefix. The type is not URL-encoded. All service defined metrics must be prefixed with the service name, in the format of {service name}/{relative metric name}, such as cloudsql.googleapis.com/database/cpu/utilization. The relative metric name must have only upper and lower-case letters, digits, '/' and underscores '_' are allowed. Additionally, the maximum number of characters allowed for the relative_metric_name is 100. All user-defined metric types have the DNS name custom.googleapis.com, external.googleapis.com, or logging.googleapis.com/user/.
        :param value_type: Whether the measurement is an integer, a floating-point number, etc. Some combinations of metricKind and valueType might not be supported. Possible values: ["BOOL", "INT64", "DOUBLE", "STRING", "DISTRIBUTION"]
        :param labels: labels block.
        :param launch_stage: The launch stage of the metric definition. Possible values: ["LAUNCH_STAGE_UNSPECIFIED", "UNIMPLEMENTED", "PRELAUNCH", "EARLY_ACCESS", "ALPHA", "BETA", "GA", "DEPRECATED"]
        :param metadata: metadata block.
        :param project: 
        :param timeouts: timeouts block.
        :param unit: The units in which the metric value is reported. It is only applicable if the valueType is INT64, DOUBLE, or DISTRIBUTION. The unit defines the representation of the stored metric values. Different systems may scale the values to be more easily displayed (so a value of 0.02KBy might be displayed as 20By, and a value of 3523KBy might be displayed as 3.5MBy). However, if the unit is KBy, then the value of the metric is always in thousands of bytes, no matter how it may be displayed. If you want a custom metric to record the exact number of CPU-seconds used by a job, you can create an INT64 CUMULATIVE metric whose unit is s{CPU} (or equivalently 1s{CPU} or just s). If the job uses 12,005 CPU-seconds, then the value is written as 12005. Alternatively, if you want a custom metric to record data in a more granular way, you can create a DOUBLE CUMULATIVE metric whose unit is ks{CPU}, and then write the value 12.005 (which is 12005/1000), or use Kis{CPU} and write 11.723 (which is 12005/1024). The supported units are a subset of The Unified Code for Units of Measure standard. More info can be found in the API documentation (https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors).
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitoringMetricDescriptorConfig(description=description, display_name=display_name, metric_kind=metric_kind, type=type, value_type=value_type, labels=labels, launch_stage=launch_stage, metadata=metadata, project=project, timeouts=timeouts, unit=unit, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(MonitoringMetricDescriptor, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="monitoredResourceTypes")
    def monitored_resource_types(self) -> typing.List[str]:
        return jsii.get(self, "monitoredResourceTypes")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: str) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="metricKind")
    def metric_kind(self) -> str:
        return jsii.get(self, "metricKind")

    @metric_kind.setter
    def metric_kind(self, value: str) -> None:
        jsii.set(self, "metricKind", value)

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")

    @type.setter
    def type(self, value: str) -> None:
        jsii.set(self, "type", value)

    @builtins.property
    @jsii.member(jsii_name="valueType")
    def value_type(self) -> str:
        return jsii.get(self, "valueType")

    @value_type.setter
    def value_type(self, value: str) -> None:
        jsii.set(self, "valueType", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.List["MonitoringMetricDescriptorLabels"]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.List["MonitoringMetricDescriptorLabels"]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="launchStage")
    def launch_stage(self) -> typing.Optional[str]:
        return jsii.get(self, "launchStage")

    @launch_stage.setter
    def launch_stage(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "launchStage", value)

    @builtins.property
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Optional[typing.List["MonitoringMetricDescriptorMetadata"]]:
        return jsii.get(self, "metadata")

    @metadata.setter
    def metadata(self, value: typing.Optional[typing.List["MonitoringMetricDescriptorMetadata"]]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["MonitoringMetricDescriptorTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["MonitoringMetricDescriptorTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="unit")
    def unit(self) -> typing.Optional[str]:
        return jsii.get(self, "unit")

    @unit.setter
    def unit(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "unit", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringMetricDescriptorConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'description': 'description', 'display_name': 'displayName', 'metric_kind': 'metricKind', 'type': 'type', 'value_type': 'valueType', 'labels': 'labels', 'launch_stage': 'launchStage', 'metadata': 'metadata', 'project': 'project', 'timeouts': 'timeouts', 'unit': 'unit'})
class MonitoringMetricDescriptorConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, description: str, display_name: str, metric_kind: str, type: str, value_type: str, labels: typing.Optional[typing.List["MonitoringMetricDescriptorLabels"]]=None, launch_stage: typing.Optional[str]=None, metadata: typing.Optional[typing.List["MonitoringMetricDescriptorMetadata"]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["MonitoringMetricDescriptorTimeouts"]=None, unit: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param description: A detailed description of the metric, which can be used in documentation.
        :param display_name: A concise name for the metric, which can be displayed in user interfaces. Use sentence case without an ending period, for example "Request count".
        :param metric_kind: Whether the metric records instantaneous values, changes to a value, etc. Some combinations of metricKind and valueType might not be supported. Possible values: ["METRIC_KIND_UNSPECIFIED", "GAUGE", "DELTA", "CUMULATIVE"]
        :param type: The metric type, including its DNS name prefix. The type is not URL-encoded. All service defined metrics must be prefixed with the service name, in the format of {service name}/{relative metric name}, such as cloudsql.googleapis.com/database/cpu/utilization. The relative metric name must have only upper and lower-case letters, digits, '/' and underscores '_' are allowed. Additionally, the maximum number of characters allowed for the relative_metric_name is 100. All user-defined metric types have the DNS name custom.googleapis.com, external.googleapis.com, or logging.googleapis.com/user/.
        :param value_type: Whether the measurement is an integer, a floating-point number, etc. Some combinations of metricKind and valueType might not be supported. Possible values: ["BOOL", "INT64", "DOUBLE", "STRING", "DISTRIBUTION"]
        :param labels: labels block.
        :param launch_stage: The launch stage of the metric definition. Possible values: ["LAUNCH_STAGE_UNSPECIFIED", "UNIMPLEMENTED", "PRELAUNCH", "EARLY_ACCESS", "ALPHA", "BETA", "GA", "DEPRECATED"]
        :param metadata: metadata block.
        :param project: 
        :param timeouts: timeouts block.
        :param unit: The units in which the metric value is reported. It is only applicable if the valueType is INT64, DOUBLE, or DISTRIBUTION. The unit defines the representation of the stored metric values. Different systems may scale the values to be more easily displayed (so a value of 0.02KBy might be displayed as 20By, and a value of 3523KBy might be displayed as 3.5MBy). However, if the unit is KBy, then the value of the metric is always in thousands of bytes, no matter how it may be displayed. If you want a custom metric to record the exact number of CPU-seconds used by a job, you can create an INT64 CUMULATIVE metric whose unit is s{CPU} (or equivalently 1s{CPU} or just s). If the job uses 12,005 CPU-seconds, then the value is written as 12005. Alternatively, if you want a custom metric to record data in a more granular way, you can create a DOUBLE CUMULATIVE metric whose unit is ks{CPU}, and then write the value 12.005 (which is 12005/1000), or use Kis{CPU} and write 11.723 (which is 12005/1024). The supported units are a subset of The Unified Code for Units of Measure standard. More info can be found in the API documentation (https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors).
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = MonitoringMetricDescriptorTimeouts(**timeouts)
        self._values = {
            'description': description,
            'display_name': display_name,
            'metric_kind': metric_kind,
            'type': type,
            'value_type': value_type,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if labels is not None: self._values["labels"] = labels
        if launch_stage is not None: self._values["launch_stage"] = launch_stage
        if metadata is not None: self._values["metadata"] = metadata
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts
        if unit is not None: self._values["unit"] = unit

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def description(self) -> str:
        """A detailed description of the metric, which can be used in documentation."""
        return self._values.get('description')

    @builtins.property
    def display_name(self) -> str:
        """A concise name for the metric, which can be displayed in user interfaces.

        Use sentence case without an ending period, for example "Request count".
        """
        return self._values.get('display_name')

    @builtins.property
    def metric_kind(self) -> str:
        """Whether the metric records instantaneous values, changes to a value, etc.

        Some combinations of metricKind and valueType might not be supported. Possible values: ["METRIC_KIND_UNSPECIFIED", "GAUGE", "DELTA", "CUMULATIVE"]
        """
        return self._values.get('metric_kind')

    @builtins.property
    def type(self) -> str:
        """The metric type, including its DNS name prefix.

        The type is not URL-encoded. All service defined metrics must be prefixed with the service name, in the format of {service name}/{relative metric name}, such as cloudsql.googleapis.com/database/cpu/utilization. The relative metric name must have only upper and lower-case letters, digits, '/' and underscores '_' are allowed. Additionally, the maximum number of characters allowed for the relative_metric_name is 100. All user-defined metric types have the DNS name custom.googleapis.com, external.googleapis.com, or logging.googleapis.com/user/.
        """
        return self._values.get('type')

    @builtins.property
    def value_type(self) -> str:
        """Whether the measurement is an integer, a floating-point number, etc.

        Some combinations of metricKind and valueType might not be supported. Possible values: ["BOOL", "INT64", "DOUBLE", "STRING", "DISTRIBUTION"]
        """
        return self._values.get('value_type')

    @builtins.property
    def labels(self) -> typing.Optional[typing.List["MonitoringMetricDescriptorLabels"]]:
        """labels block."""
        return self._values.get('labels')

    @builtins.property
    def launch_stage(self) -> typing.Optional[str]:
        """The launch stage of the metric definition.

        Possible values: ["LAUNCH_STAGE_UNSPECIFIED", "UNIMPLEMENTED", "PRELAUNCH", "EARLY_ACCESS", "ALPHA", "BETA", "GA", "DEPRECATED"]
        """
        return self._values.get('launch_stage')

    @builtins.property
    def metadata(self) -> typing.Optional[typing.List["MonitoringMetricDescriptorMetadata"]]:
        """metadata block."""
        return self._values.get('metadata')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitoringMetricDescriptorTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def unit(self) -> typing.Optional[str]:
        """The units in which the metric value is reported.

        It is only applicable if the
        valueType is INT64, DOUBLE, or DISTRIBUTION. The unit defines the representation of
        the stored metric values.

        Different systems may scale the values to be more easily displayed (so a value of
        0.02KBy might be displayed as 20By, and a value of 3523KBy might be displayed as
        3.5MBy). However, if the unit is KBy, then the value of the metric is always in
        thousands of bytes, no matter how it may be displayed.

        If you want a custom metric to record the exact number of CPU-seconds used by a job,
        you can create an INT64 CUMULATIVE metric whose unit is s{CPU} (or equivalently
        1s{CPU} or just s). If the job uses 12,005 CPU-seconds, then the value is written as
        12005.

        Alternatively, if you want a custom metric to record data in a more granular way, you
        can create a DOUBLE CUMULATIVE metric whose unit is ks{CPU}, and then write the value
        12.005 (which is 12005/1000), or use Kis{CPU} and write 11.723 (which is 12005/1024).
        The supported units are a subset of The Unified Code for Units of Measure standard.
        More info can be found in the API documentation
        (https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors).
        """
        return self._values.get('unit')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringMetricDescriptorConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringMetricDescriptorLabels", jsii_struct_bases=[], name_mapping={'key': 'key', 'description': 'description', 'value_type': 'valueType'})
class MonitoringMetricDescriptorLabels():
    def __init__(self, *, key: str, description: typing.Optional[str]=None, value_type: typing.Optional[str]=None) -> None:
        """
        :param key: The key for this label. The key must not exceed 100 characters. The first character of the key must be an upper- or lower-case letter, the remaining characters must be letters, digits or underscores, and the key must match the regular expression [a-zA-Z][a-zA-Z0-9_]*
        :param description: A human-readable description for the label.
        :param value_type: The type of data that can be assigned to the label. Default value: "STRING" Possible values: ["STRING", "BOOL", "INT64"]
        """
        self._values = {
            'key': key,
        }
        if description is not None: self._values["description"] = description
        if value_type is not None: self._values["value_type"] = value_type

    @builtins.property
    def key(self) -> str:
        """The key for this label.

        The key must not exceed 100 characters. The first character of the key must be an upper- or lower-case letter, the remaining characters must be letters, digits or underscores, and the key must match the regular expression [a-zA-Z][a-zA-Z0-9_]*
        """
        return self._values.get('key')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A human-readable description for the label."""
        return self._values.get('description')

    @builtins.property
    def value_type(self) -> typing.Optional[str]:
        """The type of data that can be assigned to the label.

        Default value: "STRING" Possible values: ["STRING", "BOOL", "INT64"]
        """
        return self._values.get('value_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringMetricDescriptorLabels(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringMetricDescriptorMetadata", jsii_struct_bases=[], name_mapping={'ingest_delay': 'ingestDelay', 'sample_period': 'samplePeriod'})
class MonitoringMetricDescriptorMetadata():
    def __init__(self, *, ingest_delay: typing.Optional[str]=None, sample_period: typing.Optional[str]=None) -> None:
        """
        :param ingest_delay: The delay of data points caused by ingestion. Data points older than this age are guaranteed to be ingested and available to be read, excluding data loss due to errors. In '`duration format <https://developers.google.com/protocol-buffers/docs/reference/google.protobuf?&_ga=2.264881487.1507873253.1593446723-935052455.1591817775#google.protobuf.Duration>`_'.
        :param sample_period: The sampling period of metric data points. For metrics which are written periodically, consecutive data points are stored at this time interval, excluding data loss due to errors. Metrics with a higher granularity have a smaller sampling period. In '`duration format <https://developers.google.com/protocol-buffers/docs/reference/google.protobuf?&_ga=2.264881487.1507873253.1593446723-935052455.1591817775#google.protobuf.Duration>`_'.
        """
        self._values = {
        }
        if ingest_delay is not None: self._values["ingest_delay"] = ingest_delay
        if sample_period is not None: self._values["sample_period"] = sample_period

    @builtins.property
    def ingest_delay(self) -> typing.Optional[str]:
        """The delay of data points caused by ingestion.

        Data points older than this age are guaranteed to be ingested and available to be read, excluding data loss due to errors. In '`duration format <https://developers.google.com/protocol-buffers/docs/reference/google.protobuf?&_ga=2.264881487.1507873253.1593446723-935052455.1591817775#google.protobuf.Duration>`_'.
        """
        return self._values.get('ingest_delay')

    @builtins.property
    def sample_period(self) -> typing.Optional[str]:
        """The sampling period of metric data points.

        For metrics which are written periodically, consecutive data points are stored at this time interval, excluding data loss due to errors. Metrics with a higher granularity have a smaller sampling period. In '`duration format <https://developers.google.com/protocol-buffers/docs/reference/google.protobuf?&_ga=2.264881487.1507873253.1593446723-935052455.1591817775#google.protobuf.Duration>`_'.
        """
        return self._values.get('sample_period')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringMetricDescriptorMetadata(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringMetricDescriptorTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class MonitoringMetricDescriptorTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringMetricDescriptorTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class MonitoringNotificationChannel(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.MonitoringNotificationChannel"):
    def __init__(self, scope: constructs.Construct, id: str, *, type: str, description: typing.Optional[str]=None, display_name: typing.Optional[str]=None, enabled: typing.Optional[bool]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, sensitive_labels: typing.Optional[typing.List["MonitoringNotificationChannelSensitiveLabels"]]=None, timeouts: typing.Optional["MonitoringNotificationChannelTimeouts"]=None, user_labels: typing.Optional[typing.Mapping[str, str]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param type: The type of the notification channel. This field matches the value of the NotificationChannelDescriptor.type field. See https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.notificationChannelDescriptors/list to get the list of valid values such as "email", "slack", etc...
        :param description: An optional human-readable description of this notification channel. This description may provide additional details, beyond the display name, for the channel. This may not exceed 1024 Unicode characters.
        :param display_name: An optional human-readable name for this notification channel. It is recommended that you specify a non-empty and unique name in order to make it easier to identify the channels in your project, though this is not enforced. The display name is limited to 512 Unicode characters.
        :param enabled: Whether notifications are forwarded to the described channel. This makes it possible to disable delivery of notifications to a particular channel without removing the channel from all alerting policies that reference the channel. This is a more convenient approach when the change is temporary and you want to receive notifications from the same set of alerting policies on the channel at some point in the future.
        :param labels: Configuration fields that define the channel and its behavior. The permissible and required labels are specified in the NotificationChannelDescriptor corresponding to the type field. Labels with sensitive data are obfuscated by the API and therefore Terraform cannot determine if there are upstream changes to these fields. They can also be configured via the sensitive_labels block, but cannot be configured in both places.
        :param project: 
        :param sensitive_labels: sensitive_labels block.
        :param timeouts: timeouts block.
        :param user_labels: User-supplied key/value data that does not need to conform to the corresponding NotificationChannelDescriptor's schema, unlike the labels field. This field is intended to be used for organizing and identifying the NotificationChannel objects.The field can contain up to 64 entries. Each key and value is limited to 63 Unicode characters or 128 bytes, whichever is smaller. Labels and values can contain only lowercase letters, numerals, underscores, and dashes. Keys must begin with a letter.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitoringNotificationChannelConfig(type=type, description=description, display_name=display_name, enabled=enabled, labels=labels, project=project, sensitive_labels=sensitive_labels, timeouts=timeouts, user_labels=user_labels, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(MonitoringNotificationChannel, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="verificationStatus")
    def verification_status(self) -> str:
        return jsii.get(self, "verificationStatus")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")

    @type.setter
    def type(self, value: str) -> None:
        jsii.set(self, "type", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> typing.Optional[str]:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "enabled")

    @enabled.setter
    def enabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="sensitiveLabels")
    def sensitive_labels(self) -> typing.Optional[typing.List["MonitoringNotificationChannelSensitiveLabels"]]:
        return jsii.get(self, "sensitiveLabels")

    @sensitive_labels.setter
    def sensitive_labels(self, value: typing.Optional[typing.List["MonitoringNotificationChannelSensitiveLabels"]]) -> None:
        jsii.set(self, "sensitiveLabels", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["MonitoringNotificationChannelTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["MonitoringNotificationChannelTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="userLabels")
    def user_labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "userLabels")

    @user_labels.setter
    def user_labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "userLabels", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringNotificationChannelConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'type': 'type', 'description': 'description', 'display_name': 'displayName', 'enabled': 'enabled', 'labels': 'labels', 'project': 'project', 'sensitive_labels': 'sensitiveLabels', 'timeouts': 'timeouts', 'user_labels': 'userLabels'})
class MonitoringNotificationChannelConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, type: str, description: typing.Optional[str]=None, display_name: typing.Optional[str]=None, enabled: typing.Optional[bool]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, sensitive_labels: typing.Optional[typing.List["MonitoringNotificationChannelSensitiveLabels"]]=None, timeouts: typing.Optional["MonitoringNotificationChannelTimeouts"]=None, user_labels: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param type: The type of the notification channel. This field matches the value of the NotificationChannelDescriptor.type field. See https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.notificationChannelDescriptors/list to get the list of valid values such as "email", "slack", etc...
        :param description: An optional human-readable description of this notification channel. This description may provide additional details, beyond the display name, for the channel. This may not exceed 1024 Unicode characters.
        :param display_name: An optional human-readable name for this notification channel. It is recommended that you specify a non-empty and unique name in order to make it easier to identify the channels in your project, though this is not enforced. The display name is limited to 512 Unicode characters.
        :param enabled: Whether notifications are forwarded to the described channel. This makes it possible to disable delivery of notifications to a particular channel without removing the channel from all alerting policies that reference the channel. This is a more convenient approach when the change is temporary and you want to receive notifications from the same set of alerting policies on the channel at some point in the future.
        :param labels: Configuration fields that define the channel and its behavior. The permissible and required labels are specified in the NotificationChannelDescriptor corresponding to the type field. Labels with sensitive data are obfuscated by the API and therefore Terraform cannot determine if there are upstream changes to these fields. They can also be configured via the sensitive_labels block, but cannot be configured in both places.
        :param project: 
        :param sensitive_labels: sensitive_labels block.
        :param timeouts: timeouts block.
        :param user_labels: User-supplied key/value data that does not need to conform to the corresponding NotificationChannelDescriptor's schema, unlike the labels field. This field is intended to be used for organizing and identifying the NotificationChannel objects.The field can contain up to 64 entries. Each key and value is limited to 63 Unicode characters or 128 bytes, whichever is smaller. Labels and values can contain only lowercase letters, numerals, underscores, and dashes. Keys must begin with a letter.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = MonitoringNotificationChannelTimeouts(**timeouts)
        self._values = {
            'type': type,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if display_name is not None: self._values["display_name"] = display_name
        if enabled is not None: self._values["enabled"] = enabled
        if labels is not None: self._values["labels"] = labels
        if project is not None: self._values["project"] = project
        if sensitive_labels is not None: self._values["sensitive_labels"] = sensitive_labels
        if timeouts is not None: self._values["timeouts"] = timeouts
        if user_labels is not None: self._values["user_labels"] = user_labels

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def type(self) -> str:
        """The type of the notification channel.

        This field matches the value of the NotificationChannelDescriptor.type field. See https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.notificationChannelDescriptors/list to get the list of valid values such as "email", "slack", etc...
        """
        return self._values.get('type')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """An optional human-readable description of this notification channel.

        This description may provide additional details, beyond the display name, for the channel. This may not exceed 1024 Unicode characters.
        """
        return self._values.get('description')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """An optional human-readable name for this notification channel.

        It is recommended that you specify a non-empty and unique name in order to make it easier to identify the channels in your project, though this is not enforced. The display name is limited to 512 Unicode characters.
        """
        return self._values.get('display_name')

    @builtins.property
    def enabled(self) -> typing.Optional[bool]:
        """Whether notifications are forwarded to the described channel.

        This makes it possible to disable delivery of notifications to a particular channel without removing the channel from all alerting policies that reference the channel. This is a more convenient approach when the change is temporary and you want to receive notifications from the same set of alerting policies on the channel at some point in the future.
        """
        return self._values.get('enabled')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Configuration fields that define the channel and its behavior.

        The
        permissible and required labels are specified in the
        NotificationChannelDescriptor corresponding to the type field.

        Labels with sensitive data are obfuscated by the API and therefore Terraform cannot
        determine if there are upstream changes to these fields. They can also be configured via
        the sensitive_labels block, but cannot be configured in both places.
        """
        return self._values.get('labels')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def sensitive_labels(self) -> typing.Optional[typing.List["MonitoringNotificationChannelSensitiveLabels"]]:
        """sensitive_labels block."""
        return self._values.get('sensitive_labels')

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitoringNotificationChannelTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def user_labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """User-supplied key/value data that does not need to conform to the corresponding NotificationChannelDescriptor's schema, unlike the labels field.

        This field is intended to be used for organizing and identifying the NotificationChannel objects.The field can contain up to 64 entries. Each key and value is limited to 63 Unicode characters or 128 bytes, whichever is smaller. Labels and values can contain only lowercase letters, numerals, underscores, and dashes. Keys must begin with a letter.
        """
        return self._values.get('user_labels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringNotificationChannelConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringNotificationChannelSensitiveLabels", jsii_struct_bases=[], name_mapping={'auth_token': 'authToken', 'password': 'password', 'service_key': 'serviceKey'})
class MonitoringNotificationChannelSensitiveLabels():
    def __init__(self, *, auth_token: typing.Optional[str]=None, password: typing.Optional[str]=None, service_key: typing.Optional[str]=None) -> None:
        """
        :param auth_token: An authorization token for a notification channel. Channel types that support this field include: slack
        :param password: An password for a notification channel. Channel types that support this field include: webhook_basicauth
        :param service_key: An servicekey token for a notification channel. Channel types that support this field include: pagerduty
        """
        self._values = {
        }
        if auth_token is not None: self._values["auth_token"] = auth_token
        if password is not None: self._values["password"] = password
        if service_key is not None: self._values["service_key"] = service_key

    @builtins.property
    def auth_token(self) -> typing.Optional[str]:
        """An authorization token for a notification channel.

        Channel types that support this field include: slack
        """
        return self._values.get('auth_token')

    @builtins.property
    def password(self) -> typing.Optional[str]:
        """An password for a notification channel.

        Channel types that support this field include: webhook_basicauth
        """
        return self._values.get('password')

    @builtins.property
    def service_key(self) -> typing.Optional[str]:
        """An servicekey token for a notification channel.

        Channel types that support this field include: pagerduty
        """
        return self._values.get('service_key')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringNotificationChannelSensitiveLabels(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringNotificationChannelTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class MonitoringNotificationChannelTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringNotificationChannelTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class MonitoringSlo(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.MonitoringSlo"):
    def __init__(self, scope: constructs.Construct, id: str, *, goal: jsii.Number, service: str, basic_sli: typing.Optional[typing.List["MonitoringSloBasicSli"]]=None, calendar_period: typing.Optional[str]=None, display_name: typing.Optional[str]=None, project: typing.Optional[str]=None, request_based_sli: typing.Optional[typing.List["MonitoringSloRequestBasedSli"]]=None, rolling_period_days: typing.Optional[jsii.Number]=None, slo_id: typing.Optional[str]=None, timeouts: typing.Optional["MonitoringSloTimeouts"]=None, windows_based_sli: typing.Optional[typing.List["MonitoringSloWindowsBasedSli"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param goal: The fraction of service that must be good in order for this objective to be met. 0 < goal <= 0.999
        :param service: ID of the service to which this SLO belongs.
        :param basic_sli: basic_sli block.
        :param calendar_period: A calendar period, semantically "since the start of the current ". Possible values: ["DAY", "WEEK", "FORTNIGHT", "MONTH"]
        :param display_name: Name used for UI elements listing this SLO.
        :param project: 
        :param request_based_sli: request_based_sli block.
        :param rolling_period_days: A rolling time period, semantically "in the past X days". Must be between 1 to 30 days, inclusive.
        :param slo_id: The id to use for this ServiceLevelObjective. If omitted, an id will be generated instead.
        :param timeouts: timeouts block.
        :param windows_based_sli: windows_based_sli block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitoringSloConfig(goal=goal, service=service, basic_sli=basic_sli, calendar_period=calendar_period, display_name=display_name, project=project, request_based_sli=request_based_sli, rolling_period_days=rolling_period_days, slo_id=slo_id, timeouts=timeouts, windows_based_sli=windows_based_sli, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(MonitoringSlo, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="goal")
    def goal(self) -> jsii.Number:
        return jsii.get(self, "goal")

    @goal.setter
    def goal(self, value: jsii.Number) -> None:
        jsii.set(self, "goal", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="basicSli")
    def basic_sli(self) -> typing.Optional[typing.List["MonitoringSloBasicSli"]]:
        return jsii.get(self, "basicSli")

    @basic_sli.setter
    def basic_sli(self, value: typing.Optional[typing.List["MonitoringSloBasicSli"]]) -> None:
        jsii.set(self, "basicSli", value)

    @builtins.property
    @jsii.member(jsii_name="calendarPeriod")
    def calendar_period(self) -> typing.Optional[str]:
        return jsii.get(self, "calendarPeriod")

    @calendar_period.setter
    def calendar_period(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "calendarPeriod", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> typing.Optional[str]:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="requestBasedSli")
    def request_based_sli(self) -> typing.Optional[typing.List["MonitoringSloRequestBasedSli"]]:
        return jsii.get(self, "requestBasedSli")

    @request_based_sli.setter
    def request_based_sli(self, value: typing.Optional[typing.List["MonitoringSloRequestBasedSli"]]) -> None:
        jsii.set(self, "requestBasedSli", value)

    @builtins.property
    @jsii.member(jsii_name="rollingPeriodDays")
    def rolling_period_days(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "rollingPeriodDays")

    @rolling_period_days.setter
    def rolling_period_days(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "rollingPeriodDays", value)

    @builtins.property
    @jsii.member(jsii_name="sloId")
    def slo_id(self) -> typing.Optional[str]:
        return jsii.get(self, "sloId")

    @slo_id.setter
    def slo_id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "sloId", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["MonitoringSloTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["MonitoringSloTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="windowsBasedSli")
    def windows_based_sli(self) -> typing.Optional[typing.List["MonitoringSloWindowsBasedSli"]]:
        return jsii.get(self, "windowsBasedSli")

    @windows_based_sli.setter
    def windows_based_sli(self, value: typing.Optional[typing.List["MonitoringSloWindowsBasedSli"]]) -> None:
        jsii.set(self, "windowsBasedSli", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloBasicSli", jsii_struct_bases=[], name_mapping={'latency': 'latency', 'location': 'location', 'method': 'method', 'version': 'version'})
class MonitoringSloBasicSli():
    def __init__(self, *, latency: typing.List["MonitoringSloBasicSliLatency"], location: typing.Optional[typing.List[str]]=None, method: typing.Optional[typing.List[str]]=None, version: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param latency: latency block.
        :param location: An optional set of locations to which this SLI is relevant. Telemetry from other locations will not be used to calculate performance for this SLI. If omitted, this SLI applies to all locations in which the Service has activity. For service types that don't support breaking down by location, setting this field will result in an error.
        :param method: An optional set of RPCs to which this SLI is relevant. Telemetry from other methods will not be used to calculate performance for this SLI. If omitted, this SLI applies to all the Service's methods. For service types that don't support breaking down by method, setting this field will result in an error.
        :param version: The set of API versions to which this SLI is relevant. Telemetry from other API versions will not be used to calculate performance for this SLI. If omitted, this SLI applies to all API versions. For service types that don't support breaking down by version, setting this field will result in an error.
        """
        self._values = {
            'latency': latency,
        }
        if location is not None: self._values["location"] = location
        if method is not None: self._values["method"] = method
        if version is not None: self._values["version"] = version

    @builtins.property
    def latency(self) -> typing.List["MonitoringSloBasicSliLatency"]:
        """latency block."""
        return self._values.get('latency')

    @builtins.property
    def location(self) -> typing.Optional[typing.List[str]]:
        """An optional set of locations to which this SLI is relevant.

        Telemetry from other locations will not be used to calculate
        performance for this SLI. If omitted, this SLI applies to all
        locations in which the Service has activity. For service types
        that don't support breaking down by location, setting this
        field will result in an error.
        """
        return self._values.get('location')

    @builtins.property
    def method(self) -> typing.Optional[typing.List[str]]:
        """An optional set of RPCs to which this SLI is relevant.

        Telemetry from other methods will not be used to calculate
        performance for this SLI. If omitted, this SLI applies to all
        the Service's methods. For service types that don't support
        breaking down by method, setting this field will result in an
        error.
        """
        return self._values.get('method')

    @builtins.property
    def version(self) -> typing.Optional[typing.List[str]]:
        """The set of API versions to which this SLI is relevant.

        Telemetry from other API versions will not be used to
        calculate performance for this SLI. If omitted,
        this SLI applies to all API versions. For service types
        that don't support breaking down by version, setting this
        field will result in an error.
        """
        return self._values.get('version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloBasicSli(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloBasicSliLatency", jsii_struct_bases=[], name_mapping={'threshold': 'threshold'})
class MonitoringSloBasicSliLatency():
    def __init__(self, *, threshold: str) -> None:
        """
        :param threshold: A duration string, e.g. 10s. Good service is defined to be the count of requests made to this service that return in no more than threshold.
        """
        self._values = {
            'threshold': threshold,
        }

    @builtins.property
    def threshold(self) -> str:
        """A duration string, e.g. 10s. Good service is defined to be the count of requests made to this service that return in no more than threshold."""
        return self._values.get('threshold')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloBasicSliLatency(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'goal': 'goal', 'service': 'service', 'basic_sli': 'basicSli', 'calendar_period': 'calendarPeriod', 'display_name': 'displayName', 'project': 'project', 'request_based_sli': 'requestBasedSli', 'rolling_period_days': 'rollingPeriodDays', 'slo_id': 'sloId', 'timeouts': 'timeouts', 'windows_based_sli': 'windowsBasedSli'})
class MonitoringSloConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, goal: jsii.Number, service: str, basic_sli: typing.Optional[typing.List["MonitoringSloBasicSli"]]=None, calendar_period: typing.Optional[str]=None, display_name: typing.Optional[str]=None, project: typing.Optional[str]=None, request_based_sli: typing.Optional[typing.List["MonitoringSloRequestBasedSli"]]=None, rolling_period_days: typing.Optional[jsii.Number]=None, slo_id: typing.Optional[str]=None, timeouts: typing.Optional["MonitoringSloTimeouts"]=None, windows_based_sli: typing.Optional[typing.List["MonitoringSloWindowsBasedSli"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param goal: The fraction of service that must be good in order for this objective to be met. 0 < goal <= 0.999
        :param service: ID of the service to which this SLO belongs.
        :param basic_sli: basic_sli block.
        :param calendar_period: A calendar period, semantically "since the start of the current ". Possible values: ["DAY", "WEEK", "FORTNIGHT", "MONTH"]
        :param display_name: Name used for UI elements listing this SLO.
        :param project: 
        :param request_based_sli: request_based_sli block.
        :param rolling_period_days: A rolling time period, semantically "in the past X days". Must be between 1 to 30 days, inclusive.
        :param slo_id: The id to use for this ServiceLevelObjective. If omitted, an id will be generated instead.
        :param timeouts: timeouts block.
        :param windows_based_sli: windows_based_sli block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = MonitoringSloTimeouts(**timeouts)
        self._values = {
            'goal': goal,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if basic_sli is not None: self._values["basic_sli"] = basic_sli
        if calendar_period is not None: self._values["calendar_period"] = calendar_period
        if display_name is not None: self._values["display_name"] = display_name
        if project is not None: self._values["project"] = project
        if request_based_sli is not None: self._values["request_based_sli"] = request_based_sli
        if rolling_period_days is not None: self._values["rolling_period_days"] = rolling_period_days
        if slo_id is not None: self._values["slo_id"] = slo_id
        if timeouts is not None: self._values["timeouts"] = timeouts
        if windows_based_sli is not None: self._values["windows_based_sli"] = windows_based_sli

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def goal(self) -> jsii.Number:
        """The fraction of service that must be good in order for this objective to be met.

        0 < goal <= 0.999
        """
        return self._values.get('goal')

    @builtins.property
    def service(self) -> str:
        """ID of the service to which this SLO belongs."""
        return self._values.get('service')

    @builtins.property
    def basic_sli(self) -> typing.Optional[typing.List["MonitoringSloBasicSli"]]:
        """basic_sli block."""
        return self._values.get('basic_sli')

    @builtins.property
    def calendar_period(self) -> typing.Optional[str]:
        """A calendar period, semantically "since the start of the current ".

        Possible values: ["DAY", "WEEK", "FORTNIGHT", "MONTH"]
        """
        return self._values.get('calendar_period')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """Name used for UI elements listing this SLO."""
        return self._values.get('display_name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def request_based_sli(self) -> typing.Optional[typing.List["MonitoringSloRequestBasedSli"]]:
        """request_based_sli block."""
        return self._values.get('request_based_sli')

    @builtins.property
    def rolling_period_days(self) -> typing.Optional[jsii.Number]:
        """A rolling time period, semantically "in the past X days".

        Must be between 1 to 30 days, inclusive.
        """
        return self._values.get('rolling_period_days')

    @builtins.property
    def slo_id(self) -> typing.Optional[str]:
        """The id to use for this ServiceLevelObjective.

        If omitted, an id will be generated instead.
        """
        return self._values.get('slo_id')

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitoringSloTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def windows_based_sli(self) -> typing.Optional[typing.List["MonitoringSloWindowsBasedSli"]]:
        """windows_based_sli block."""
        return self._values.get('windows_based_sli')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloRequestBasedSli", jsii_struct_bases=[], name_mapping={'distribution_cut': 'distributionCut', 'good_total_ratio': 'goodTotalRatio'})
class MonitoringSloRequestBasedSli():
    def __init__(self, *, distribution_cut: typing.Optional[typing.List["MonitoringSloRequestBasedSliDistributionCut"]]=None, good_total_ratio: typing.Optional[typing.List["MonitoringSloRequestBasedSliGoodTotalRatio"]]=None) -> None:
        """
        :param distribution_cut: distribution_cut block.
        :param good_total_ratio: good_total_ratio block.
        """
        self._values = {
        }
        if distribution_cut is not None: self._values["distribution_cut"] = distribution_cut
        if good_total_ratio is not None: self._values["good_total_ratio"] = good_total_ratio

    @builtins.property
    def distribution_cut(self) -> typing.Optional[typing.List["MonitoringSloRequestBasedSliDistributionCut"]]:
        """distribution_cut block."""
        return self._values.get('distribution_cut')

    @builtins.property
    def good_total_ratio(self) -> typing.Optional[typing.List["MonitoringSloRequestBasedSliGoodTotalRatio"]]:
        """good_total_ratio block."""
        return self._values.get('good_total_ratio')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloRequestBasedSli(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloRequestBasedSliDistributionCut", jsii_struct_bases=[], name_mapping={'distribution_filter': 'distributionFilter', 'range': 'range'})
class MonitoringSloRequestBasedSliDistributionCut():
    def __init__(self, *, distribution_filter: str, range: typing.List["MonitoringSloRequestBasedSliDistributionCutRange"]) -> None:
        """
        :param distribution_filter: A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ aggregating values to quantify the good service provided. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
        :param range: range block.
        """
        self._values = {
            'distribution_filter': distribution_filter,
            'range': range,
        }

    @builtins.property
    def distribution_filter(self) -> str:
        """A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ aggregating values to quantify the good service provided.

        Must have ValueType = DISTRIBUTION and
        MetricKind = DELTA or MetricKind = CUMULATIVE.
        """
        return self._values.get('distribution_filter')

    @builtins.property
    def range(self) -> typing.List["MonitoringSloRequestBasedSliDistributionCutRange"]:
        """range block."""
        return self._values.get('range')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloRequestBasedSliDistributionCut(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloRequestBasedSliDistributionCutRange", jsii_struct_bases=[], name_mapping={'max': 'max', 'min': 'min'})
class MonitoringSloRequestBasedSliDistributionCutRange():
    def __init__(self, *, max: typing.Optional[jsii.Number]=None, min: typing.Optional[jsii.Number]=None) -> None:
        """
        :param max: max value for the range (inclusive). If not given, will be set to "infinity", defining an open range ">= range.min"
        :param min: Min value for the range (inclusive). If not given, will be set to "-infinity", defining an open range "< range.max"
        """
        self._values = {
        }
        if max is not None: self._values["max"] = max
        if min is not None: self._values["min"] = min

    @builtins.property
    def max(self) -> typing.Optional[jsii.Number]:
        """max value for the range (inclusive).

        If not given,
        will be set to "infinity", defining an open range
        ">= range.min"
        """
        return self._values.get('max')

    @builtins.property
    def min(self) -> typing.Optional[jsii.Number]:
        """Min value for the range (inclusive).

        If not given,
        will be set to "-infinity", defining an open range
        "< range.max"
        """
        return self._values.get('min')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloRequestBasedSliDistributionCutRange(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloRequestBasedSliGoodTotalRatio", jsii_struct_bases=[], name_mapping={'bad_service_filter': 'badServiceFilter', 'good_service_filter': 'goodServiceFilter', 'total_service_filter': 'totalServiceFilter'})
class MonitoringSloRequestBasedSliGoodTotalRatio():
    def __init__(self, *, bad_service_filter: typing.Optional[str]=None, good_service_filter: typing.Optional[str]=None, total_service_filter: typing.Optional[str]=None) -> None:
        """
        :param bad_service_filter: A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ quantifying bad service provided, either demanded service that was not provided or demanded service that was of inadequate quality. Must have ValueType = DOUBLE or ValueType = INT64 and must have MetricKind = DELTA or MetricKind = CUMULATIVE. Exactly two of 'good_service_filter','bad_service_filter','total_service_filter' must be set (good + bad = total is assumed).
        :param good_service_filter: A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ quantifying good service provided. Must have ValueType = DOUBLE or ValueType = INT64 and must have MetricKind = DELTA or MetricKind = CUMULATIVE. Exactly two of 'good_service_filter','bad_service_filter','total_service_filter' must be set (good + bad = total is assumed).
        :param total_service_filter: A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ quantifying total demanded service. Must have ValueType = DOUBLE or ValueType = INT64 and must have MetricKind = DELTA or MetricKind = CUMULATIVE. Exactly two of 'good_service_filter','bad_service_filter','total_service_filter' must be set (good + bad = total is assumed).
        """
        self._values = {
        }
        if bad_service_filter is not None: self._values["bad_service_filter"] = bad_service_filter
        if good_service_filter is not None: self._values["good_service_filter"] = good_service_filter
        if total_service_filter is not None: self._values["total_service_filter"] = total_service_filter

    @builtins.property
    def bad_service_filter(self) -> typing.Optional[str]:
        """A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ quantifying bad service provided, either demanded service that was not provided or demanded service that was of inadequate quality.

        Must have ValueType = DOUBLE or ValueType = INT64 and
        must have MetricKind = DELTA or MetricKind = CUMULATIVE.

        Exactly two of 'good_service_filter','bad_service_filter','total_service_filter'
        must be set (good + bad = total is assumed).
        """
        return self._values.get('bad_service_filter')

    @builtins.property
    def good_service_filter(self) -> typing.Optional[str]:
        """A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ quantifying good service provided. Must have ValueType = DOUBLE or ValueType = INT64 and must have MetricKind = DELTA or MetricKind = CUMULATIVE.

        Exactly two of 'good_service_filter','bad_service_filter','total_service_filter'
        must be set (good + bad = total is assumed).
        """
        return self._values.get('good_service_filter')

    @builtins.property
    def total_service_filter(self) -> typing.Optional[str]:
        """A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ quantifying total demanded service.

        Must have ValueType = DOUBLE or ValueType = INT64 and
        must have MetricKind = DELTA or MetricKind = CUMULATIVE.

        Exactly two of 'good_service_filter','bad_service_filter','total_service_filter'
        must be set (good + bad = total is assumed).
        """
        return self._values.get('total_service_filter')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloRequestBasedSliGoodTotalRatio(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class MonitoringSloTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloWindowsBasedSli", jsii_struct_bases=[], name_mapping={'good_bad_metric_filter': 'goodBadMetricFilter', 'good_total_ratio_threshold': 'goodTotalRatioThreshold', 'metric_mean_in_range': 'metricMeanInRange', 'metric_sum_in_range': 'metricSumInRange', 'window_period': 'windowPeriod'})
class MonitoringSloWindowsBasedSli():
    def __init__(self, *, good_bad_metric_filter: typing.Optional[str]=None, good_total_ratio_threshold: typing.Optional[typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThreshold"]]=None, metric_mean_in_range: typing.Optional[typing.List["MonitoringSloWindowsBasedSliMetricMeanInRange"]]=None, metric_sum_in_range: typing.Optional[typing.List["MonitoringSloWindowsBasedSliMetricSumInRange"]]=None, window_period: typing.Optional[str]=None) -> None:
        """
        :param good_bad_metric_filter: A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ with ValueType = BOOL. The window is good if any true values appear in the window. One of 'good_bad_metric_filter', 'good_total_ratio_threshold', 'metric_mean_in_range', 'metric_sum_in_range' must be set for 'windows_based_sli'.
        :param good_total_ratio_threshold: good_total_ratio_threshold block.
        :param metric_mean_in_range: metric_mean_in_range block.
        :param metric_sum_in_range: metric_sum_in_range block.
        :param window_period: Duration over which window quality is evaluated, given as a duration string "{X}s" representing X seconds. Must be an integer fraction of a day and at least 60s.
        """
        self._values = {
        }
        if good_bad_metric_filter is not None: self._values["good_bad_metric_filter"] = good_bad_metric_filter
        if good_total_ratio_threshold is not None: self._values["good_total_ratio_threshold"] = good_total_ratio_threshold
        if metric_mean_in_range is not None: self._values["metric_mean_in_range"] = metric_mean_in_range
        if metric_sum_in_range is not None: self._values["metric_sum_in_range"] = metric_sum_in_range
        if window_period is not None: self._values["window_period"] = window_period

    @builtins.property
    def good_bad_metric_filter(self) -> typing.Optional[str]:
        """A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ with ValueType = BOOL. The window is good if any true values appear in the window. One of 'good_bad_metric_filter', 'good_total_ratio_threshold', 'metric_mean_in_range', 'metric_sum_in_range' must be set for 'windows_based_sli'."""
        return self._values.get('good_bad_metric_filter')

    @builtins.property
    def good_total_ratio_threshold(self) -> typing.Optional[typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThreshold"]]:
        """good_total_ratio_threshold block."""
        return self._values.get('good_total_ratio_threshold')

    @builtins.property
    def metric_mean_in_range(self) -> typing.Optional[typing.List["MonitoringSloWindowsBasedSliMetricMeanInRange"]]:
        """metric_mean_in_range block."""
        return self._values.get('metric_mean_in_range')

    @builtins.property
    def metric_sum_in_range(self) -> typing.Optional[typing.List["MonitoringSloWindowsBasedSliMetricSumInRange"]]:
        """metric_sum_in_range block."""
        return self._values.get('metric_sum_in_range')

    @builtins.property
    def window_period(self) -> typing.Optional[str]:
        """Duration over which window quality is evaluated, given as a duration string "{X}s" representing X seconds.

        Must be an
        integer fraction of a day and at least 60s.
        """
        return self._values.get('window_period')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloWindowsBasedSli(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloWindowsBasedSliGoodTotalRatioThreshold", jsii_struct_bases=[], name_mapping={'basic_sli_performance': 'basicSliPerformance', 'performance': 'performance', 'threshold': 'threshold'})
class MonitoringSloWindowsBasedSliGoodTotalRatioThreshold():
    def __init__(self, *, basic_sli_performance: typing.Optional[typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThresholdBasicSliPerformance"]]=None, performance: typing.Optional[typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformance"]]=None, threshold: typing.Optional[jsii.Number]=None) -> None:
        """
        :param basic_sli_performance: basic_sli_performance block.
        :param performance: performance block.
        :param threshold: If window performance >= threshold, the window is counted as good.
        """
        self._values = {
        }
        if basic_sli_performance is not None: self._values["basic_sli_performance"] = basic_sli_performance
        if performance is not None: self._values["performance"] = performance
        if threshold is not None: self._values["threshold"] = threshold

    @builtins.property
    def basic_sli_performance(self) -> typing.Optional[typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThresholdBasicSliPerformance"]]:
        """basic_sli_performance block."""
        return self._values.get('basic_sli_performance')

    @builtins.property
    def performance(self) -> typing.Optional[typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformance"]]:
        """performance block."""
        return self._values.get('performance')

    @builtins.property
    def threshold(self) -> typing.Optional[jsii.Number]:
        """If window performance >= threshold, the window is counted as good."""
        return self._values.get('threshold')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloWindowsBasedSliGoodTotalRatioThreshold(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloWindowsBasedSliGoodTotalRatioThresholdBasicSliPerformance", jsii_struct_bases=[], name_mapping={'latency': 'latency', 'location': 'location', 'method': 'method', 'version': 'version'})
class MonitoringSloWindowsBasedSliGoodTotalRatioThresholdBasicSliPerformance():
    def __init__(self, *, latency: typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThresholdBasicSliPerformanceLatency"], location: typing.Optional[typing.List[str]]=None, method: typing.Optional[typing.List[str]]=None, version: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param latency: latency block.
        :param location: An optional set of locations to which this SLI is relevant. Telemetry from other locations will not be used to calculate performance for this SLI. If omitted, this SLI applies to all locations in which the Service has activity. For service types that don't support breaking down by location, setting this field will result in an error.
        :param method: An optional set of RPCs to which this SLI is relevant. Telemetry from other methods will not be used to calculate performance for this SLI. If omitted, this SLI applies to all the Service's methods. For service types that don't support breaking down by method, setting this field will result in an error.
        :param version: The set of API versions to which this SLI is relevant. Telemetry from other API versions will not be used to calculate performance for this SLI. If omitted, this SLI applies to all API versions. For service types that don't support breaking down by version, setting this field will result in an error.
        """
        self._values = {
            'latency': latency,
        }
        if location is not None: self._values["location"] = location
        if method is not None: self._values["method"] = method
        if version is not None: self._values["version"] = version

    @builtins.property
    def latency(self) -> typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThresholdBasicSliPerformanceLatency"]:
        """latency block."""
        return self._values.get('latency')

    @builtins.property
    def location(self) -> typing.Optional[typing.List[str]]:
        """An optional set of locations to which this SLI is relevant.

        Telemetry from other locations will not be used to calculate
        performance for this SLI. If omitted, this SLI applies to all
        locations in which the Service has activity. For service types
        that don't support breaking down by location, setting this
        field will result in an error.
        """
        return self._values.get('location')

    @builtins.property
    def method(self) -> typing.Optional[typing.List[str]]:
        """An optional set of RPCs to which this SLI is relevant.

        Telemetry from other methods will not be used to calculate
        performance for this SLI. If omitted, this SLI applies to all
        the Service's methods. For service types that don't support
        breaking down by method, setting this field will result in an
        error.
        """
        return self._values.get('method')

    @builtins.property
    def version(self) -> typing.Optional[typing.List[str]]:
        """The set of API versions to which this SLI is relevant.

        Telemetry from other API versions will not be used to
        calculate performance for this SLI. If omitted,
        this SLI applies to all API versions. For service types
        that don't support breaking down by version, setting this
        field will result in an error.
        """
        return self._values.get('version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloWindowsBasedSliGoodTotalRatioThresholdBasicSliPerformance(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloWindowsBasedSliGoodTotalRatioThresholdBasicSliPerformanceLatency", jsii_struct_bases=[], name_mapping={'threshold': 'threshold'})
class MonitoringSloWindowsBasedSliGoodTotalRatioThresholdBasicSliPerformanceLatency():
    def __init__(self, *, threshold: str) -> None:
        """
        :param threshold: A duration string, e.g. 10s. Good service is defined to be the count of requests made to this service that return in no more than threshold.
        """
        self._values = {
            'threshold': threshold,
        }

    @builtins.property
    def threshold(self) -> str:
        """A duration string, e.g. 10s. Good service is defined to be the count of requests made to this service that return in no more than threshold."""
        return self._values.get('threshold')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloWindowsBasedSliGoodTotalRatioThresholdBasicSliPerformanceLatency(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformance", jsii_struct_bases=[], name_mapping={'distribution_cut': 'distributionCut', 'good_total_ratio': 'goodTotalRatio'})
class MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformance():
    def __init__(self, *, distribution_cut: typing.Optional[typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceDistributionCut"]]=None, good_total_ratio: typing.Optional[typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceGoodTotalRatio"]]=None) -> None:
        """
        :param distribution_cut: distribution_cut block.
        :param good_total_ratio: good_total_ratio block.
        """
        self._values = {
        }
        if distribution_cut is not None: self._values["distribution_cut"] = distribution_cut
        if good_total_ratio is not None: self._values["good_total_ratio"] = good_total_ratio

    @builtins.property
    def distribution_cut(self) -> typing.Optional[typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceDistributionCut"]]:
        """distribution_cut block."""
        return self._values.get('distribution_cut')

    @builtins.property
    def good_total_ratio(self) -> typing.Optional[typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceGoodTotalRatio"]]:
        """good_total_ratio block."""
        return self._values.get('good_total_ratio')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformance(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceDistributionCut", jsii_struct_bases=[], name_mapping={'distribution_filter': 'distributionFilter', 'range': 'range'})
class MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceDistributionCut():
    def __init__(self, *, distribution_filter: str, range: typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceDistributionCutRange"]) -> None:
        """
        :param distribution_filter: A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ aggregating values to quantify the good service provided. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
        :param range: range block.
        """
        self._values = {
            'distribution_filter': distribution_filter,
            'range': range,
        }

    @builtins.property
    def distribution_filter(self) -> str:
        """A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ aggregating values to quantify the good service provided.

        Must have ValueType = DISTRIBUTION and
        MetricKind = DELTA or MetricKind = CUMULATIVE.
        """
        return self._values.get('distribution_filter')

    @builtins.property
    def range(self) -> typing.List["MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceDistributionCutRange"]:
        """range block."""
        return self._values.get('range')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceDistributionCut(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceDistributionCutRange", jsii_struct_bases=[], name_mapping={'max': 'max', 'min': 'min'})
class MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceDistributionCutRange():
    def __init__(self, *, max: typing.Optional[jsii.Number]=None, min: typing.Optional[jsii.Number]=None) -> None:
        """
        :param max: max value for the range (inclusive). If not given, will be set to "infinity", defining an open range ">= range.min"
        :param min: Min value for the range (inclusive). If not given, will be set to "-infinity", defining an open range "< range.max"
        """
        self._values = {
        }
        if max is not None: self._values["max"] = max
        if min is not None: self._values["min"] = min

    @builtins.property
    def max(self) -> typing.Optional[jsii.Number]:
        """max value for the range (inclusive).

        If not given,
        will be set to "infinity", defining an open range
        ">= range.min"
        """
        return self._values.get('max')

    @builtins.property
    def min(self) -> typing.Optional[jsii.Number]:
        """Min value for the range (inclusive).

        If not given,
        will be set to "-infinity", defining an open range
        "< range.max"
        """
        return self._values.get('min')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceDistributionCutRange(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceGoodTotalRatio", jsii_struct_bases=[], name_mapping={'bad_service_filter': 'badServiceFilter', 'good_service_filter': 'goodServiceFilter', 'total_service_filter': 'totalServiceFilter'})
class MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceGoodTotalRatio():
    def __init__(self, *, bad_service_filter: typing.Optional[str]=None, good_service_filter: typing.Optional[str]=None, total_service_filter: typing.Optional[str]=None) -> None:
        """
        :param bad_service_filter: A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ quantifying bad service provided, either demanded service that was not provided or demanded service that was of inadequate quality. Exactly two of good, bad, or total service filter must be defined (where good + bad = total is assumed). Must have ValueType = DOUBLE or ValueType = INT64 and must have MetricKind = DELTA or MetricKind = CUMULATIVE.
        :param good_service_filter: A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ quantifying good service provided. Exactly two of good, bad, or total service filter must be defined (where good + bad = total is assumed). Must have ValueType = DOUBLE or ValueType = INT64 and must have MetricKind = DELTA or MetricKind = CUMULATIVE.
        :param total_service_filter: A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ quantifying total demanded service. Exactly two of good, bad, or total service filter must be defined (where good + bad = total is assumed). Must have ValueType = DOUBLE or ValueType = INT64 and must have MetricKind = DELTA or MetricKind = CUMULATIVE.
        """
        self._values = {
        }
        if bad_service_filter is not None: self._values["bad_service_filter"] = bad_service_filter
        if good_service_filter is not None: self._values["good_service_filter"] = good_service_filter
        if total_service_filter is not None: self._values["total_service_filter"] = total_service_filter

    @builtins.property
    def bad_service_filter(self) -> typing.Optional[str]:
        """A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ quantifying bad service provided, either demanded service that was not provided or demanded service that was of inadequate quality. Exactly two of good, bad, or total service filter must be defined (where good + bad = total is assumed).

        Must have ValueType = DOUBLE or ValueType = INT64 and
        must have MetricKind = DELTA or MetricKind = CUMULATIVE.
        """
        return self._values.get('bad_service_filter')

    @builtins.property
    def good_service_filter(self) -> typing.Optional[str]:
        """A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ quantifying good service provided. Exactly two of good, bad, or total service filter must be defined (where good + bad = total is assumed).

        Must have ValueType = DOUBLE or ValueType = INT64 and
        must have MetricKind = DELTA or MetricKind = CUMULATIVE.
        """
        return self._values.get('good_service_filter')

    @builtins.property
    def total_service_filter(self) -> typing.Optional[str]:
        """A TimeSeries `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ quantifying total demanded service. Exactly two of good, bad, or total service filter must be defined (where good + bad = total is assumed).

        Must have ValueType = DOUBLE or ValueType = INT64 and
        must have MetricKind = DELTA or MetricKind = CUMULATIVE.
        """
        return self._values.get('total_service_filter')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceGoodTotalRatio(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloWindowsBasedSliMetricMeanInRange", jsii_struct_bases=[], name_mapping={'range': 'range', 'time_series': 'timeSeries'})
class MonitoringSloWindowsBasedSliMetricMeanInRange():
    def __init__(self, *, range: typing.List["MonitoringSloWindowsBasedSliMetricMeanInRangeRange"], time_series: str) -> None:
        """
        :param range: range block.
        :param time_series: A `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ specifying the TimeSeries to use for evaluating window The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. Mean value 'X' should satisfy 'range.min <= X < range.max' under good service.
        """
        self._values = {
            'range': range,
            'time_series': time_series,
        }

    @builtins.property
    def range(self) -> typing.List["MonitoringSloWindowsBasedSliMetricMeanInRangeRange"]:
        """range block."""
        return self._values.get('range')

    @builtins.property
    def time_series(self) -> str:
        """A `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ specifying the TimeSeries to use for evaluating window The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. Mean value 'X' should satisfy 'range.min <= X < range.max' under good service."""
        return self._values.get('time_series')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloWindowsBasedSliMetricMeanInRange(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloWindowsBasedSliMetricMeanInRangeRange", jsii_struct_bases=[], name_mapping={'max': 'max', 'min': 'min'})
class MonitoringSloWindowsBasedSliMetricMeanInRangeRange():
    def __init__(self, *, max: typing.Optional[jsii.Number]=None, min: typing.Optional[jsii.Number]=None) -> None:
        """
        :param max: max value for the range (inclusive). If not given, will be set to "infinity", defining an open range ">= range.min"
        :param min: Min value for the range (inclusive). If not given, will be set to "-infinity", defining an open range "< range.max"
        """
        self._values = {
        }
        if max is not None: self._values["max"] = max
        if min is not None: self._values["min"] = min

    @builtins.property
    def max(self) -> typing.Optional[jsii.Number]:
        """max value for the range (inclusive).

        If not given,
        will be set to "infinity", defining an open range
        ">= range.min"
        """
        return self._values.get('max')

    @builtins.property
    def min(self) -> typing.Optional[jsii.Number]:
        """Min value for the range (inclusive).

        If not given,
        will be set to "-infinity", defining an open range
        "< range.max"
        """
        return self._values.get('min')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloWindowsBasedSliMetricMeanInRangeRange(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloWindowsBasedSliMetricSumInRange", jsii_struct_bases=[], name_mapping={'range': 'range', 'time_series': 'timeSeries'})
class MonitoringSloWindowsBasedSliMetricSumInRange():
    def __init__(self, *, range: typing.List["MonitoringSloWindowsBasedSliMetricSumInRangeRange"], time_series: str) -> None:
        """
        :param range: range block.
        :param time_series: A `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ specifying the TimeSeries to use for evaluating window quality. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. Summed value 'X' should satisfy 'range.min <= X < range.max' for a good window.
        """
        self._values = {
            'range': range,
            'time_series': time_series,
        }

    @builtins.property
    def range(self) -> typing.List["MonitoringSloWindowsBasedSliMetricSumInRangeRange"]:
        """range block."""
        return self._values.get('range')

    @builtins.property
    def time_series(self) -> str:
        """A `monitoring filter <https://cloud.google.com/monitoring/api/v3/filters>`_ specifying the TimeSeries to use for evaluating window quality. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE.

        Summed value 'X' should satisfy
        'range.min <= X < range.max' for a good window.
        """
        return self._values.get('time_series')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloWindowsBasedSliMetricSumInRange(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringSloWindowsBasedSliMetricSumInRangeRange", jsii_struct_bases=[], name_mapping={'max': 'max', 'min': 'min'})
class MonitoringSloWindowsBasedSliMetricSumInRangeRange():
    def __init__(self, *, max: typing.Optional[jsii.Number]=None, min: typing.Optional[jsii.Number]=None) -> None:
        """
        :param max: max value for the range (inclusive). If not given, will be set to "infinity", defining an open range ">= range.min"
        :param min: Min value for the range (inclusive). If not given, will be set to "-infinity", defining an open range "< range.max"
        """
        self._values = {
        }
        if max is not None: self._values["max"] = max
        if min is not None: self._values["min"] = min

    @builtins.property
    def max(self) -> typing.Optional[jsii.Number]:
        """max value for the range (inclusive).

        If not given,
        will be set to "infinity", defining an open range
        ">= range.min"
        """
        return self._values.get('max')

    @builtins.property
    def min(self) -> typing.Optional[jsii.Number]:
        """Min value for the range (inclusive).

        If not given,
        will be set to "-infinity", defining an open range
        "< range.max"
        """
        return self._values.get('min')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringSloWindowsBasedSliMetricSumInRangeRange(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class MonitoringUptimeCheckConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.MonitoringUptimeCheckConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, display_name: str, timeout: str, content_matchers: typing.Optional[typing.List["MonitoringUptimeCheckConfigContentMatchers"]]=None, http_check: typing.Optional[typing.List["MonitoringUptimeCheckConfigHttpCheck"]]=None, internal_checkers: typing.Optional[typing.List["MonitoringUptimeCheckConfigInternalCheckers"]]=None, is_internal: typing.Optional[bool]=None, monitored_resource: typing.Optional[typing.List["MonitoringUptimeCheckConfigMonitoredResource"]]=None, period: typing.Optional[str]=None, project: typing.Optional[str]=None, resource_group: typing.Optional[typing.List["MonitoringUptimeCheckConfigResourceGroup"]]=None, selected_regions: typing.Optional[typing.List[str]]=None, tcp_check: typing.Optional[typing.List["MonitoringUptimeCheckConfigTcpCheck"]]=None, timeouts: typing.Optional["MonitoringUptimeCheckConfigTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: A human-friendly name for the uptime check configuration. The display name should be unique within a Stackdriver Workspace in order to make it easier to identify; however, uniqueness is not enforced.
        :param timeout: The maximum amount of time to wait for the request to complete (must be between 1 and 60 seconds). Accepted formats https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Duration
        :param content_matchers: content_matchers block.
        :param http_check: http_check block.
        :param internal_checkers: internal_checkers block.
        :param is_internal: 
        :param monitored_resource: monitored_resource block.
        :param period: How often, in seconds, the uptime check is performed. Currently, the only supported values are 60s (1 minute), 300s (5 minutes), 600s (10 minutes), and 900s (15 minutes). Optional, defaults to 300s.
        :param project: 
        :param resource_group: resource_group block.
        :param selected_regions: The list of regions from which the check will be run. Some regions contain one location, and others contain more than one. If this field is specified, enough regions to include a minimum of 3 locations must be provided, or an error message is returned. Not specifying this field will result in uptime checks running from all regions.
        :param tcp_check: tcp_check block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = MonitoringUptimeCheckConfigConfig(display_name=display_name, timeout=timeout, content_matchers=content_matchers, http_check=http_check, internal_checkers=internal_checkers, is_internal=is_internal, monitored_resource=monitored_resource, period=period, project=project, resource_group=resource_group, selected_regions=selected_regions, tcp_check=tcp_check, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(MonitoringUptimeCheckConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="uptimeCheckId")
    def uptime_check_id(self) -> str:
        return jsii.get(self, "uptimeCheckId")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="timeout")
    def timeout(self) -> str:
        return jsii.get(self, "timeout")

    @timeout.setter
    def timeout(self, value: str) -> None:
        jsii.set(self, "timeout", value)

    @builtins.property
    @jsii.member(jsii_name="contentMatchers")
    def content_matchers(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigContentMatchers"]]:
        return jsii.get(self, "contentMatchers")

    @content_matchers.setter
    def content_matchers(self, value: typing.Optional[typing.List["MonitoringUptimeCheckConfigContentMatchers"]]) -> None:
        jsii.set(self, "contentMatchers", value)

    @builtins.property
    @jsii.member(jsii_name="httpCheck")
    def http_check(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigHttpCheck"]]:
        return jsii.get(self, "httpCheck")

    @http_check.setter
    def http_check(self, value: typing.Optional[typing.List["MonitoringUptimeCheckConfigHttpCheck"]]) -> None:
        jsii.set(self, "httpCheck", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="internalCheckers")
    def internal_checkers(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigInternalCheckers"]]:
        return jsii.get(self, "internalCheckers")

    @internal_checkers.setter
    def internal_checkers(self, value: typing.Optional[typing.List["MonitoringUptimeCheckConfigInternalCheckers"]]) -> None:
        jsii.set(self, "internalCheckers", value)

    @builtins.property
    @jsii.member(jsii_name="isInternal")
    def is_internal(self) -> typing.Optional[bool]:
        return jsii.get(self, "isInternal")

    @is_internal.setter
    def is_internal(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "isInternal", value)

    @builtins.property
    @jsii.member(jsii_name="monitoredResource")
    def monitored_resource(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigMonitoredResource"]]:
        return jsii.get(self, "monitoredResource")

    @monitored_resource.setter
    def monitored_resource(self, value: typing.Optional[typing.List["MonitoringUptimeCheckConfigMonitoredResource"]]) -> None:
        jsii.set(self, "monitoredResource", value)

    @builtins.property
    @jsii.member(jsii_name="period")
    def period(self) -> typing.Optional[str]:
        return jsii.get(self, "period")

    @period.setter
    def period(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "period", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="resourceGroup")
    def resource_group(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigResourceGroup"]]:
        return jsii.get(self, "resourceGroup")

    @resource_group.setter
    def resource_group(self, value: typing.Optional[typing.List["MonitoringUptimeCheckConfigResourceGroup"]]) -> None:
        jsii.set(self, "resourceGroup", value)

    @builtins.property
    @jsii.member(jsii_name="selectedRegions")
    def selected_regions(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "selectedRegions")

    @selected_regions.setter
    def selected_regions(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "selectedRegions", value)

    @builtins.property
    @jsii.member(jsii_name="tcpCheck")
    def tcp_check(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigTcpCheck"]]:
        return jsii.get(self, "tcpCheck")

    @tcp_check.setter
    def tcp_check(self, value: typing.Optional[typing.List["MonitoringUptimeCheckConfigTcpCheck"]]) -> None:
        jsii.set(self, "tcpCheck", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["MonitoringUptimeCheckConfigTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["MonitoringUptimeCheckConfigTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringUptimeCheckConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'display_name': 'displayName', 'timeout': 'timeout', 'content_matchers': 'contentMatchers', 'http_check': 'httpCheck', 'internal_checkers': 'internalCheckers', 'is_internal': 'isInternal', 'monitored_resource': 'monitoredResource', 'period': 'period', 'project': 'project', 'resource_group': 'resourceGroup', 'selected_regions': 'selectedRegions', 'tcp_check': 'tcpCheck', 'timeouts': 'timeouts'})
class MonitoringUptimeCheckConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, display_name: str, timeout: str, content_matchers: typing.Optional[typing.List["MonitoringUptimeCheckConfigContentMatchers"]]=None, http_check: typing.Optional[typing.List["MonitoringUptimeCheckConfigHttpCheck"]]=None, internal_checkers: typing.Optional[typing.List["MonitoringUptimeCheckConfigInternalCheckers"]]=None, is_internal: typing.Optional[bool]=None, monitored_resource: typing.Optional[typing.List["MonitoringUptimeCheckConfigMonitoredResource"]]=None, period: typing.Optional[str]=None, project: typing.Optional[str]=None, resource_group: typing.Optional[typing.List["MonitoringUptimeCheckConfigResourceGroup"]]=None, selected_regions: typing.Optional[typing.List[str]]=None, tcp_check: typing.Optional[typing.List["MonitoringUptimeCheckConfigTcpCheck"]]=None, timeouts: typing.Optional["MonitoringUptimeCheckConfigTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: A human-friendly name for the uptime check configuration. The display name should be unique within a Stackdriver Workspace in order to make it easier to identify; however, uniqueness is not enforced.
        :param timeout: The maximum amount of time to wait for the request to complete (must be between 1 and 60 seconds). Accepted formats https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Duration
        :param content_matchers: content_matchers block.
        :param http_check: http_check block.
        :param internal_checkers: internal_checkers block.
        :param is_internal: 
        :param monitored_resource: monitored_resource block.
        :param period: How often, in seconds, the uptime check is performed. Currently, the only supported values are 60s (1 minute), 300s (5 minutes), 600s (10 minutes), and 900s (15 minutes). Optional, defaults to 300s.
        :param project: 
        :param resource_group: resource_group block.
        :param selected_regions: The list of regions from which the check will be run. Some regions contain one location, and others contain more than one. If this field is specified, enough regions to include a minimum of 3 locations must be provided, or an error message is returned. Not specifying this field will result in uptime checks running from all regions.
        :param tcp_check: tcp_check block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = MonitoringUptimeCheckConfigTimeouts(**timeouts)
        self._values = {
            'display_name': display_name,
            'timeout': timeout,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if content_matchers is not None: self._values["content_matchers"] = content_matchers
        if http_check is not None: self._values["http_check"] = http_check
        if internal_checkers is not None: self._values["internal_checkers"] = internal_checkers
        if is_internal is not None: self._values["is_internal"] = is_internal
        if monitored_resource is not None: self._values["monitored_resource"] = monitored_resource
        if period is not None: self._values["period"] = period
        if project is not None: self._values["project"] = project
        if resource_group is not None: self._values["resource_group"] = resource_group
        if selected_regions is not None: self._values["selected_regions"] = selected_regions
        if tcp_check is not None: self._values["tcp_check"] = tcp_check
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def display_name(self) -> str:
        """A human-friendly name for the uptime check configuration.

        The display name should be unique within a Stackdriver Workspace in order to make it easier to identify; however, uniqueness is not enforced.
        """
        return self._values.get('display_name')

    @builtins.property
    def timeout(self) -> str:
        """The maximum amount of time to wait for the request to complete (must be between 1 and 60 seconds).

        Accepted formats https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Duration
        """
        return self._values.get('timeout')

    @builtins.property
    def content_matchers(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigContentMatchers"]]:
        """content_matchers block."""
        return self._values.get('content_matchers')

    @builtins.property
    def http_check(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigHttpCheck"]]:
        """http_check block."""
        return self._values.get('http_check')

    @builtins.property
    def internal_checkers(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigInternalCheckers"]]:
        """internal_checkers block."""
        return self._values.get('internal_checkers')

    @builtins.property
    def is_internal(self) -> typing.Optional[bool]:
        return self._values.get('is_internal')

    @builtins.property
    def monitored_resource(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigMonitoredResource"]]:
        """monitored_resource block."""
        return self._values.get('monitored_resource')

    @builtins.property
    def period(self) -> typing.Optional[str]:
        """How often, in seconds, the uptime check is performed.

        Currently, the only supported values are 60s (1 minute), 300s (5 minutes), 600s (10 minutes), and 900s (15 minutes). Optional, defaults to 300s.
        """
        return self._values.get('period')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def resource_group(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigResourceGroup"]]:
        """resource_group block."""
        return self._values.get('resource_group')

    @builtins.property
    def selected_regions(self) -> typing.Optional[typing.List[str]]:
        """The list of regions from which the check will be run.

        Some regions contain one location, and others contain more than one. If this field is specified, enough regions to include a minimum of 3 locations must be provided, or an error message is returned. Not specifying this field will result in uptime checks running from all regions.
        """
        return self._values.get('selected_regions')

    @builtins.property
    def tcp_check(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigTcpCheck"]]:
        """tcp_check block."""
        return self._values.get('tcp_check')

    @builtins.property
    def timeouts(self) -> typing.Optional["MonitoringUptimeCheckConfigTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringUptimeCheckConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringUptimeCheckConfigContentMatchers", jsii_struct_bases=[], name_mapping={'content': 'content', 'matcher': 'matcher'})
class MonitoringUptimeCheckConfigContentMatchers():
    def __init__(self, *, content: str, matcher: typing.Optional[str]=None) -> None:
        """
        :param content: String or regex content to match (max 1024 bytes).
        :param matcher: The type of content matcher that will be applied to the server output, compared to the content string when the check is run. Default value: "CONTAINS_STRING" Possible values: ["CONTAINS_STRING", "NOT_CONTAINS_STRING", "MATCHES_REGEX", "NON_MATCHES_REGEX"]
        """
        self._values = {
            'content': content,
        }
        if matcher is not None: self._values["matcher"] = matcher

    @builtins.property
    def content(self) -> str:
        """String or regex content to match (max 1024 bytes)."""
        return self._values.get('content')

    @builtins.property
    def matcher(self) -> typing.Optional[str]:
        """The type of content matcher that will be applied to the server output, compared to the content string when the check is run.

        Default value: "CONTAINS_STRING" Possible values: ["CONTAINS_STRING", "NOT_CONTAINS_STRING", "MATCHES_REGEX", "NON_MATCHES_REGEX"]
        """
        return self._values.get('matcher')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringUptimeCheckConfigContentMatchers(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringUptimeCheckConfigHttpCheck", jsii_struct_bases=[], name_mapping={'auth_info': 'authInfo', 'body': 'body', 'content_type': 'contentType', 'headers': 'headers', 'mask_headers': 'maskHeaders', 'path': 'path', 'port': 'port', 'request_method': 'requestMethod', 'use_ssl': 'useSsl', 'validate_ssl': 'validateSsl'})
class MonitoringUptimeCheckConfigHttpCheck():
    def __init__(self, *, auth_info: typing.Optional[typing.List["MonitoringUptimeCheckConfigHttpCheckAuthInfo"]]=None, body: typing.Optional[str]=None, content_type: typing.Optional[str]=None, headers: typing.Optional[typing.Mapping[str, str]]=None, mask_headers: typing.Optional[bool]=None, path: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, request_method: typing.Optional[str]=None, use_ssl: typing.Optional[bool]=None, validate_ssl: typing.Optional[bool]=None) -> None:
        """
        :param auth_info: auth_info block.
        :param body: The request body associated with the HTTP POST request. If contentType is URL_ENCODED, the body passed in must be URL-encoded. Users can provide a Content-Length header via the headers field or the API will do so. If the requestMethod is GET and body is not empty, the API will return an error. The maximum byte size is 1 megabyte. Note - As with all bytes fields JSON representations are base64 encoded. e.g. "foo=bar" in URL-encoded form is "foo%3Dbar" and in base64 encoding is "Zm9vJTI1M0RiYXI=".
        :param content_type: The content type to use for the check. Possible values: ["TYPE_UNSPECIFIED", "URL_ENCODED"]
        :param headers: The list of headers to send as part of the uptime check request. If two headers have the same key and different values, they should be entered as a single header, with the value being a comma-separated list of all the desired values as described at https://www.w3.org/Protocols/rfc2616/rfc2616.txt (page 31). Entering two separate headers with the same key in a Create call will cause the first to be overwritten by the second. The maximum number of headers allowed is 100.
        :param mask_headers: Boolean specifying whether to encrypt the header information. Encryption should be specified for any headers related to authentication that you do not wish to be seen when retrieving the configuration. The server will be responsible for encrypting the headers. On Get/List calls, if mask_headers is set to True then the headers will be obscured with ******.
        :param path: The path to the page to run the check against. Will be combined with the host (specified within the MonitoredResource) and port to construct the full URL. Optional (defaults to "/").
        :param port: The port to the page to run the check against. Will be combined with host (specified within the MonitoredResource) and path to construct the full URL. Optional (defaults to 80 without SSL, or 443 with SSL).
        :param request_method: The HTTP request method to use for the check. If set to METHOD_UNSPECIFIED then requestMethod defaults to GET. Default value: "GET" Possible values: ["METHOD_UNSPECIFIED", "GET", "POST"]
        :param use_ssl: If true, use HTTPS instead of HTTP to run the check.
        :param validate_ssl: Boolean specifying whether to include SSL certificate validation as a part of the Uptime check. Only applies to checks where monitoredResource is set to uptime_url. If useSsl is false, setting validateSsl to true has no effect.
        """
        self._values = {
        }
        if auth_info is not None: self._values["auth_info"] = auth_info
        if body is not None: self._values["body"] = body
        if content_type is not None: self._values["content_type"] = content_type
        if headers is not None: self._values["headers"] = headers
        if mask_headers is not None: self._values["mask_headers"] = mask_headers
        if path is not None: self._values["path"] = path
        if port is not None: self._values["port"] = port
        if request_method is not None: self._values["request_method"] = request_method
        if use_ssl is not None: self._values["use_ssl"] = use_ssl
        if validate_ssl is not None: self._values["validate_ssl"] = validate_ssl

    @builtins.property
    def auth_info(self) -> typing.Optional[typing.List["MonitoringUptimeCheckConfigHttpCheckAuthInfo"]]:
        """auth_info block."""
        return self._values.get('auth_info')

    @builtins.property
    def body(self) -> typing.Optional[str]:
        """The request body associated with the HTTP POST request.

        If contentType is URL_ENCODED, the body passed in must be URL-encoded. Users can provide a Content-Length header via the headers field or the API will do so. If the requestMethod is GET and body is not empty, the API will return an error. The maximum byte size is 1 megabyte. Note - As with all bytes fields JSON representations are base64 encoded. e.g. "foo=bar" in URL-encoded form is "foo%3Dbar" and in base64 encoding is "Zm9vJTI1M0RiYXI=".
        """
        return self._values.get('body')

    @builtins.property
    def content_type(self) -> typing.Optional[str]:
        """The content type to use for the check.

        Possible values: ["TYPE_UNSPECIFIED", "URL_ENCODED"]
        """
        return self._values.get('content_type')

    @builtins.property
    def headers(self) -> typing.Optional[typing.Mapping[str, str]]:
        """The list of headers to send as part of the uptime check request.

        If two headers have the same key and different values, they should be entered as a single header, with the value being a comma-separated list of all the desired values as described at https://www.w3.org/Protocols/rfc2616/rfc2616.txt (page 31). Entering two separate headers with the same key in a Create call will cause the first to be overwritten by the second. The maximum number of headers allowed is 100.
        """
        return self._values.get('headers')

    @builtins.property
    def mask_headers(self) -> typing.Optional[bool]:
        """Boolean specifying whether to encrypt the header information.

        Encryption should be specified for any headers related to authentication that you do not wish to be seen when retrieving the configuration. The server will be responsible for encrypting the headers. On Get/List calls, if mask_headers is set to True then the headers will be obscured with ******.
        """
        return self._values.get('mask_headers')

    @builtins.property
    def path(self) -> typing.Optional[str]:
        """The path to the page to run the check against.

        Will be combined with the host (specified within the MonitoredResource) and port to construct the full URL. Optional (defaults to "/").
        """
        return self._values.get('path')

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The port to the page to run the check against.

        Will be combined with host (specified within the MonitoredResource) and path to construct the full URL. Optional (defaults to 80 without SSL, or 443 with SSL).
        """
        return self._values.get('port')

    @builtins.property
    def request_method(self) -> typing.Optional[str]:
        """The HTTP request method to use for the check.

        If set to METHOD_UNSPECIFIED then requestMethod defaults to GET. Default value: "GET" Possible values: ["METHOD_UNSPECIFIED", "GET", "POST"]
        """
        return self._values.get('request_method')

    @builtins.property
    def use_ssl(self) -> typing.Optional[bool]:
        """If true, use HTTPS instead of HTTP to run the check."""
        return self._values.get('use_ssl')

    @builtins.property
    def validate_ssl(self) -> typing.Optional[bool]:
        """Boolean specifying whether to include SSL certificate validation as a part of the Uptime check.

        Only applies to checks where monitoredResource is set to uptime_url. If useSsl is false, setting validateSsl to true has no effect.
        """
        return self._values.get('validate_ssl')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringUptimeCheckConfigHttpCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringUptimeCheckConfigHttpCheckAuthInfo", jsii_struct_bases=[], name_mapping={'password': 'password', 'username': 'username'})
class MonitoringUptimeCheckConfigHttpCheckAuthInfo():
    def __init__(self, *, password: str, username: str) -> None:
        """
        :param password: The password to authenticate.
        :param username: The username to authenticate.
        """
        self._values = {
            'password': password,
            'username': username,
        }

    @builtins.property
    def password(self) -> str:
        """The password to authenticate."""
        return self._values.get('password')

    @builtins.property
    def username(self) -> str:
        """The username to authenticate."""
        return self._values.get('username')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringUptimeCheckConfigHttpCheckAuthInfo(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringUptimeCheckConfigInternalCheckers", jsii_struct_bases=[], name_mapping={'display_name': 'displayName', 'gcp_zone': 'gcpZone', 'name': 'name', 'network': 'network', 'peer_project_id': 'peerProjectId'})
class MonitoringUptimeCheckConfigInternalCheckers():
    def __init__(self, *, display_name: typing.Optional[str]=None, gcp_zone: typing.Optional[str]=None, name: typing.Optional[str]=None, network: typing.Optional[str]=None, peer_project_id: typing.Optional[str]=None) -> None:
        """
        :param display_name: 
        :param gcp_zone: 
        :param name: 
        :param network: 
        :param peer_project_id: 
        """
        self._values = {
        }
        if display_name is not None: self._values["display_name"] = display_name
        if gcp_zone is not None: self._values["gcp_zone"] = gcp_zone
        if name is not None: self._values["name"] = name
        if network is not None: self._values["network"] = network
        if peer_project_id is not None: self._values["peer_project_id"] = peer_project_id

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        return self._values.get('display_name')

    @builtins.property
    def gcp_zone(self) -> typing.Optional[str]:
        return self._values.get('gcp_zone')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        return self._values.get('name')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        return self._values.get('network')

    @builtins.property
    def peer_project_id(self) -> typing.Optional[str]:
        return self._values.get('peer_project_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringUptimeCheckConfigInternalCheckers(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringUptimeCheckConfigMonitoredResource", jsii_struct_bases=[], name_mapping={'labels': 'labels', 'type': 'type'})
class MonitoringUptimeCheckConfigMonitoredResource():
    def __init__(self, *, labels: typing.Mapping[str, str], type: str) -> None:
        """
        :param labels: Values for all of the labels listed in the associated monitored resource descriptor. For example, Compute Engine VM instances use the labels "project_id", "instance_id", and "zone".
        :param type: The monitored resource type. This field must match the type field of a MonitoredResourceDescriptor (https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.monitoredResourceDescriptors#MonitoredResourceDescriptor) object. For example, the type of a Compute Engine VM instance is gce_instance. For a list of types, see Monitoring resource types (https://cloud.google.com/monitoring/api/resources) and Logging resource types (https://cloud.google.com/logging/docs/api/v2/resource-list).
        """
        self._values = {
            'labels': labels,
            'type': type,
        }

    @builtins.property
    def labels(self) -> typing.Mapping[str, str]:
        """Values for all of the labels listed in the associated monitored resource descriptor.

        For example, Compute Engine VM instances use the labels "project_id", "instance_id", and "zone".
        """
        return self._values.get('labels')

    @builtins.property
    def type(self) -> str:
        """The monitored resource type.

        This field must match the type field of a MonitoredResourceDescriptor (https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.monitoredResourceDescriptors#MonitoredResourceDescriptor) object. For example, the type of a Compute Engine VM instance is gce_instance. For a list of types, see Monitoring resource types (https://cloud.google.com/monitoring/api/resources) and Logging resource types (https://cloud.google.com/logging/docs/api/v2/resource-list).
        """
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringUptimeCheckConfigMonitoredResource(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringUptimeCheckConfigResourceGroup", jsii_struct_bases=[], name_mapping={'group_id': 'groupId', 'resource_type': 'resourceType'})
class MonitoringUptimeCheckConfigResourceGroup():
    def __init__(self, *, group_id: typing.Optional[str]=None, resource_type: typing.Optional[str]=None) -> None:
        """
        :param group_id: The group of resources being monitored. Should be the 'name' of a group
        :param resource_type: The resource type of the group members. Possible values: ["RESOURCE_TYPE_UNSPECIFIED", "INSTANCE", "AWS_ELB_LOAD_BALANCER"]
        """
        self._values = {
        }
        if group_id is not None: self._values["group_id"] = group_id
        if resource_type is not None: self._values["resource_type"] = resource_type

    @builtins.property
    def group_id(self) -> typing.Optional[str]:
        """The group of resources being monitored.

        Should be the 'name' of a group
        """
        return self._values.get('group_id')

    @builtins.property
    def resource_type(self) -> typing.Optional[str]:
        """The resource type of the group members.

        Possible values: ["RESOURCE_TYPE_UNSPECIFIED", "INSTANCE", "AWS_ELB_LOAD_BALANCER"]
        """
        return self._values.get('resource_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringUptimeCheckConfigResourceGroup(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringUptimeCheckConfigTcpCheck", jsii_struct_bases=[], name_mapping={'port': 'port'})
class MonitoringUptimeCheckConfigTcpCheck():
    def __init__(self, *, port: jsii.Number) -> None:
        """
        :param port: The port to the page to run the check against. Will be combined with host (specified within the MonitoredResource) to construct the full URL.
        """
        self._values = {
            'port': port,
        }

    @builtins.property
    def port(self) -> jsii.Number:
        """The port to the page to run the check against.

        Will be combined with host (specified within the MonitoredResource) to construct the full URL.
        """
        return self._values.get('port')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringUptimeCheckConfigTcpCheck(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.MonitoringUptimeCheckConfigTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class MonitoringUptimeCheckConfigTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'MonitoringUptimeCheckConfigTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class NetworkManagementConnectivityTest(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.NetworkManagementConnectivityTest"):
    def __init__(self, scope: constructs.Construct, id: str, *, destination: typing.List["NetworkManagementConnectivityTestDestination"], name: str, source: typing.List["NetworkManagementConnectivityTestSource"], description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, protocol: typing.Optional[str]=None, related_projects: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["NetworkManagementConnectivityTestTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param destination: destination block.
        :param name: Unique name for the connectivity test.
        :param source: source block.
        :param description: The user-supplied description of the Connectivity Test. Maximum of 512 characters.
        :param labels: Resource labels to represent user-provided metadata.
        :param project: 
        :param protocol: IP Protocol of the test. When not provided, "TCP" is assumed.
        :param related_projects: Other projects that may be relevant for reachability analysis. This is applicable to scenarios where a test can cross project boundaries.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = NetworkManagementConnectivityTestConfig(destination=destination, name=name, source=source, description=description, labels=labels, project=project, protocol=protocol, related_projects=related_projects, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(NetworkManagementConnectivityTest, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="destination")
    def destination(self) -> typing.List["NetworkManagementConnectivityTestDestination"]:
        return jsii.get(self, "destination")

    @destination.setter
    def destination(self, value: typing.List["NetworkManagementConnectivityTestDestination"]) -> None:
        jsii.set(self, "destination", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="source")
    def source(self) -> typing.List["NetworkManagementConnectivityTestSource"]:
        return jsii.get(self, "source")

    @source.setter
    def source(self, value: typing.List["NetworkManagementConnectivityTestSource"]) -> None:
        jsii.set(self, "source", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="protocol")
    def protocol(self) -> typing.Optional[str]:
        return jsii.get(self, "protocol")

    @protocol.setter
    def protocol(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "protocol", value)

    @builtins.property
    @jsii.member(jsii_name="relatedProjects")
    def related_projects(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "relatedProjects")

    @related_projects.setter
    def related_projects(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "relatedProjects", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["NetworkManagementConnectivityTestTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["NetworkManagementConnectivityTestTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.NetworkManagementConnectivityTestConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'destination': 'destination', 'name': 'name', 'source': 'source', 'description': 'description', 'labels': 'labels', 'project': 'project', 'protocol': 'protocol', 'related_projects': 'relatedProjects', 'timeouts': 'timeouts'})
class NetworkManagementConnectivityTestConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, destination: typing.List["NetworkManagementConnectivityTestDestination"], name: str, source: typing.List["NetworkManagementConnectivityTestSource"], description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, protocol: typing.Optional[str]=None, related_projects: typing.Optional[typing.List[str]]=None, timeouts: typing.Optional["NetworkManagementConnectivityTestTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param destination: destination block.
        :param name: Unique name for the connectivity test.
        :param source: source block.
        :param description: The user-supplied description of the Connectivity Test. Maximum of 512 characters.
        :param labels: Resource labels to represent user-provided metadata.
        :param project: 
        :param protocol: IP Protocol of the test. When not provided, "TCP" is assumed.
        :param related_projects: Other projects that may be relevant for reachability analysis. This is applicable to scenarios where a test can cross project boundaries.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = NetworkManagementConnectivityTestTimeouts(**timeouts)
        self._values = {
            'destination': destination,
            'name': name,
            'source': source,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if labels is not None: self._values["labels"] = labels
        if project is not None: self._values["project"] = project
        if protocol is not None: self._values["protocol"] = protocol
        if related_projects is not None: self._values["related_projects"] = related_projects
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def destination(self) -> typing.List["NetworkManagementConnectivityTestDestination"]:
        """destination block."""
        return self._values.get('destination')

    @builtins.property
    def name(self) -> str:
        """Unique name for the connectivity test."""
        return self._values.get('name')

    @builtins.property
    def source(self) -> typing.List["NetworkManagementConnectivityTestSource"]:
        """source block."""
        return self._values.get('source')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """The user-supplied description of the Connectivity Test.

        Maximum of 512 characters.
        """
        return self._values.get('description')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Resource labels to represent user-provided metadata."""
        return self._values.get('labels')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def protocol(self) -> typing.Optional[str]:
        """IP Protocol of the test.

        When not provided, "TCP" is assumed.
        """
        return self._values.get('protocol')

    @builtins.property
    def related_projects(self) -> typing.Optional[typing.List[str]]:
        """Other projects that may be relevant for reachability analysis.

        This is applicable to scenarios where a test can cross project
        boundaries.
        """
        return self._values.get('related_projects')

    @builtins.property
    def timeouts(self) -> typing.Optional["NetworkManagementConnectivityTestTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'NetworkManagementConnectivityTestConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.NetworkManagementConnectivityTestDestination", jsii_struct_bases=[], name_mapping={'instance': 'instance', 'ip_address': 'ipAddress', 'network': 'network', 'port': 'port', 'project_id': 'projectId'})
class NetworkManagementConnectivityTestDestination():
    def __init__(self, *, instance: typing.Optional[str]=None, ip_address: typing.Optional[str]=None, network: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, project_id: typing.Optional[str]=None) -> None:
        """
        :param instance: A Compute Engine instance URI.
        :param ip_address: The IP address of the endpoint, which can be an external or internal IP. An IPv6 address is only allowed when the test's destination is a global load balancer VIP.
        :param network: A Compute Engine network URI.
        :param port: The IP protocol port of the endpoint. Only applicable when protocol is TCP or UDP.
        :param project_id: Project ID where the endpoint is located. The Project ID can be derived from the URI if you provide a VM instance or network URI. The following are two cases where you must provide the project ID: 1. Only the IP address is specified, and the IP address is within a GCP project. 2. When you are using Shared VPC and the IP address that you provide is from the service project. In this case, the network that the IP address resides in is defined in the host project.
        """
        self._values = {
        }
        if instance is not None: self._values["instance"] = instance
        if ip_address is not None: self._values["ip_address"] = ip_address
        if network is not None: self._values["network"] = network
        if port is not None: self._values["port"] = port
        if project_id is not None: self._values["project_id"] = project_id

    @builtins.property
    def instance(self) -> typing.Optional[str]:
        """A Compute Engine instance URI."""
        return self._values.get('instance')

    @builtins.property
    def ip_address(self) -> typing.Optional[str]:
        """The IP address of the endpoint, which can be an external or internal IP.

        An IPv6 address is only allowed when the test's
        destination is a global load balancer VIP.
        """
        return self._values.get('ip_address')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """A Compute Engine network URI."""
        return self._values.get('network')

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The IP protocol port of the endpoint.

        Only applicable when
        protocol is TCP or UDP.
        """
        return self._values.get('port')

    @builtins.property
    def project_id(self) -> typing.Optional[str]:
        """Project ID where the endpoint is located.

        The Project ID can be
        derived from the URI if you provide a VM instance or network URI.
        The following are two cases where you must provide the project ID:

        1. Only the IP address is specified, and the IP address is within
           a GCP project. 2. When you are using Shared VPC and the IP address
           that you provide is from the service project. In this case, the
           network that the IP address resides in is defined in the host
           project.
        """
        return self._values.get('project_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'NetworkManagementConnectivityTestDestination(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.NetworkManagementConnectivityTestSource", jsii_struct_bases=[], name_mapping={'instance': 'instance', 'ip_address': 'ipAddress', 'network': 'network', 'network_type': 'networkType', 'port': 'port', 'project_id': 'projectId'})
class NetworkManagementConnectivityTestSource():
    def __init__(self, *, instance: typing.Optional[str]=None, ip_address: typing.Optional[str]=None, network: typing.Optional[str]=None, network_type: typing.Optional[str]=None, port: typing.Optional[jsii.Number]=None, project_id: typing.Optional[str]=None) -> None:
        """
        :param instance: A Compute Engine instance URI.
        :param ip_address: The IP address of the endpoint, which can be an external or internal IP. An IPv6 address is only allowed when the test's destination is a global load balancer VIP.
        :param network: A Compute Engine network URI.
        :param network_type: Type of the network where the endpoint is located. Possible values: ["GCP_NETWORK", "NON_GCP_NETWORK"]
        :param port: The IP protocol port of the endpoint. Only applicable when protocol is TCP or UDP.
        :param project_id: Project ID where the endpoint is located. The Project ID can be derived from the URI if you provide a VM instance or network URI. The following are two cases where you must provide the project ID: 1. Only the IP address is specified, and the IP address is within a GCP project. 2. When you are using Shared VPC and the IP address that you provide is from the service project. In this case, the network that the IP address resides in is defined in the host project.
        """
        self._values = {
        }
        if instance is not None: self._values["instance"] = instance
        if ip_address is not None: self._values["ip_address"] = ip_address
        if network is not None: self._values["network"] = network
        if network_type is not None: self._values["network_type"] = network_type
        if port is not None: self._values["port"] = port
        if project_id is not None: self._values["project_id"] = project_id

    @builtins.property
    def instance(self) -> typing.Optional[str]:
        """A Compute Engine instance URI."""
        return self._values.get('instance')

    @builtins.property
    def ip_address(self) -> typing.Optional[str]:
        """The IP address of the endpoint, which can be an external or internal IP.

        An IPv6 address is only allowed when the test's
        destination is a global load balancer VIP.
        """
        return self._values.get('ip_address')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """A Compute Engine network URI."""
        return self._values.get('network')

    @builtins.property
    def network_type(self) -> typing.Optional[str]:
        """Type of the network where the endpoint is located.

        Possible values: ["GCP_NETWORK", "NON_GCP_NETWORK"]
        """
        return self._values.get('network_type')

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The IP protocol port of the endpoint.

        Only applicable when
        protocol is TCP or UDP.
        """
        return self._values.get('port')

    @builtins.property
    def project_id(self) -> typing.Optional[str]:
        """Project ID where the endpoint is located.

        The Project ID can be
        derived from the URI if you provide a VM instance or network URI.
        The following are two cases where you must provide the project ID:

        1. Only the IP address is specified, and the IP address is
           within a GCP project.
        2. When you are using Shared VPC and the IP address
           that you provide is from the service project. In this case,
           the network that the IP address resides in is defined in the
           host project.
        """
        return self._values.get('project_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'NetworkManagementConnectivityTestSource(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.NetworkManagementConnectivityTestTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class NetworkManagementConnectivityTestTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'NetworkManagementConnectivityTestTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class OrganizationIamAuditConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.OrganizationIamAuditConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, audit_log_config: typing.List["OrganizationIamAuditConfigAuditLogConfig"], org_id: str, service: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param audit_log_config: audit_log_config block.
        :param org_id: The numeric ID of the organization in which you want to manage the audit logging config.
        :param service: Service which will be enabled for audit logging. The special value allServices covers all services.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = OrganizationIamAuditConfigConfig(audit_log_config=audit_log_config, org_id=org_id, service=service, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(OrganizationIamAuditConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="auditLogConfig")
    def audit_log_config(self) -> typing.List["OrganizationIamAuditConfigAuditLogConfig"]:
        return jsii.get(self, "auditLogConfig")

    @audit_log_config.setter
    def audit_log_config(self, value: typing.List["OrganizationIamAuditConfigAuditLogConfig"]) -> None:
        jsii.set(self, "auditLogConfig", value)

    @builtins.property
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> str:
        return jsii.get(self, "orgId")

    @org_id.setter
    def org_id(self, value: str) -> None:
        jsii.set(self, "orgId", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationIamAuditConfigAuditLogConfig", jsii_struct_bases=[], name_mapping={'log_type': 'logType', 'exempted_members': 'exemptedMembers'})
class OrganizationIamAuditConfigAuditLogConfig():
    def __init__(self, *, log_type: str, exempted_members: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param log_type: Permission type for which logging is to be configured. Must be one of DATA_READ, DATA_WRITE, or ADMIN_READ.
        :param exempted_members: Identities that do not cause logging for this type of permission. Each entry can have one of the following values:user:{emailid}: An email address that represents a specific Google account. For example, alice@gmail.com or joe@example.com. serviceAccount:{emailid}: An email address that represents a service account. For example, my-other-app@appspot.gserviceaccount.com. group:{emailid}: An email address that represents a Google group. For example, admins@example.com. domain:{domain}: A G Suite domain (primary, instead of alias) name that represents all the users of that domain. For example, google.com or example.com.
        """
        self._values = {
            'log_type': log_type,
        }
        if exempted_members is not None: self._values["exempted_members"] = exempted_members

    @builtins.property
    def log_type(self) -> str:
        """Permission type for which logging is to be configured.

        Must be one of DATA_READ, DATA_WRITE, or ADMIN_READ.
        """
        return self._values.get('log_type')

    @builtins.property
    def exempted_members(self) -> typing.Optional[typing.List[str]]:
        """Identities that do not cause logging for this type of permission.

        Each entry can have one of the following values:user:{emailid}: An email address that represents a specific Google account. For example, alice@gmail.com or joe@example.com. serviceAccount:{emailid}: An email address that represents a service account. For example, my-other-app@appspot.gserviceaccount.com. group:{emailid}: An email address that represents a Google group. For example, admins@example.com. domain:{domain}: A G Suite domain (primary, instead of alias) name that represents all the users of that domain. For example, google.com or example.com.
        """
        return self._values.get('exempted_members')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationIamAuditConfigAuditLogConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationIamAuditConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'audit_log_config': 'auditLogConfig', 'org_id': 'orgId', 'service': 'service'})
class OrganizationIamAuditConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, audit_log_config: typing.List["OrganizationIamAuditConfigAuditLogConfig"], org_id: str, service: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param audit_log_config: audit_log_config block.
        :param org_id: The numeric ID of the organization in which you want to manage the audit logging config.
        :param service: Service which will be enabled for audit logging. The special value allServices covers all services.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'audit_log_config': audit_log_config,
            'org_id': org_id,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def audit_log_config(self) -> typing.List["OrganizationIamAuditConfigAuditLogConfig"]:
        """audit_log_config block."""
        return self._values.get('audit_log_config')

    @builtins.property
    def org_id(self) -> str:
        """The numeric ID of the organization in which you want to manage the audit logging config."""
        return self._values.get('org_id')

    @builtins.property
    def service(self) -> str:
        """Service which will be enabled for audit logging.

        The special value allServices covers all services.
        """
        return self._values.get('service')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationIamAuditConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class OrganizationIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.OrganizationIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], org_id: str, role: str, condition: typing.Optional[typing.List["OrganizationIamBindingCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param org_id: The numeric ID of the organization in which you want to manage the audit logging config.
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = OrganizationIamBindingConfig(members=members, org_id=org_id, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(OrganizationIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> str:
        return jsii.get(self, "orgId")

    @org_id.setter
    def org_id(self, value: str) -> None:
        jsii.set(self, "orgId", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["OrganizationIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["OrganizationIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class OrganizationIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'org_id': 'orgId', 'role': 'role', 'condition': 'condition'})
class OrganizationIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], org_id: str, role: str, condition: typing.Optional[typing.List["OrganizationIamBindingCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param org_id: The numeric ID of the organization in which you want to manage the audit logging config.
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'org_id': org_id,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def org_id(self) -> str:
        """The numeric ID of the organization in which you want to manage the audit logging config."""
        return self._values.get('org_id')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["OrganizationIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class OrganizationIamCustomRole(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.OrganizationIamCustomRole"):
    def __init__(self, scope: constructs.Construct, id: str, *, org_id: str, permissions: typing.List[str], role_id: str, title: str, description: typing.Optional[str]=None, stage: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param org_id: The numeric ID of the organization in which you want to create a custom role.
        :param permissions: The names of the permissions this role grants when bound in an IAM policy. At least one permission must be specified.
        :param role_id: The role id to use for this role.
        :param title: A human-readable title for the role.
        :param description: A human-readable description for the role.
        :param stage: The current launch stage of the role. Defaults to GA.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = OrganizationIamCustomRoleConfig(org_id=org_id, permissions=permissions, role_id=role_id, title=title, description=description, stage=stage, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(OrganizationIamCustomRole, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="deleted")
    def deleted(self) -> bool:
        return jsii.get(self, "deleted")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> str:
        return jsii.get(self, "orgId")

    @org_id.setter
    def org_id(self, value: str) -> None:
        jsii.set(self, "orgId", value)

    @builtins.property
    @jsii.member(jsii_name="permissions")
    def permissions(self) -> typing.List[str]:
        return jsii.get(self, "permissions")

    @permissions.setter
    def permissions(self, value: typing.List[str]) -> None:
        jsii.set(self, "permissions", value)

    @builtins.property
    @jsii.member(jsii_name="roleId")
    def role_id(self) -> str:
        return jsii.get(self, "roleId")

    @role_id.setter
    def role_id(self, value: str) -> None:
        jsii.set(self, "roleId", value)

    @builtins.property
    @jsii.member(jsii_name="title")
    def title(self) -> str:
        return jsii.get(self, "title")

    @title.setter
    def title(self, value: str) -> None:
        jsii.set(self, "title", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="stage")
    def stage(self) -> typing.Optional[str]:
        return jsii.get(self, "stage")

    @stage.setter
    def stage(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "stage", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationIamCustomRoleConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'org_id': 'orgId', 'permissions': 'permissions', 'role_id': 'roleId', 'title': 'title', 'description': 'description', 'stage': 'stage'})
class OrganizationIamCustomRoleConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, org_id: str, permissions: typing.List[str], role_id: str, title: str, description: typing.Optional[str]=None, stage: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param org_id: The numeric ID of the organization in which you want to create a custom role.
        :param permissions: The names of the permissions this role grants when bound in an IAM policy. At least one permission must be specified.
        :param role_id: The role id to use for this role.
        :param title: A human-readable title for the role.
        :param description: A human-readable description for the role.
        :param stage: The current launch stage of the role. Defaults to GA.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'org_id': org_id,
            'permissions': permissions,
            'role_id': role_id,
            'title': title,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if stage is not None: self._values["stage"] = stage

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def org_id(self) -> str:
        """The numeric ID of the organization in which you want to create a custom role."""
        return self._values.get('org_id')

    @builtins.property
    def permissions(self) -> typing.List[str]:
        """The names of the permissions this role grants when bound in an IAM policy.

        At least one permission must be specified.
        """
        return self._values.get('permissions')

    @builtins.property
    def role_id(self) -> str:
        """The role id to use for this role."""
        return self._values.get('role_id')

    @builtins.property
    def title(self) -> str:
        """A human-readable title for the role."""
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A human-readable description for the role."""
        return self._values.get('description')

    @builtins.property
    def stage(self) -> typing.Optional[str]:
        """The current launch stage of the role.

        Defaults to GA.
        """
        return self._values.get('stage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationIamCustomRoleConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class OrganizationIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.OrganizationIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, org_id: str, role: str, condition: typing.Optional[typing.List["OrganizationIamMemberCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param org_id: The numeric ID of the organization in which you want to manage the audit logging config.
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = OrganizationIamMemberConfig(member=member, org_id=org_id, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(OrganizationIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> str:
        return jsii.get(self, "orgId")

    @org_id.setter
    def org_id(self, value: str) -> None:
        jsii.set(self, "orgId", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["OrganizationIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["OrganizationIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class OrganizationIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'org_id': 'orgId', 'role': 'role', 'condition': 'condition'})
class OrganizationIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, org_id: str, role: str, condition: typing.Optional[typing.List["OrganizationIamMemberCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param org_id: The numeric ID of the organization in which you want to manage the audit logging config.
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'org_id': org_id,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def org_id(self) -> str:
        """The numeric ID of the organization in which you want to manage the audit logging config."""
        return self._values.get('org_id')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["OrganizationIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class OrganizationIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.OrganizationIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, org_id: str, policy_data: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param org_id: The numeric ID of the organization in which you want to manage the audit logging config.
        :param policy_data: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = OrganizationIamPolicyConfig(org_id=org_id, policy_data=policy_data, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(OrganizationIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> str:
        return jsii.get(self, "orgId")

    @org_id.setter
    def org_id(self, value: str) -> None:
        jsii.set(self, "orgId", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'org_id': 'orgId', 'policy_data': 'policyData'})
class OrganizationIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, org_id: str, policy_data: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param org_id: The numeric ID of the organization in which you want to manage the audit logging config.
        :param policy_data: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'org_id': org_id,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def org_id(self) -> str:
        """The numeric ID of the organization in which you want to manage the audit logging config."""
        return self._values.get('org_id')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class OrganizationPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.OrganizationPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, constraint: str, org_id: str, boolean_policy: typing.Optional[typing.List["OrganizationPolicyBooleanPolicy"]]=None, list_policy: typing.Optional[typing.List["OrganizationPolicyListPolicy"]]=None, restore_policy: typing.Optional[typing.List["OrganizationPolicyRestorePolicy"]]=None, timeouts: typing.Optional["OrganizationPolicyTimeouts"]=None, version: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param constraint: The name of the Constraint the Policy is configuring, for example, serviceuser.services.
        :param org_id: 
        :param boolean_policy: boolean_policy block.
        :param list_policy: list_policy block.
        :param restore_policy: restore_policy block.
        :param timeouts: timeouts block.
        :param version: Version of the Policy. Default version is 0.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = OrganizationPolicyConfig(constraint=constraint, org_id=org_id, boolean_policy=boolean_policy, list_policy=list_policy, restore_policy=restore_policy, timeouts=timeouts, version=version, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(OrganizationPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="updateTime")
    def update_time(self) -> str:
        return jsii.get(self, "updateTime")

    @builtins.property
    @jsii.member(jsii_name="constraint")
    def constraint(self) -> str:
        return jsii.get(self, "constraint")

    @constraint.setter
    def constraint(self, value: str) -> None:
        jsii.set(self, "constraint", value)

    @builtins.property
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> str:
        return jsii.get(self, "orgId")

    @org_id.setter
    def org_id(self, value: str) -> None:
        jsii.set(self, "orgId", value)

    @builtins.property
    @jsii.member(jsii_name="booleanPolicy")
    def boolean_policy(self) -> typing.Optional[typing.List["OrganizationPolicyBooleanPolicy"]]:
        return jsii.get(self, "booleanPolicy")

    @boolean_policy.setter
    def boolean_policy(self, value: typing.Optional[typing.List["OrganizationPolicyBooleanPolicy"]]) -> None:
        jsii.set(self, "booleanPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="listPolicy")
    def list_policy(self) -> typing.Optional[typing.List["OrganizationPolicyListPolicy"]]:
        return jsii.get(self, "listPolicy")

    @list_policy.setter
    def list_policy(self, value: typing.Optional[typing.List["OrganizationPolicyListPolicy"]]) -> None:
        jsii.set(self, "listPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="restorePolicy")
    def restore_policy(self) -> typing.Optional[typing.List["OrganizationPolicyRestorePolicy"]]:
        return jsii.get(self, "restorePolicy")

    @restore_policy.setter
    def restore_policy(self, value: typing.Optional[typing.List["OrganizationPolicyRestorePolicy"]]) -> None:
        jsii.set(self, "restorePolicy", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["OrganizationPolicyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["OrganizationPolicyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "version")

    @version.setter
    def version(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationPolicyBooleanPolicy", jsii_struct_bases=[], name_mapping={'enforced': 'enforced'})
class OrganizationPolicyBooleanPolicy():
    def __init__(self, *, enforced: bool) -> None:
        """
        :param enforced: If true, then the Policy is enforced. If false, then any configuration is acceptable.
        """
        self._values = {
            'enforced': enforced,
        }

    @builtins.property
    def enforced(self) -> bool:
        """If true, then the Policy is enforced.

        If false, then any configuration is acceptable.
        """
        return self._values.get('enforced')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationPolicyBooleanPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'constraint': 'constraint', 'org_id': 'orgId', 'boolean_policy': 'booleanPolicy', 'list_policy': 'listPolicy', 'restore_policy': 'restorePolicy', 'timeouts': 'timeouts', 'version': 'version'})
class OrganizationPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, constraint: str, org_id: str, boolean_policy: typing.Optional[typing.List["OrganizationPolicyBooleanPolicy"]]=None, list_policy: typing.Optional[typing.List["OrganizationPolicyListPolicy"]]=None, restore_policy: typing.Optional[typing.List["OrganizationPolicyRestorePolicy"]]=None, timeouts: typing.Optional["OrganizationPolicyTimeouts"]=None, version: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param constraint: The name of the Constraint the Policy is configuring, for example, serviceuser.services.
        :param org_id: 
        :param boolean_policy: boolean_policy block.
        :param list_policy: list_policy block.
        :param restore_policy: restore_policy block.
        :param timeouts: timeouts block.
        :param version: Version of the Policy. Default version is 0.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = OrganizationPolicyTimeouts(**timeouts)
        self._values = {
            'constraint': constraint,
            'org_id': org_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if boolean_policy is not None: self._values["boolean_policy"] = boolean_policy
        if list_policy is not None: self._values["list_policy"] = list_policy
        if restore_policy is not None: self._values["restore_policy"] = restore_policy
        if timeouts is not None: self._values["timeouts"] = timeouts
        if version is not None: self._values["version"] = version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def constraint(self) -> str:
        """The name of the Constraint the Policy is configuring, for example, serviceuser.services."""
        return self._values.get('constraint')

    @builtins.property
    def org_id(self) -> str:
        return self._values.get('org_id')

    @builtins.property
    def boolean_policy(self) -> typing.Optional[typing.List["OrganizationPolicyBooleanPolicy"]]:
        """boolean_policy block."""
        return self._values.get('boolean_policy')

    @builtins.property
    def list_policy(self) -> typing.Optional[typing.List["OrganizationPolicyListPolicy"]]:
        """list_policy block."""
        return self._values.get('list_policy')

    @builtins.property
    def restore_policy(self) -> typing.Optional[typing.List["OrganizationPolicyRestorePolicy"]]:
        """restore_policy block."""
        return self._values.get('restore_policy')

    @builtins.property
    def timeouts(self) -> typing.Optional["OrganizationPolicyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def version(self) -> typing.Optional[jsii.Number]:
        """Version of the Policy.

        Default version is 0.
        """
        return self._values.get('version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationPolicyListPolicy", jsii_struct_bases=[], name_mapping={'allow': 'allow', 'deny': 'deny', 'inherit_from_parent': 'inheritFromParent', 'suggested_value': 'suggestedValue'})
class OrganizationPolicyListPolicy():
    def __init__(self, *, allow: typing.Optional[typing.List["OrganizationPolicyListPolicyAllow"]]=None, deny: typing.Optional[typing.List["OrganizationPolicyListPolicyDeny"]]=None, inherit_from_parent: typing.Optional[bool]=None, suggested_value: typing.Optional[str]=None) -> None:
        """
        :param allow: allow block.
        :param deny: deny block.
        :param inherit_from_parent: If set to true, the values from the effective Policy of the parent resource are inherited, meaning the values set in this Policy are added to the values inherited up the hierarchy.
        :param suggested_value: The Google Cloud Console will try to default to a configuration that matches the value specified in this field.
        """
        self._values = {
        }
        if allow is not None: self._values["allow"] = allow
        if deny is not None: self._values["deny"] = deny
        if inherit_from_parent is not None: self._values["inherit_from_parent"] = inherit_from_parent
        if suggested_value is not None: self._values["suggested_value"] = suggested_value

    @builtins.property
    def allow(self) -> typing.Optional[typing.List["OrganizationPolicyListPolicyAllow"]]:
        """allow block."""
        return self._values.get('allow')

    @builtins.property
    def deny(self) -> typing.Optional[typing.List["OrganizationPolicyListPolicyDeny"]]:
        """deny block."""
        return self._values.get('deny')

    @builtins.property
    def inherit_from_parent(self) -> typing.Optional[bool]:
        """If set to true, the values from the effective Policy of the parent resource are inherited, meaning the values set in this Policy are added to the values inherited up the hierarchy."""
        return self._values.get('inherit_from_parent')

    @builtins.property
    def suggested_value(self) -> typing.Optional[str]:
        """The Google Cloud Console will try to default to a configuration that matches the value specified in this field."""
        return self._values.get('suggested_value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationPolicyListPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationPolicyListPolicyAllow", jsii_struct_bases=[], name_mapping={'all': 'all', 'values': 'values'})
class OrganizationPolicyListPolicyAllow():
    def __init__(self, *, all: typing.Optional[bool]=None, values: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param all: The policy allows or denies all values.
        :param values: The policy can define specific values that are allowed or denied.
        """
        self._values = {
        }
        if all is not None: self._values["all"] = all
        if values is not None: self._values["values"] = values

    @builtins.property
    def all(self) -> typing.Optional[bool]:
        """The policy allows or denies all values."""
        return self._values.get('all')

    @builtins.property
    def values(self) -> typing.Optional[typing.List[str]]:
        """The policy can define specific values that are allowed or denied."""
        return self._values.get('values')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationPolicyListPolicyAllow(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationPolicyListPolicyDeny", jsii_struct_bases=[], name_mapping={'all': 'all', 'values': 'values'})
class OrganizationPolicyListPolicyDeny():
    def __init__(self, *, all: typing.Optional[bool]=None, values: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param all: The policy allows or denies all values.
        :param values: The policy can define specific values that are allowed or denied.
        """
        self._values = {
        }
        if all is not None: self._values["all"] = all
        if values is not None: self._values["values"] = values

    @builtins.property
    def all(self) -> typing.Optional[bool]:
        """The policy allows or denies all values."""
        return self._values.get('all')

    @builtins.property
    def values(self) -> typing.Optional[typing.List[str]]:
        """The policy can define specific values that are allowed or denied."""
        return self._values.get('values')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationPolicyListPolicyDeny(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationPolicyRestorePolicy", jsii_struct_bases=[], name_mapping={'default': 'default'})
class OrganizationPolicyRestorePolicy():
    def __init__(self, *, default: bool) -> None:
        """
        :param default: May only be set to true. If set, then the default Policy is restored.
        """
        self._values = {
            'default': default,
        }

    @builtins.property
    def default(self) -> bool:
        """May only be set to true.

        If set, then the default Policy is restored.
        """
        return self._values.get('default')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationPolicyRestorePolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OrganizationPolicyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'read': 'read', 'update': 'update'})
class OrganizationPolicyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, read: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param read: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if read is not None: self._values["read"] = read
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def read(self) -> typing.Optional[str]:
        return self._values.get('read')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OrganizationPolicyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class OsConfigPatchDeployment(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.OsConfigPatchDeployment"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance_filter: typing.List["OsConfigPatchDeploymentInstanceFilter"], patch_deployment_id: str, description: typing.Optional[str]=None, duration: typing.Optional[str]=None, one_time_schedule: typing.Optional[typing.List["OsConfigPatchDeploymentOneTimeSchedule"]]=None, patch_config: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfig"]]=None, project: typing.Optional[str]=None, recurring_schedule: typing.Optional[typing.List["OsConfigPatchDeploymentRecurringSchedule"]]=None, timeouts: typing.Optional["OsConfigPatchDeploymentTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance_filter: instance_filter block.
        :param patch_deployment_id: A name for the patch deployment in the project. When creating a name the following rules apply: Must contain only lowercase letters, numbers, and hyphens. Must start with a letter. Must be between 1-63 characters. Must end with a number or a letter. Must be unique within the project.
        :param description: Description of the patch deployment. Length of the description is limited to 1024 characters.
        :param duration: Duration of the patch. After the duration ends, the patch times out. A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s"
        :param one_time_schedule: one_time_schedule block.
        :param patch_config: patch_config block.
        :param project: 
        :param recurring_schedule: recurring_schedule block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = OsConfigPatchDeploymentConfig(instance_filter=instance_filter, patch_deployment_id=patch_deployment_id, description=description, duration=duration, one_time_schedule=one_time_schedule, patch_config=patch_config, project=project, recurring_schedule=recurring_schedule, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(OsConfigPatchDeployment, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="lastExecuteTime")
    def last_execute_time(self) -> str:
        return jsii.get(self, "lastExecuteTime")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="updateTime")
    def update_time(self) -> str:
        return jsii.get(self, "updateTime")

    @builtins.property
    @jsii.member(jsii_name="instanceFilter")
    def instance_filter(self) -> typing.List["OsConfigPatchDeploymentInstanceFilter"]:
        return jsii.get(self, "instanceFilter")

    @instance_filter.setter
    def instance_filter(self, value: typing.List["OsConfigPatchDeploymentInstanceFilter"]) -> None:
        jsii.set(self, "instanceFilter", value)

    @builtins.property
    @jsii.member(jsii_name="patchDeploymentId")
    def patch_deployment_id(self) -> str:
        return jsii.get(self, "patchDeploymentId")

    @patch_deployment_id.setter
    def patch_deployment_id(self, value: str) -> None:
        jsii.set(self, "patchDeploymentId", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="duration")
    def duration(self) -> typing.Optional[str]:
        return jsii.get(self, "duration")

    @duration.setter
    def duration(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "duration", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="oneTimeSchedule")
    def one_time_schedule(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentOneTimeSchedule"]]:
        return jsii.get(self, "oneTimeSchedule")

    @one_time_schedule.setter
    def one_time_schedule(self, value: typing.Optional[typing.List["OsConfigPatchDeploymentOneTimeSchedule"]]) -> None:
        jsii.set(self, "oneTimeSchedule", value)

    @builtins.property
    @jsii.member(jsii_name="patchConfig")
    def patch_config(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfig"]]:
        return jsii.get(self, "patchConfig")

    @patch_config.setter
    def patch_config(self, value: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfig"]]) -> None:
        jsii.set(self, "patchConfig", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="recurringSchedule")
    def recurring_schedule(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentRecurringSchedule"]]:
        return jsii.get(self, "recurringSchedule")

    @recurring_schedule.setter
    def recurring_schedule(self, value: typing.Optional[typing.List["OsConfigPatchDeploymentRecurringSchedule"]]) -> None:
        jsii.set(self, "recurringSchedule", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["OsConfigPatchDeploymentTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["OsConfigPatchDeploymentTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance_filter': 'instanceFilter', 'patch_deployment_id': 'patchDeploymentId', 'description': 'description', 'duration': 'duration', 'one_time_schedule': 'oneTimeSchedule', 'patch_config': 'patchConfig', 'project': 'project', 'recurring_schedule': 'recurringSchedule', 'timeouts': 'timeouts'})
class OsConfigPatchDeploymentConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance_filter: typing.List["OsConfigPatchDeploymentInstanceFilter"], patch_deployment_id: str, description: typing.Optional[str]=None, duration: typing.Optional[str]=None, one_time_schedule: typing.Optional[typing.List["OsConfigPatchDeploymentOneTimeSchedule"]]=None, patch_config: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfig"]]=None, project: typing.Optional[str]=None, recurring_schedule: typing.Optional[typing.List["OsConfigPatchDeploymentRecurringSchedule"]]=None, timeouts: typing.Optional["OsConfigPatchDeploymentTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance_filter: instance_filter block.
        :param patch_deployment_id: A name for the patch deployment in the project. When creating a name the following rules apply: Must contain only lowercase letters, numbers, and hyphens. Must start with a letter. Must be between 1-63 characters. Must end with a number or a letter. Must be unique within the project.
        :param description: Description of the patch deployment. Length of the description is limited to 1024 characters.
        :param duration: Duration of the patch. After the duration ends, the patch times out. A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s"
        :param one_time_schedule: one_time_schedule block.
        :param patch_config: patch_config block.
        :param project: 
        :param recurring_schedule: recurring_schedule block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = OsConfigPatchDeploymentTimeouts(**timeouts)
        self._values = {
            'instance_filter': instance_filter,
            'patch_deployment_id': patch_deployment_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if duration is not None: self._values["duration"] = duration
        if one_time_schedule is not None: self._values["one_time_schedule"] = one_time_schedule
        if patch_config is not None: self._values["patch_config"] = patch_config
        if project is not None: self._values["project"] = project
        if recurring_schedule is not None: self._values["recurring_schedule"] = recurring_schedule
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance_filter(self) -> typing.List["OsConfigPatchDeploymentInstanceFilter"]:
        """instance_filter block."""
        return self._values.get('instance_filter')

    @builtins.property
    def patch_deployment_id(self) -> str:
        """A name for the patch deployment in the project.

        When creating a name the following rules apply:
        Must contain only lowercase letters, numbers, and hyphens.
        Must start with a letter.
        Must be between 1-63 characters.
        Must end with a number or a letter.
        Must be unique within the project.
        """
        return self._values.get('patch_deployment_id')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """Description of the patch deployment.

        Length of the description is limited to 1024 characters.
        """
        return self._values.get('description')

    @builtins.property
    def duration(self) -> typing.Optional[str]:
        """Duration of the patch.

        After the duration ends, the patch times out.
        A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s"
        """
        return self._values.get('duration')

    @builtins.property
    def one_time_schedule(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentOneTimeSchedule"]]:
        """one_time_schedule block."""
        return self._values.get('one_time_schedule')

    @builtins.property
    def patch_config(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfig"]]:
        """patch_config block."""
        return self._values.get('patch_config')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def recurring_schedule(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentRecurringSchedule"]]:
        """recurring_schedule block."""
        return self._values.get('recurring_schedule')

    @builtins.property
    def timeouts(self) -> typing.Optional["OsConfigPatchDeploymentTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentInstanceFilter", jsii_struct_bases=[], name_mapping={'all': 'all', 'group_labels': 'groupLabels', 'instance_name_prefixes': 'instanceNamePrefixes', 'instances': 'instances', 'zones': 'zones'})
class OsConfigPatchDeploymentInstanceFilter():
    def __init__(self, *, all: typing.Optional[bool]=None, group_labels: typing.Optional[typing.List["OsConfigPatchDeploymentInstanceFilterGroupLabels"]]=None, instance_name_prefixes: typing.Optional[typing.List[str]]=None, instances: typing.Optional[typing.List[str]]=None, zones: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param all: Target all VM instances in the project. If true, no other criteria is permitted.
        :param group_labels: group_labels block.
        :param instance_name_prefixes: Targets VMs whose name starts with one of these prefixes. Similar to labels, this is another way to group VMs when targeting configs, for example prefix="prod-".
        :param instances: Targets any of the VM instances specified. Instances are specified by their URI in the 'form zones/{{zone}}/instances/{{instance_name}}', 'projects/{{project_id}}/zones/{{zone}}/instances/{{instance_name}}', or 'https://www.googleapis.com/compute/v1/projects/{{project_id}}/zones/{{zone}}/instances/{{instance_name}}'
        :param zones: Targets VM instances in ANY of these zones. Leave empty to target VM instances in any zone.
        """
        self._values = {
        }
        if all is not None: self._values["all"] = all
        if group_labels is not None: self._values["group_labels"] = group_labels
        if instance_name_prefixes is not None: self._values["instance_name_prefixes"] = instance_name_prefixes
        if instances is not None: self._values["instances"] = instances
        if zones is not None: self._values["zones"] = zones

    @builtins.property
    def all(self) -> typing.Optional[bool]:
        """Target all VM instances in the project.

        If true, no other criteria is permitted.
        """
        return self._values.get('all')

    @builtins.property
    def group_labels(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentInstanceFilterGroupLabels"]]:
        """group_labels block."""
        return self._values.get('group_labels')

    @builtins.property
    def instance_name_prefixes(self) -> typing.Optional[typing.List[str]]:
        """Targets VMs whose name starts with one of these prefixes.

        Similar to labels, this is another way to group
        VMs when targeting configs, for example prefix="prod-".
        """
        return self._values.get('instance_name_prefixes')

    @builtins.property
    def instances(self) -> typing.Optional[typing.List[str]]:
        """Targets any of the VM instances specified.

        Instances are specified by their URI in the 'form zones/{{zone}}/instances/{{instance_name}}',
        'projects/{{project_id}}/zones/{{zone}}/instances/{{instance_name}}', or
        'https://www.googleapis.com/compute/v1/projects/{{project_id}}/zones/{{zone}}/instances/{{instance_name}}'
        """
        return self._values.get('instances')

    @builtins.property
    def zones(self) -> typing.Optional[typing.List[str]]:
        """Targets VM instances in ANY of these zones.

        Leave empty to target VM instances in any zone.
        """
        return self._values.get('zones')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentInstanceFilter(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentInstanceFilterGroupLabels", jsii_struct_bases=[], name_mapping={'labels': 'labels'})
class OsConfigPatchDeploymentInstanceFilterGroupLabels():
    def __init__(self, *, labels: typing.Mapping[str, str]) -> None:
        """
        :param labels: Compute Engine instance labels that must be present for a VM instance to be targeted by this filter.
        """
        self._values = {
            'labels': labels,
        }

    @builtins.property
    def labels(self) -> typing.Mapping[str, str]:
        """Compute Engine instance labels that must be present for a VM instance to be targeted by this filter."""
        return self._values.get('labels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentInstanceFilterGroupLabels(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentOneTimeSchedule", jsii_struct_bases=[], name_mapping={'execute_time': 'executeTime'})
class OsConfigPatchDeploymentOneTimeSchedule():
    def __init__(self, *, execute_time: str) -> None:
        """
        :param execute_time: The desired patch job execution time. A timestamp in RFC3339 UTC "Zulu" format, accurate to nanoseconds. Example: "2014-10-02T15:01:23.045123456Z".
        """
        self._values = {
            'execute_time': execute_time,
        }

    @builtins.property
    def execute_time(self) -> str:
        """The desired patch job execution time.

        A timestamp in RFC3339 UTC "Zulu" format,
        accurate to nanoseconds. Example: "2014-10-02T15:01:23.045123456Z".
        """
        return self._values.get('execute_time')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentOneTimeSchedule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfig", jsii_struct_bases=[], name_mapping={'apt': 'apt', 'goo': 'goo', 'post_step': 'postStep', 'pre_step': 'preStep', 'reboot_config': 'rebootConfig', 'windows_update': 'windowsUpdate', 'yum': 'yum', 'zypper': 'zypper'})
class OsConfigPatchDeploymentPatchConfig():
    def __init__(self, *, apt: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigApt"]]=None, goo: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigGoo"]]=None, post_step: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPostStep"]]=None, pre_step: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPreStep"]]=None, reboot_config: typing.Optional[str]=None, windows_update: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigWindowsUpdate"]]=None, yum: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigYum"]]=None, zypper: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigZypper"]]=None) -> None:
        """
        :param apt: apt block.
        :param goo: goo block.
        :param post_step: post_step block.
        :param pre_step: pre_step block.
        :param reboot_config: Post-patch reboot settings. Possible values: ["DEFAULT", "ALWAYS", "NEVER"]
        :param windows_update: windows_update block.
        :param yum: yum block.
        :param zypper: zypper block.
        """
        self._values = {
        }
        if apt is not None: self._values["apt"] = apt
        if goo is not None: self._values["goo"] = goo
        if post_step is not None: self._values["post_step"] = post_step
        if pre_step is not None: self._values["pre_step"] = pre_step
        if reboot_config is not None: self._values["reboot_config"] = reboot_config
        if windows_update is not None: self._values["windows_update"] = windows_update
        if yum is not None: self._values["yum"] = yum
        if zypper is not None: self._values["zypper"] = zypper

    @builtins.property
    def apt(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigApt"]]:
        """apt block."""
        return self._values.get('apt')

    @builtins.property
    def goo(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigGoo"]]:
        """goo block."""
        return self._values.get('goo')

    @builtins.property
    def post_step(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPostStep"]]:
        """post_step block."""
        return self._values.get('post_step')

    @builtins.property
    def pre_step(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPreStep"]]:
        """pre_step block."""
        return self._values.get('pre_step')

    @builtins.property
    def reboot_config(self) -> typing.Optional[str]:
        """Post-patch reboot settings.

        Possible values: ["DEFAULT", "ALWAYS", "NEVER"]
        """
        return self._values.get('reboot_config')

    @builtins.property
    def windows_update(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigWindowsUpdate"]]:
        """windows_update block."""
        return self._values.get('windows_update')

    @builtins.property
    def yum(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigYum"]]:
        """yum block."""
        return self._values.get('yum')

    @builtins.property
    def zypper(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigZypper"]]:
        """zypper block."""
        return self._values.get('zypper')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigApt", jsii_struct_bases=[], name_mapping={'excludes': 'excludes', 'exclusive_packages': 'exclusivePackages', 'type': 'type'})
class OsConfigPatchDeploymentPatchConfigApt():
    def __init__(self, *, excludes: typing.Optional[typing.List[str]]=None, exclusive_packages: typing.Optional[typing.List[str]]=None, type: typing.Optional[str]=None) -> None:
        """
        :param excludes: List of packages to exclude from update. These packages will be excluded.
        :param exclusive_packages: An exclusive list of packages to be updated. These are the only packages that will be updated. If these packages are not installed, they will be ignored. This field cannot be specified with any other patch configuration fields.
        :param type: By changing the type to DIST, the patching is performed using apt-get dist-upgrade instead. Possible values: ["DIST", "UPGRADE"]
        """
        self._values = {
        }
        if excludes is not None: self._values["excludes"] = excludes
        if exclusive_packages is not None: self._values["exclusive_packages"] = exclusive_packages
        if type is not None: self._values["type"] = type

    @builtins.property
    def excludes(self) -> typing.Optional[typing.List[str]]:
        """List of packages to exclude from update.

        These packages will be excluded.
        """
        return self._values.get('excludes')

    @builtins.property
    def exclusive_packages(self) -> typing.Optional[typing.List[str]]:
        """An exclusive list of packages to be updated.

        These are the only packages that will be updated.
        If these packages are not installed, they will be ignored. This field cannot be specified with
        any other patch configuration fields.
        """
        return self._values.get('exclusive_packages')

    @builtins.property
    def type(self) -> typing.Optional[str]:
        """By changing the type to DIST, the patching is performed using apt-get dist-upgrade instead.

        Possible values: ["DIST", "UPGRADE"]
        """
        return self._values.get('type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigApt(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigGoo", jsii_struct_bases=[], name_mapping={'enabled': 'enabled'})
class OsConfigPatchDeploymentPatchConfigGoo():
    def __init__(self, *, enabled: bool) -> None:
        """
        :param enabled: goo update settings. Use this setting to override the default goo patch rules.
        """
        self._values = {
            'enabled': enabled,
        }

    @builtins.property
    def enabled(self) -> bool:
        """goo update settings.

        Use this setting to override the default goo patch rules.
        """
        return self._values.get('enabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigGoo(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigPostStep", jsii_struct_bases=[], name_mapping={'linux_exec_step_config': 'linuxExecStepConfig', 'windows_exec_step_config': 'windowsExecStepConfig'})
class OsConfigPatchDeploymentPatchConfigPostStep():
    def __init__(self, *, linux_exec_step_config: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPostStepLinuxExecStepConfig"]]=None, windows_exec_step_config: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPostStepWindowsExecStepConfig"]]=None) -> None:
        """
        :param linux_exec_step_config: linux_exec_step_config block.
        :param windows_exec_step_config: windows_exec_step_config block.
        """
        self._values = {
        }
        if linux_exec_step_config is not None: self._values["linux_exec_step_config"] = linux_exec_step_config
        if windows_exec_step_config is not None: self._values["windows_exec_step_config"] = windows_exec_step_config

    @builtins.property
    def linux_exec_step_config(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPostStepLinuxExecStepConfig"]]:
        """linux_exec_step_config block."""
        return self._values.get('linux_exec_step_config')

    @builtins.property
    def windows_exec_step_config(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPostStepWindowsExecStepConfig"]]:
        """windows_exec_step_config block."""
        return self._values.get('windows_exec_step_config')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigPostStep(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigPostStepLinuxExecStepConfig", jsii_struct_bases=[], name_mapping={'allowed_success_codes': 'allowedSuccessCodes', 'gcs_object': 'gcsObject', 'interpreter': 'interpreter', 'local_path': 'localPath'})
class OsConfigPatchDeploymentPatchConfigPostStepLinuxExecStepConfig():
    def __init__(self, *, allowed_success_codes: typing.Optional[typing.List[jsii.Number]]=None, gcs_object: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPostStepLinuxExecStepConfigGcsObject"]]=None, interpreter: typing.Optional[str]=None, local_path: typing.Optional[str]=None) -> None:
        """
        :param allowed_success_codes: Defaults to [0]. A list of possible return values that the execution can return to indicate a success.
        :param gcs_object: gcs_object block.
        :param interpreter: The script interpreter to use to run the script. If no interpreter is specified the script will be executed directly, which will likely only succeed for scripts with shebang lines. Possible values: ["SHELL", "POWERSHELL"]
        :param local_path: An absolute path to the executable on the VM.
        """
        self._values = {
        }
        if allowed_success_codes is not None: self._values["allowed_success_codes"] = allowed_success_codes
        if gcs_object is not None: self._values["gcs_object"] = gcs_object
        if interpreter is not None: self._values["interpreter"] = interpreter
        if local_path is not None: self._values["local_path"] = local_path

    @builtins.property
    def allowed_success_codes(self) -> typing.Optional[typing.List[jsii.Number]]:
        """Defaults to [0].

        A list of possible return values that the execution can return to indicate a success.
        """
        return self._values.get('allowed_success_codes')

    @builtins.property
    def gcs_object(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPostStepLinuxExecStepConfigGcsObject"]]:
        """gcs_object block."""
        return self._values.get('gcs_object')

    @builtins.property
    def interpreter(self) -> typing.Optional[str]:
        """The script interpreter to use to run the script.

        If no interpreter is specified the script will
        be executed directly, which will likely only succeed for scripts with shebang lines. Possible values: ["SHELL", "POWERSHELL"]
        """
        return self._values.get('interpreter')

    @builtins.property
    def local_path(self) -> typing.Optional[str]:
        """An absolute path to the executable on the VM."""
        return self._values.get('local_path')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigPostStepLinuxExecStepConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigPostStepLinuxExecStepConfigGcsObject", jsii_struct_bases=[], name_mapping={'bucket': 'bucket', 'generation_number': 'generationNumber', 'object': 'object'})
class OsConfigPatchDeploymentPatchConfigPostStepLinuxExecStepConfigGcsObject():
    def __init__(self, *, bucket: str, generation_number: str, object: str) -> None:
        """
        :param bucket: Bucket of the Cloud Storage object.
        :param generation_number: Generation number of the Cloud Storage object. This is used to ensure that the ExecStep specified by this PatchJob does not change.
        :param object: Name of the Cloud Storage object.
        """
        self._values = {
            'bucket': bucket,
            'generation_number': generation_number,
            'object': object,
        }

    @builtins.property
    def bucket(self) -> str:
        """Bucket of the Cloud Storage object."""
        return self._values.get('bucket')

    @builtins.property
    def generation_number(self) -> str:
        """Generation number of the Cloud Storage object.

        This is used to ensure that the ExecStep specified by this PatchJob does not change.
        """
        return self._values.get('generation_number')

    @builtins.property
    def object(self) -> str:
        """Name of the Cloud Storage object."""
        return self._values.get('object')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigPostStepLinuxExecStepConfigGcsObject(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigPostStepWindowsExecStepConfig", jsii_struct_bases=[], name_mapping={'allowed_success_codes': 'allowedSuccessCodes', 'gcs_object': 'gcsObject', 'interpreter': 'interpreter', 'local_path': 'localPath'})
class OsConfigPatchDeploymentPatchConfigPostStepWindowsExecStepConfig():
    def __init__(self, *, allowed_success_codes: typing.Optional[typing.List[jsii.Number]]=None, gcs_object: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPostStepWindowsExecStepConfigGcsObject"]]=None, interpreter: typing.Optional[str]=None, local_path: typing.Optional[str]=None) -> None:
        """
        :param allowed_success_codes: Defaults to [0]. A list of possible return values that the execution can return to indicate a success.
        :param gcs_object: gcs_object block.
        :param interpreter: The script interpreter to use to run the script. If no interpreter is specified the script will be executed directly, which will likely only succeed for scripts with shebang lines. Possible values: ["SHELL", "POWERSHELL"]
        :param local_path: An absolute path to the executable on the VM.
        """
        self._values = {
        }
        if allowed_success_codes is not None: self._values["allowed_success_codes"] = allowed_success_codes
        if gcs_object is not None: self._values["gcs_object"] = gcs_object
        if interpreter is not None: self._values["interpreter"] = interpreter
        if local_path is not None: self._values["local_path"] = local_path

    @builtins.property
    def allowed_success_codes(self) -> typing.Optional[typing.List[jsii.Number]]:
        """Defaults to [0].

        A list of possible return values that the execution can return to indicate a success.
        """
        return self._values.get('allowed_success_codes')

    @builtins.property
    def gcs_object(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPostStepWindowsExecStepConfigGcsObject"]]:
        """gcs_object block."""
        return self._values.get('gcs_object')

    @builtins.property
    def interpreter(self) -> typing.Optional[str]:
        """The script interpreter to use to run the script.

        If no interpreter is specified the script will
        be executed directly, which will likely only succeed for scripts with shebang lines. Possible values: ["SHELL", "POWERSHELL"]
        """
        return self._values.get('interpreter')

    @builtins.property
    def local_path(self) -> typing.Optional[str]:
        """An absolute path to the executable on the VM."""
        return self._values.get('local_path')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigPostStepWindowsExecStepConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigPostStepWindowsExecStepConfigGcsObject", jsii_struct_bases=[], name_mapping={'bucket': 'bucket', 'generation_number': 'generationNumber', 'object': 'object'})
class OsConfigPatchDeploymentPatchConfigPostStepWindowsExecStepConfigGcsObject():
    def __init__(self, *, bucket: str, generation_number: str, object: str) -> None:
        """
        :param bucket: Bucket of the Cloud Storage object.
        :param generation_number: Generation number of the Cloud Storage object. This is used to ensure that the ExecStep specified by this PatchJob does not change.
        :param object: Name of the Cloud Storage object.
        """
        self._values = {
            'bucket': bucket,
            'generation_number': generation_number,
            'object': object,
        }

    @builtins.property
    def bucket(self) -> str:
        """Bucket of the Cloud Storage object."""
        return self._values.get('bucket')

    @builtins.property
    def generation_number(self) -> str:
        """Generation number of the Cloud Storage object.

        This is used to ensure that the ExecStep specified by this PatchJob does not change.
        """
        return self._values.get('generation_number')

    @builtins.property
    def object(self) -> str:
        """Name of the Cloud Storage object."""
        return self._values.get('object')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigPostStepWindowsExecStepConfigGcsObject(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigPreStep", jsii_struct_bases=[], name_mapping={'linux_exec_step_config': 'linuxExecStepConfig', 'windows_exec_step_config': 'windowsExecStepConfig'})
class OsConfigPatchDeploymentPatchConfigPreStep():
    def __init__(self, *, linux_exec_step_config: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPreStepLinuxExecStepConfig"]]=None, windows_exec_step_config: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPreStepWindowsExecStepConfig"]]=None) -> None:
        """
        :param linux_exec_step_config: linux_exec_step_config block.
        :param windows_exec_step_config: windows_exec_step_config block.
        """
        self._values = {
        }
        if linux_exec_step_config is not None: self._values["linux_exec_step_config"] = linux_exec_step_config
        if windows_exec_step_config is not None: self._values["windows_exec_step_config"] = windows_exec_step_config

    @builtins.property
    def linux_exec_step_config(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPreStepLinuxExecStepConfig"]]:
        """linux_exec_step_config block."""
        return self._values.get('linux_exec_step_config')

    @builtins.property
    def windows_exec_step_config(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPreStepWindowsExecStepConfig"]]:
        """windows_exec_step_config block."""
        return self._values.get('windows_exec_step_config')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigPreStep(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigPreStepLinuxExecStepConfig", jsii_struct_bases=[], name_mapping={'allowed_success_codes': 'allowedSuccessCodes', 'gcs_object': 'gcsObject', 'interpreter': 'interpreter', 'local_path': 'localPath'})
class OsConfigPatchDeploymentPatchConfigPreStepLinuxExecStepConfig():
    def __init__(self, *, allowed_success_codes: typing.Optional[typing.List[jsii.Number]]=None, gcs_object: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPreStepLinuxExecStepConfigGcsObject"]]=None, interpreter: typing.Optional[str]=None, local_path: typing.Optional[str]=None) -> None:
        """
        :param allowed_success_codes: Defaults to [0]. A list of possible return values that the execution can return to indicate a success.
        :param gcs_object: gcs_object block.
        :param interpreter: The script interpreter to use to run the script. If no interpreter is specified the script will be executed directly, which will likely only succeed for scripts with shebang lines. Possible values: ["SHELL", "POWERSHELL"]
        :param local_path: An absolute path to the executable on the VM.
        """
        self._values = {
        }
        if allowed_success_codes is not None: self._values["allowed_success_codes"] = allowed_success_codes
        if gcs_object is not None: self._values["gcs_object"] = gcs_object
        if interpreter is not None: self._values["interpreter"] = interpreter
        if local_path is not None: self._values["local_path"] = local_path

    @builtins.property
    def allowed_success_codes(self) -> typing.Optional[typing.List[jsii.Number]]:
        """Defaults to [0].

        A list of possible return values that the execution can return to indicate a success.
        """
        return self._values.get('allowed_success_codes')

    @builtins.property
    def gcs_object(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPreStepLinuxExecStepConfigGcsObject"]]:
        """gcs_object block."""
        return self._values.get('gcs_object')

    @builtins.property
    def interpreter(self) -> typing.Optional[str]:
        """The script interpreter to use to run the script.

        If no interpreter is specified the script will
        be executed directly, which will likely only succeed for scripts with shebang lines. Possible values: ["SHELL", "POWERSHELL"]
        """
        return self._values.get('interpreter')

    @builtins.property
    def local_path(self) -> typing.Optional[str]:
        """An absolute path to the executable on the VM."""
        return self._values.get('local_path')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigPreStepLinuxExecStepConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigPreStepLinuxExecStepConfigGcsObject", jsii_struct_bases=[], name_mapping={'bucket': 'bucket', 'generation_number': 'generationNumber', 'object': 'object'})
class OsConfigPatchDeploymentPatchConfigPreStepLinuxExecStepConfigGcsObject():
    def __init__(self, *, bucket: str, generation_number: str, object: str) -> None:
        """
        :param bucket: Bucket of the Cloud Storage object.
        :param generation_number: Generation number of the Cloud Storage object. This is used to ensure that the ExecStep specified by this PatchJob does not change.
        :param object: Name of the Cloud Storage object.
        """
        self._values = {
            'bucket': bucket,
            'generation_number': generation_number,
            'object': object,
        }

    @builtins.property
    def bucket(self) -> str:
        """Bucket of the Cloud Storage object."""
        return self._values.get('bucket')

    @builtins.property
    def generation_number(self) -> str:
        """Generation number of the Cloud Storage object.

        This is used to ensure that the ExecStep specified by this PatchJob does not change.
        """
        return self._values.get('generation_number')

    @builtins.property
    def object(self) -> str:
        """Name of the Cloud Storage object."""
        return self._values.get('object')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigPreStepLinuxExecStepConfigGcsObject(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigPreStepWindowsExecStepConfig", jsii_struct_bases=[], name_mapping={'allowed_success_codes': 'allowedSuccessCodes', 'gcs_object': 'gcsObject', 'interpreter': 'interpreter', 'local_path': 'localPath'})
class OsConfigPatchDeploymentPatchConfigPreStepWindowsExecStepConfig():
    def __init__(self, *, allowed_success_codes: typing.Optional[typing.List[jsii.Number]]=None, gcs_object: typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPreStepWindowsExecStepConfigGcsObject"]]=None, interpreter: typing.Optional[str]=None, local_path: typing.Optional[str]=None) -> None:
        """
        :param allowed_success_codes: Defaults to [0]. A list of possible return values that the execution can return to indicate a success.
        :param gcs_object: gcs_object block.
        :param interpreter: The script interpreter to use to run the script. If no interpreter is specified the script will be executed directly, which will likely only succeed for scripts with shebang lines. Possible values: ["SHELL", "POWERSHELL"]
        :param local_path: An absolute path to the executable on the VM.
        """
        self._values = {
        }
        if allowed_success_codes is not None: self._values["allowed_success_codes"] = allowed_success_codes
        if gcs_object is not None: self._values["gcs_object"] = gcs_object
        if interpreter is not None: self._values["interpreter"] = interpreter
        if local_path is not None: self._values["local_path"] = local_path

    @builtins.property
    def allowed_success_codes(self) -> typing.Optional[typing.List[jsii.Number]]:
        """Defaults to [0].

        A list of possible return values that the execution can return to indicate a success.
        """
        return self._values.get('allowed_success_codes')

    @builtins.property
    def gcs_object(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentPatchConfigPreStepWindowsExecStepConfigGcsObject"]]:
        """gcs_object block."""
        return self._values.get('gcs_object')

    @builtins.property
    def interpreter(self) -> typing.Optional[str]:
        """The script interpreter to use to run the script.

        If no interpreter is specified the script will
        be executed directly, which will likely only succeed for scripts with shebang lines. Possible values: ["SHELL", "POWERSHELL"]
        """
        return self._values.get('interpreter')

    @builtins.property
    def local_path(self) -> typing.Optional[str]:
        """An absolute path to the executable on the VM."""
        return self._values.get('local_path')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigPreStepWindowsExecStepConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigPreStepWindowsExecStepConfigGcsObject", jsii_struct_bases=[], name_mapping={'bucket': 'bucket', 'generation_number': 'generationNumber', 'object': 'object'})
class OsConfigPatchDeploymentPatchConfigPreStepWindowsExecStepConfigGcsObject():
    def __init__(self, *, bucket: str, generation_number: str, object: str) -> None:
        """
        :param bucket: Bucket of the Cloud Storage object.
        :param generation_number: Generation number of the Cloud Storage object. This is used to ensure that the ExecStep specified by this PatchJob does not change.
        :param object: Name of the Cloud Storage object.
        """
        self._values = {
            'bucket': bucket,
            'generation_number': generation_number,
            'object': object,
        }

    @builtins.property
    def bucket(self) -> str:
        """Bucket of the Cloud Storage object."""
        return self._values.get('bucket')

    @builtins.property
    def generation_number(self) -> str:
        """Generation number of the Cloud Storage object.

        This is used to ensure that the ExecStep specified by this PatchJob does not change.
        """
        return self._values.get('generation_number')

    @builtins.property
    def object(self) -> str:
        """Name of the Cloud Storage object."""
        return self._values.get('object')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigPreStepWindowsExecStepConfigGcsObject(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigWindowsUpdate", jsii_struct_bases=[], name_mapping={'classifications': 'classifications', 'excludes': 'excludes', 'exclusive_patches': 'exclusivePatches'})
class OsConfigPatchDeploymentPatchConfigWindowsUpdate():
    def __init__(self, *, classifications: typing.Optional[typing.List[str]]=None, excludes: typing.Optional[typing.List[str]]=None, exclusive_patches: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param classifications: Only apply updates of these windows update classifications. If empty, all updates are applied. Possible values: ["CRITICAL", "SECURITY", "DEFINITION", "DRIVER", "FEATURE_PACK", "SERVICE_PACK", "TOOL", "UPDATE_ROLLUP", "UPDATE"]
        :param excludes: List of KBs to exclude from update.
        :param exclusive_patches: An exclusive list of kbs to be updated. These are the only patches that will be updated. This field must not be used with other patch configurations.
        """
        self._values = {
        }
        if classifications is not None: self._values["classifications"] = classifications
        if excludes is not None: self._values["excludes"] = excludes
        if exclusive_patches is not None: self._values["exclusive_patches"] = exclusive_patches

    @builtins.property
    def classifications(self) -> typing.Optional[typing.List[str]]:
        """Only apply updates of these windows update classifications.

        If empty, all updates are applied. Possible values: ["CRITICAL", "SECURITY", "DEFINITION", "DRIVER", "FEATURE_PACK", "SERVICE_PACK", "TOOL", "UPDATE_ROLLUP", "UPDATE"]
        """
        return self._values.get('classifications')

    @builtins.property
    def excludes(self) -> typing.Optional[typing.List[str]]:
        """List of KBs to exclude from update."""
        return self._values.get('excludes')

    @builtins.property
    def exclusive_patches(self) -> typing.Optional[typing.List[str]]:
        """An exclusive list of kbs to be updated.

        These are the only patches that will be updated.
        This field must not be used with other patch configurations.
        """
        return self._values.get('exclusive_patches')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigWindowsUpdate(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigYum", jsii_struct_bases=[], name_mapping={'excludes': 'excludes', 'exclusive_packages': 'exclusivePackages', 'minimal': 'minimal', 'security': 'security'})
class OsConfigPatchDeploymentPatchConfigYum():
    def __init__(self, *, excludes: typing.Optional[typing.List[str]]=None, exclusive_packages: typing.Optional[typing.List[str]]=None, minimal: typing.Optional[bool]=None, security: typing.Optional[bool]=None) -> None:
        """
        :param excludes: List of packages to exclude from update. These packages will be excluded.
        :param exclusive_packages: An exclusive list of packages to be updated. These are the only packages that will be updated. If these packages are not installed, they will be ignored. This field cannot be specified with any other patch configuration fields.
        :param minimal: Will cause patch to run yum update-minimal instead.
        :param security: Adds the --security flag to yum update. Not supported on all platforms.
        """
        self._values = {
        }
        if excludes is not None: self._values["excludes"] = excludes
        if exclusive_packages is not None: self._values["exclusive_packages"] = exclusive_packages
        if minimal is not None: self._values["minimal"] = minimal
        if security is not None: self._values["security"] = security

    @builtins.property
    def excludes(self) -> typing.Optional[typing.List[str]]:
        """List of packages to exclude from update.

        These packages will be excluded.
        """
        return self._values.get('excludes')

    @builtins.property
    def exclusive_packages(self) -> typing.Optional[typing.List[str]]:
        """An exclusive list of packages to be updated.

        These are the only packages that will be updated.
        If these packages are not installed, they will be ignored. This field cannot be specified with
        any other patch configuration fields.
        """
        return self._values.get('exclusive_packages')

    @builtins.property
    def minimal(self) -> typing.Optional[bool]:
        """Will cause patch to run yum update-minimal instead."""
        return self._values.get('minimal')

    @builtins.property
    def security(self) -> typing.Optional[bool]:
        """Adds the --security flag to yum update.

        Not supported on all platforms.
        """
        return self._values.get('security')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigYum(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentPatchConfigZypper", jsii_struct_bases=[], name_mapping={'categories': 'categories', 'excludes': 'excludes', 'exclusive_patches': 'exclusivePatches', 'severities': 'severities', 'with_optional': 'withOptional', 'with_update': 'withUpdate'})
class OsConfigPatchDeploymentPatchConfigZypper():
    def __init__(self, *, categories: typing.Optional[typing.List[str]]=None, excludes: typing.Optional[typing.List[str]]=None, exclusive_patches: typing.Optional[typing.List[str]]=None, severities: typing.Optional[typing.List[str]]=None, with_optional: typing.Optional[bool]=None, with_update: typing.Optional[bool]=None) -> None:
        """
        :param categories: Install only patches with these categories. Common categories include security, recommended, and feature.
        :param excludes: List of packages to exclude from update.
        :param exclusive_patches: An exclusive list of patches to be updated. These are the only patches that will be installed using 'zypper patch patch:' command. This field must not be used with any other patch configuration fields.
        :param severities: Install only patches with these severities. Common severities include critical, important, moderate, and low.
        :param with_optional: Adds the --with-optional flag to zypper patch.
        :param with_update: Adds the --with-update flag, to zypper patch.
        """
        self._values = {
        }
        if categories is not None: self._values["categories"] = categories
        if excludes is not None: self._values["excludes"] = excludes
        if exclusive_patches is not None: self._values["exclusive_patches"] = exclusive_patches
        if severities is not None: self._values["severities"] = severities
        if with_optional is not None: self._values["with_optional"] = with_optional
        if with_update is not None: self._values["with_update"] = with_update

    @builtins.property
    def categories(self) -> typing.Optional[typing.List[str]]:
        """Install only patches with these categories.

        Common categories include security, recommended, and feature.
        """
        return self._values.get('categories')

    @builtins.property
    def excludes(self) -> typing.Optional[typing.List[str]]:
        """List of packages to exclude from update."""
        return self._values.get('excludes')

    @builtins.property
    def exclusive_patches(self) -> typing.Optional[typing.List[str]]:
        """An exclusive list of patches to be updated.

        These are the only patches that will be installed using 'zypper patch patch:' command.
        This field must not be used with any other patch configuration fields.
        """
        return self._values.get('exclusive_patches')

    @builtins.property
    def severities(self) -> typing.Optional[typing.List[str]]:
        """Install only patches with these severities.

        Common severities include critical, important, moderate, and low.
        """
        return self._values.get('severities')

    @builtins.property
    def with_optional(self) -> typing.Optional[bool]:
        """Adds the --with-optional flag to zypper patch."""
        return self._values.get('with_optional')

    @builtins.property
    def with_update(self) -> typing.Optional[bool]:
        """Adds the --with-update flag, to zypper patch."""
        return self._values.get('with_update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentPatchConfigZypper(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentRecurringSchedule", jsii_struct_bases=[], name_mapping={'time_of_day': 'timeOfDay', 'time_zone': 'timeZone', 'end_time': 'endTime', 'monthly': 'monthly', 'start_time': 'startTime', 'weekly': 'weekly'})
class OsConfigPatchDeploymentRecurringSchedule():
    def __init__(self, *, time_of_day: typing.List["OsConfigPatchDeploymentRecurringScheduleTimeOfDay"], time_zone: typing.List["OsConfigPatchDeploymentRecurringScheduleTimeZone"], end_time: typing.Optional[str]=None, monthly: typing.Optional[typing.List["OsConfigPatchDeploymentRecurringScheduleMonthly"]]=None, start_time: typing.Optional[str]=None, weekly: typing.Optional[typing.List["OsConfigPatchDeploymentRecurringScheduleWeekly"]]=None) -> None:
        """
        :param time_of_day: time_of_day block.
        :param time_zone: time_zone block.
        :param end_time: The end time at which a recurring patch deployment schedule is no longer active. A timestamp in RFC3339 UTC "Zulu" format, accurate to nanoseconds. Example: "2014-10-02T15:01:23.045123456Z".
        :param monthly: monthly block.
        :param start_time: The time that the recurring schedule becomes effective. Defaults to createTime of the patch deployment. A timestamp in RFC3339 UTC "Zulu" format, accurate to nanoseconds. Example: "2014-10-02T15:01:23.045123456Z".
        :param weekly: weekly block.
        """
        self._values = {
            'time_of_day': time_of_day,
            'time_zone': time_zone,
        }
        if end_time is not None: self._values["end_time"] = end_time
        if monthly is not None: self._values["monthly"] = monthly
        if start_time is not None: self._values["start_time"] = start_time
        if weekly is not None: self._values["weekly"] = weekly

    @builtins.property
    def time_of_day(self) -> typing.List["OsConfigPatchDeploymentRecurringScheduleTimeOfDay"]:
        """time_of_day block."""
        return self._values.get('time_of_day')

    @builtins.property
    def time_zone(self) -> typing.List["OsConfigPatchDeploymentRecurringScheduleTimeZone"]:
        """time_zone block."""
        return self._values.get('time_zone')

    @builtins.property
    def end_time(self) -> typing.Optional[str]:
        """The end time at which a recurring patch deployment schedule is no longer active.

        A timestamp in RFC3339 UTC "Zulu" format, accurate to nanoseconds. Example: "2014-10-02T15:01:23.045123456Z".
        """
        return self._values.get('end_time')

    @builtins.property
    def monthly(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentRecurringScheduleMonthly"]]:
        """monthly block."""
        return self._values.get('monthly')

    @builtins.property
    def start_time(self) -> typing.Optional[str]:
        """The time that the recurring schedule becomes effective.

        Defaults to createTime of the patch deployment.
        A timestamp in RFC3339 UTC "Zulu" format, accurate to nanoseconds. Example: "2014-10-02T15:01:23.045123456Z".
        """
        return self._values.get('start_time')

    @builtins.property
    def weekly(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentRecurringScheduleWeekly"]]:
        """weekly block."""
        return self._values.get('weekly')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentRecurringSchedule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentRecurringScheduleMonthly", jsii_struct_bases=[], name_mapping={'month_day': 'monthDay', 'week_day_of_month': 'weekDayOfMonth'})
class OsConfigPatchDeploymentRecurringScheduleMonthly():
    def __init__(self, *, month_day: typing.Optional[jsii.Number]=None, week_day_of_month: typing.Optional[typing.List["OsConfigPatchDeploymentRecurringScheduleMonthlyWeekDayOfMonth"]]=None) -> None:
        """
        :param month_day: One day of the month. 1-31 indicates the 1st to the 31st day. -1 indicates the last day of the month. Months without the target day will be skipped. For example, a schedule to run "every month on the 31st" will not run in February, April, June, etc.
        :param week_day_of_month: week_day_of_month block.
        """
        self._values = {
        }
        if month_day is not None: self._values["month_day"] = month_day
        if week_day_of_month is not None: self._values["week_day_of_month"] = week_day_of_month

    @builtins.property
    def month_day(self) -> typing.Optional[jsii.Number]:
        """One day of the month.

        1-31 indicates the 1st to the 31st day. -1 indicates the last day of the month.
        Months without the target day will be skipped. For example, a schedule to run "every month on the 31st"
        will not run in February, April, June, etc.
        """
        return self._values.get('month_day')

    @builtins.property
    def week_day_of_month(self) -> typing.Optional[typing.List["OsConfigPatchDeploymentRecurringScheduleMonthlyWeekDayOfMonth"]]:
        """week_day_of_month block."""
        return self._values.get('week_day_of_month')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentRecurringScheduleMonthly(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentRecurringScheduleMonthlyWeekDayOfMonth", jsii_struct_bases=[], name_mapping={'day_of_week': 'dayOfWeek', 'week_ordinal': 'weekOrdinal'})
class OsConfigPatchDeploymentRecurringScheduleMonthlyWeekDayOfMonth():
    def __init__(self, *, day_of_week: str, week_ordinal: jsii.Number) -> None:
        """
        :param day_of_week: A day of the week. Possible values: ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"]
        :param week_ordinal: Week number in a month. 1-4 indicates the 1st to 4th week of the month. -1 indicates the last week of the month.
        """
        self._values = {
            'day_of_week': day_of_week,
            'week_ordinal': week_ordinal,
        }

    @builtins.property
    def day_of_week(self) -> str:
        """A day of the week.

        Possible values: ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"]
        """
        return self._values.get('day_of_week')

    @builtins.property
    def week_ordinal(self) -> jsii.Number:
        """Week number in a month.

        1-4 indicates the 1st to 4th week of the month. -1 indicates the last week of the month.
        """
        return self._values.get('week_ordinal')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentRecurringScheduleMonthlyWeekDayOfMonth(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentRecurringScheduleTimeOfDay", jsii_struct_bases=[], name_mapping={'hours': 'hours', 'minutes': 'minutes', 'nanos': 'nanos', 'seconds': 'seconds'})
class OsConfigPatchDeploymentRecurringScheduleTimeOfDay():
    def __init__(self, *, hours: typing.Optional[jsii.Number]=None, minutes: typing.Optional[jsii.Number]=None, nanos: typing.Optional[jsii.Number]=None, seconds: typing.Optional[jsii.Number]=None) -> None:
        """
        :param hours: Hours of day in 24 hour format. Should be from 0 to 23. An API may choose to allow the value "24:00:00" for scenarios like business closing time.
        :param minutes: Minutes of hour of day. Must be from 0 to 59.
        :param nanos: Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
        :param seconds: Seconds of minutes of the time. Must normally be from 0 to 59. An API may allow the value 60 if it allows leap-seconds.
        """
        self._values = {
        }
        if hours is not None: self._values["hours"] = hours
        if minutes is not None: self._values["minutes"] = minutes
        if nanos is not None: self._values["nanos"] = nanos
        if seconds is not None: self._values["seconds"] = seconds

    @builtins.property
    def hours(self) -> typing.Optional[jsii.Number]:
        """Hours of day in 24 hour format.

        Should be from 0 to 23.
        An API may choose to allow the value "24:00:00" for scenarios like business closing time.
        """
        return self._values.get('hours')

    @builtins.property
    def minutes(self) -> typing.Optional[jsii.Number]:
        """Minutes of hour of day.

        Must be from 0 to 59.
        """
        return self._values.get('minutes')

    @builtins.property
    def nanos(self) -> typing.Optional[jsii.Number]:
        """Fractions of seconds in nanoseconds.

        Must be from 0 to 999,999,999.
        """
        return self._values.get('nanos')

    @builtins.property
    def seconds(self) -> typing.Optional[jsii.Number]:
        """Seconds of minutes of the time.

        Must normally be from 0 to 59. An API may allow the value 60 if it allows leap-seconds.
        """
        return self._values.get('seconds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentRecurringScheduleTimeOfDay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentRecurringScheduleTimeZone", jsii_struct_bases=[], name_mapping={'id': 'id', 'version': 'version'})
class OsConfigPatchDeploymentRecurringScheduleTimeZone():
    def __init__(self, *, id: str, version: typing.Optional[str]=None) -> None:
        """
        :param id: IANA Time Zone Database time zone, e.g. "America/New_York".
        :param version: IANA Time Zone Database version number, e.g. "2019a".
        """
        self._values = {
            'id': id,
        }
        if version is not None: self._values["version"] = version

    @builtins.property
    def id(self) -> str:
        """IANA Time Zone Database time zone, e.g. "America/New_York"."""
        return self._values.get('id')

    @builtins.property
    def version(self) -> typing.Optional[str]:
        """IANA Time Zone Database version number, e.g. "2019a"."""
        return self._values.get('version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentRecurringScheduleTimeZone(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentRecurringScheduleWeekly", jsii_struct_bases=[], name_mapping={'day_of_week': 'dayOfWeek'})
class OsConfigPatchDeploymentRecurringScheduleWeekly():
    def __init__(self, *, day_of_week: str) -> None:
        """
        :param day_of_week: IANA Time Zone Database time zone, e.g. "America/New_York". Possible values: ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"].
        """
        self._values = {
            'day_of_week': day_of_week,
        }

    @builtins.property
    def day_of_week(self) -> str:
        """IANA Time Zone Database time zone, e.g. "America/New_York". Possible values: ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"]."""
        return self._values.get('day_of_week')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentRecurringScheduleWeekly(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsConfigPatchDeploymentTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class OsConfigPatchDeploymentTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsConfigPatchDeploymentTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class OsLoginSshPublicKey(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.OsLoginSshPublicKey"):
    def __init__(self, scope: constructs.Construct, id: str, *, key: str, user: str, expiration_time_usec: typing.Optional[str]=None, timeouts: typing.Optional["OsLoginSshPublicKeyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param key: Public key text in SSH format, defined by RFC4253 section 6.6.
        :param user: The user email.
        :param expiration_time_usec: An expiration time in microseconds since epoch.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = OsLoginSshPublicKeyConfig(key=key, user=user, expiration_time_usec=expiration_time_usec, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(OsLoginSshPublicKey, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="fingerprint")
    def fingerprint(self) -> str:
        return jsii.get(self, "fingerprint")

    @builtins.property
    @jsii.member(jsii_name="key")
    def key(self) -> str:
        return jsii.get(self, "key")

    @key.setter
    def key(self, value: str) -> None:
        jsii.set(self, "key", value)

    @builtins.property
    @jsii.member(jsii_name="user")
    def user(self) -> str:
        return jsii.get(self, "user")

    @user.setter
    def user(self, value: str) -> None:
        jsii.set(self, "user", value)

    @builtins.property
    @jsii.member(jsii_name="expirationTimeUsec")
    def expiration_time_usec(self) -> typing.Optional[str]:
        return jsii.get(self, "expirationTimeUsec")

    @expiration_time_usec.setter
    def expiration_time_usec(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "expirationTimeUsec", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["OsLoginSshPublicKeyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["OsLoginSshPublicKeyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.OsLoginSshPublicKeyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'key': 'key', 'user': 'user', 'expiration_time_usec': 'expirationTimeUsec', 'timeouts': 'timeouts'})
class OsLoginSshPublicKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, key: str, user: str, expiration_time_usec: typing.Optional[str]=None, timeouts: typing.Optional["OsLoginSshPublicKeyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param key: Public key text in SSH format, defined by RFC4253 section 6.6.
        :param user: The user email.
        :param expiration_time_usec: An expiration time in microseconds since epoch.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = OsLoginSshPublicKeyTimeouts(**timeouts)
        self._values = {
            'key': key,
            'user': user,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if expiration_time_usec is not None: self._values["expiration_time_usec"] = expiration_time_usec
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def key(self) -> str:
        """Public key text in SSH format, defined by RFC4253 section 6.6."""
        return self._values.get('key')

    @builtins.property
    def user(self) -> str:
        """The user email."""
        return self._values.get('user')

    @builtins.property
    def expiration_time_usec(self) -> typing.Optional[str]:
        """An expiration time in microseconds since epoch."""
        return self._values.get('expiration_time_usec')

    @builtins.property
    def timeouts(self) -> typing.Optional["OsLoginSshPublicKeyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsLoginSshPublicKeyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.OsLoginSshPublicKeyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class OsLoginSshPublicKeyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'OsLoginSshPublicKeyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class Project(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.Project"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project_id: str, auto_create_network: typing.Optional[bool]=None, billing_account: typing.Optional[str]=None, folder_id: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, org_id: typing.Optional[str]=None, skip_delete: typing.Optional[bool]=None, timeouts: typing.Optional["ProjectTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The display name of the project.
        :param project_id: The project ID. Changing this forces a new project to be created.
        :param auto_create_network: Create the 'default' network automatically. Default true. If set to false, the default network will be deleted. Note that, for quota purposes, you will still need to have 1 network slot available to create the project successfully, even if you set auto_create_network to false, since the network will exist momentarily.
        :param billing_account: The alphanumeric ID of the billing account this project belongs to. The user or service account performing this operation with Terraform must have Billing Account Administrator privileges (roles/billing.admin) in the organization. See Google Cloud Billing API Access Control for more details.
        :param folder_id: The numeric ID of the folder this project should be created under. Only one of org_id or folder_id may be specified. If the folder_id is specified, then the project is created under the specified folder. Changing this forces the project to be migrated to the newly specified folder.
        :param labels: A set of key/value label pairs to assign to the project.
        :param org_id: The numeric ID of the organization this project belongs to. Changing this forces a new project to be created. Only one of org_id or folder_id may be specified. If the org_id is specified then the project is created at the top level. Changing this forces the project to be migrated to the newly specified organization.
        :param skip_delete: If true, the Terraform resource can be deleted without deleting the Project via the Google API.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ProjectConfig(name=name, project_id=project_id, auto_create_network=auto_create_network, billing_account=billing_account, folder_id=folder_id, labels=labels, org_id=org_id, skip_delete=skip_delete, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(Project, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="number")
    def number(self) -> str:
        return jsii.get(self, "number")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="projectId")
    def project_id(self) -> str:
        return jsii.get(self, "projectId")

    @project_id.setter
    def project_id(self, value: str) -> None:
        jsii.set(self, "projectId", value)

    @builtins.property
    @jsii.member(jsii_name="autoCreateNetwork")
    def auto_create_network(self) -> typing.Optional[bool]:
        return jsii.get(self, "autoCreateNetwork")

    @auto_create_network.setter
    def auto_create_network(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "autoCreateNetwork", value)

    @builtins.property
    @jsii.member(jsii_name="billingAccount")
    def billing_account(self) -> typing.Optional[str]:
        return jsii.get(self, "billingAccount")

    @billing_account.setter
    def billing_account(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "billingAccount", value)

    @builtins.property
    @jsii.member(jsii_name="folderId")
    def folder_id(self) -> typing.Optional[str]:
        return jsii.get(self, "folderId")

    @folder_id.setter
    def folder_id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "folderId", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="orgId")
    def org_id(self) -> typing.Optional[str]:
        return jsii.get(self, "orgId")

    @org_id.setter
    def org_id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "orgId", value)

    @builtins.property
    @jsii.member(jsii_name="skipDelete")
    def skip_delete(self) -> typing.Optional[bool]:
        return jsii.get(self, "skipDelete")

    @skip_delete.setter
    def skip_delete(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "skipDelete", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ProjectTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ProjectTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project_id': 'projectId', 'auto_create_network': 'autoCreateNetwork', 'billing_account': 'billingAccount', 'folder_id': 'folderId', 'labels': 'labels', 'org_id': 'orgId', 'skip_delete': 'skipDelete', 'timeouts': 'timeouts'})
class ProjectConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project_id: str, auto_create_network: typing.Optional[bool]=None, billing_account: typing.Optional[str]=None, folder_id: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, org_id: typing.Optional[str]=None, skip_delete: typing.Optional[bool]=None, timeouts: typing.Optional["ProjectTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The display name of the project.
        :param project_id: The project ID. Changing this forces a new project to be created.
        :param auto_create_network: Create the 'default' network automatically. Default true. If set to false, the default network will be deleted. Note that, for quota purposes, you will still need to have 1 network slot available to create the project successfully, even if you set auto_create_network to false, since the network will exist momentarily.
        :param billing_account: The alphanumeric ID of the billing account this project belongs to. The user or service account performing this operation with Terraform must have Billing Account Administrator privileges (roles/billing.admin) in the organization. See Google Cloud Billing API Access Control for more details.
        :param folder_id: The numeric ID of the folder this project should be created under. Only one of org_id or folder_id may be specified. If the folder_id is specified, then the project is created under the specified folder. Changing this forces the project to be migrated to the newly specified folder.
        :param labels: A set of key/value label pairs to assign to the project.
        :param org_id: The numeric ID of the organization this project belongs to. Changing this forces a new project to be created. Only one of org_id or folder_id may be specified. If the org_id is specified then the project is created at the top level. Changing this forces the project to be migrated to the newly specified organization.
        :param skip_delete: If true, the Terraform resource can be deleted without deleting the Project via the Google API.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ProjectTimeouts(**timeouts)
        self._values = {
            'name': name,
            'project_id': project_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if auto_create_network is not None: self._values["auto_create_network"] = auto_create_network
        if billing_account is not None: self._values["billing_account"] = billing_account
        if folder_id is not None: self._values["folder_id"] = folder_id
        if labels is not None: self._values["labels"] = labels
        if org_id is not None: self._values["org_id"] = org_id
        if skip_delete is not None: self._values["skip_delete"] = skip_delete
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The display name of the project."""
        return self._values.get('name')

    @builtins.property
    def project_id(self) -> str:
        """The project ID.

        Changing this forces a new project to be created.
        """
        return self._values.get('project_id')

    @builtins.property
    def auto_create_network(self) -> typing.Optional[bool]:
        """Create the 'default' network automatically.

        Default true. If set to false, the default network will be deleted.  Note that, for quota purposes, you will still need to have 1 network slot available to create the project successfully, even if you set auto_create_network to false, since the network will exist momentarily.
        """
        return self._values.get('auto_create_network')

    @builtins.property
    def billing_account(self) -> typing.Optional[str]:
        """The alphanumeric ID of the billing account this project belongs to.

        The user or service account performing this operation with Terraform must have Billing Account Administrator privileges (roles/billing.admin) in the organization. See Google Cloud Billing API Access Control for more details.
        """
        return self._values.get('billing_account')

    @builtins.property
    def folder_id(self) -> typing.Optional[str]:
        """The numeric ID of the folder this project should be created under.

        Only one of org_id or folder_id may be specified. If the folder_id is specified, then the project is created under the specified folder. Changing this forces the project to be migrated to the newly specified folder.
        """
        return self._values.get('folder_id')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value label pairs to assign to the project."""
        return self._values.get('labels')

    @builtins.property
    def org_id(self) -> typing.Optional[str]:
        """The numeric ID of the organization this project belongs to.

        Changing this forces a new project to be created.  Only one of org_id or folder_id may be specified. If the org_id is specified then the project is created at the top level. Changing this forces the project to be migrated to the newly specified organization.
        """
        return self._values.get('org_id')

    @builtins.property
    def skip_delete(self) -> typing.Optional[bool]:
        """If true, the Terraform resource can be deleted without deleting the Project via the Google API."""
        return self._values.get('skip_delete')

    @builtins.property
    def timeouts(self) -> typing.Optional["ProjectTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ProjectIamAuditConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ProjectIamAuditConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, audit_log_config: typing.List["ProjectIamAuditConfigAuditLogConfig"], service: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param audit_log_config: audit_log_config block.
        :param service: Service which will be enabled for audit logging. The special value allServices covers all services.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ProjectIamAuditConfigConfig(audit_log_config=audit_log_config, service=service, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ProjectIamAuditConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="auditLogConfig")
    def audit_log_config(self) -> typing.List["ProjectIamAuditConfigAuditLogConfig"]:
        return jsii.get(self, "auditLogConfig")

    @audit_log_config.setter
    def audit_log_config(self, value: typing.List["ProjectIamAuditConfigAuditLogConfig"]) -> None:
        jsii.set(self, "auditLogConfig", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectIamAuditConfigAuditLogConfig", jsii_struct_bases=[], name_mapping={'log_type': 'logType', 'exempted_members': 'exemptedMembers'})
class ProjectIamAuditConfigAuditLogConfig():
    def __init__(self, *, log_type: str, exempted_members: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param log_type: Permission type for which logging is to be configured. Must be one of DATA_READ, DATA_WRITE, or ADMIN_READ.
        :param exempted_members: Identities that do not cause logging for this type of permission. Each entry can have one of the following values:user:{emailid}: An email address that represents a specific Google account. For example, alice@gmail.com or joe@example.com. serviceAccount:{emailid}: An email address that represents a service account. For example, my-other-app@appspot.gserviceaccount.com. group:{emailid}: An email address that represents a Google group. For example, admins@example.com. domain:{domain}: A G Suite domain (primary, instead of alias) name that represents all the users of that domain. For example, google.com or example.com.
        """
        self._values = {
            'log_type': log_type,
        }
        if exempted_members is not None: self._values["exempted_members"] = exempted_members

    @builtins.property
    def log_type(self) -> str:
        """Permission type for which logging is to be configured.

        Must be one of DATA_READ, DATA_WRITE, or ADMIN_READ.
        """
        return self._values.get('log_type')

    @builtins.property
    def exempted_members(self) -> typing.Optional[typing.List[str]]:
        """Identities that do not cause logging for this type of permission.

        Each entry can have one of the following values:user:{emailid}: An email address that represents a specific Google account. For example, alice@gmail.com or joe@example.com. serviceAccount:{emailid}: An email address that represents a service account. For example, my-other-app@appspot.gserviceaccount.com. group:{emailid}: An email address that represents a Google group. For example, admins@example.com. domain:{domain}: A G Suite domain (primary, instead of alias) name that represents all the users of that domain. For example, google.com or example.com.
        """
        return self._values.get('exempted_members')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectIamAuditConfigAuditLogConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectIamAuditConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'audit_log_config': 'auditLogConfig', 'service': 'service', 'project': 'project'})
class ProjectIamAuditConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, audit_log_config: typing.List["ProjectIamAuditConfigAuditLogConfig"], service: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param audit_log_config: audit_log_config block.
        :param service: Service which will be enabled for audit logging. The special value allServices covers all services.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'audit_log_config': audit_log_config,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def audit_log_config(self) -> typing.List["ProjectIamAuditConfigAuditLogConfig"]:
        """audit_log_config block."""
        return self._values.get('audit_log_config')

    @builtins.property
    def service(self) -> str:
        """Service which will be enabled for audit logging.

        The special value allServices covers all services.
        """
        return self._values.get('service')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectIamAuditConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ProjectIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ProjectIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], role: str, condition: typing.Optional[typing.List["ProjectIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ProjectIamBindingConfig(members=members, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ProjectIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["ProjectIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["ProjectIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class ProjectIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class ProjectIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], role: str, condition: typing.Optional[typing.List["ProjectIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["ProjectIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ProjectIamCustomRole(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ProjectIamCustomRole"):
    def __init__(self, scope: constructs.Construct, id: str, *, permissions: typing.List[str], role_id: str, title: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, stage: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param permissions: The names of the permissions this role grants when bound in an IAM policy. At least one permission must be specified.
        :param role_id: The camel case role id to use for this role. Cannot contain - characters.
        :param title: A human-readable title for the role.
        :param description: A human-readable description for the role.
        :param project: The project that the service account will be created in. Defaults to the provider project configuration.
        :param stage: The current launch stage of the role. Defaults to GA.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ProjectIamCustomRoleConfig(permissions=permissions, role_id=role_id, title=title, description=description, project=project, stage=stage, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ProjectIamCustomRole, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="deleted")
    def deleted(self) -> bool:
        return jsii.get(self, "deleted")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="permissions")
    def permissions(self) -> typing.List[str]:
        return jsii.get(self, "permissions")

    @permissions.setter
    def permissions(self, value: typing.List[str]) -> None:
        jsii.set(self, "permissions", value)

    @builtins.property
    @jsii.member(jsii_name="roleId")
    def role_id(self) -> str:
        return jsii.get(self, "roleId")

    @role_id.setter
    def role_id(self, value: str) -> None:
        jsii.set(self, "roleId", value)

    @builtins.property
    @jsii.member(jsii_name="title")
    def title(self) -> str:
        return jsii.get(self, "title")

    @title.setter
    def title(self, value: str) -> None:
        jsii.set(self, "title", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="stage")
    def stage(self) -> typing.Optional[str]:
        return jsii.get(self, "stage")

    @stage.setter
    def stage(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "stage", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectIamCustomRoleConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'permissions': 'permissions', 'role_id': 'roleId', 'title': 'title', 'description': 'description', 'project': 'project', 'stage': 'stage'})
class ProjectIamCustomRoleConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, permissions: typing.List[str], role_id: str, title: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, stage: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param permissions: The names of the permissions this role grants when bound in an IAM policy. At least one permission must be specified.
        :param role_id: The camel case role id to use for this role. Cannot contain - characters.
        :param title: A human-readable title for the role.
        :param description: A human-readable description for the role.
        :param project: The project that the service account will be created in. Defaults to the provider project configuration.
        :param stage: The current launch stage of the role. Defaults to GA.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'permissions': permissions,
            'role_id': role_id,
            'title': title,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project
        if stage is not None: self._values["stage"] = stage

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def permissions(self) -> typing.List[str]:
        """The names of the permissions this role grants when bound in an IAM policy.

        At least one permission must be specified.
        """
        return self._values.get('permissions')

    @builtins.property
    def role_id(self) -> str:
        """The camel case role id to use for this role.

        Cannot contain - characters.
        """
        return self._values.get('role_id')

    @builtins.property
    def title(self) -> str:
        """A human-readable title for the role."""
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A human-readable description for the role."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The project that the service account will be created in.

        Defaults to the provider project configuration.
        """
        return self._values.get('project')

    @builtins.property
    def stage(self) -> typing.Optional[str]:
        """The current launch stage of the role.

        Defaults to GA.
        """
        return self._values.get('stage')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectIamCustomRoleConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ProjectIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ProjectIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, role: str, condition: typing.Optional[typing.List["ProjectIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ProjectIamMemberConfig(member=member, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ProjectIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["ProjectIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["ProjectIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class ProjectIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class ProjectIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, role: str, condition: typing.Optional[typing.List["ProjectIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["ProjectIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ProjectIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ProjectIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_data: str, project: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_data: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ProjectIamPolicyConfig(policy_data=policy_data, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ProjectIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> str:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: str) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_data': 'policyData', 'project': 'project'})
class ProjectIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_data: str, project: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_data: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'policy_data': policy_data,
            'project': project,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> str:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ProjectOrganizationPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ProjectOrganizationPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, constraint: str, project: str, boolean_policy: typing.Optional[typing.List["ProjectOrganizationPolicyBooleanPolicy"]]=None, list_policy: typing.Optional[typing.List["ProjectOrganizationPolicyListPolicy"]]=None, restore_policy: typing.Optional[typing.List["ProjectOrganizationPolicyRestorePolicy"]]=None, timeouts: typing.Optional["ProjectOrganizationPolicyTimeouts"]=None, version: typing.Optional[jsii.Number]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param constraint: The name of the Constraint the Policy is configuring, for example, serviceuser.services.
        :param project: The project ID.
        :param boolean_policy: boolean_policy block.
        :param list_policy: list_policy block.
        :param restore_policy: restore_policy block.
        :param timeouts: timeouts block.
        :param version: Version of the Policy. Default version is 0.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ProjectOrganizationPolicyConfig(constraint=constraint, project=project, boolean_policy=boolean_policy, list_policy=list_policy, restore_policy=restore_policy, timeouts=timeouts, version=version, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ProjectOrganizationPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="updateTime")
    def update_time(self) -> str:
        return jsii.get(self, "updateTime")

    @builtins.property
    @jsii.member(jsii_name="constraint")
    def constraint(self) -> str:
        return jsii.get(self, "constraint")

    @constraint.setter
    def constraint(self, value: str) -> None:
        jsii.set(self, "constraint", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> str:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: str) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="booleanPolicy")
    def boolean_policy(self) -> typing.Optional[typing.List["ProjectOrganizationPolicyBooleanPolicy"]]:
        return jsii.get(self, "booleanPolicy")

    @boolean_policy.setter
    def boolean_policy(self, value: typing.Optional[typing.List["ProjectOrganizationPolicyBooleanPolicy"]]) -> None:
        jsii.set(self, "booleanPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="listPolicy")
    def list_policy(self) -> typing.Optional[typing.List["ProjectOrganizationPolicyListPolicy"]]:
        return jsii.get(self, "listPolicy")

    @list_policy.setter
    def list_policy(self, value: typing.Optional[typing.List["ProjectOrganizationPolicyListPolicy"]]) -> None:
        jsii.set(self, "listPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="restorePolicy")
    def restore_policy(self) -> typing.Optional[typing.List["ProjectOrganizationPolicyRestorePolicy"]]:
        return jsii.get(self, "restorePolicy")

    @restore_policy.setter
    def restore_policy(self, value: typing.Optional[typing.List["ProjectOrganizationPolicyRestorePolicy"]]) -> None:
        jsii.set(self, "restorePolicy", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ProjectOrganizationPolicyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ProjectOrganizationPolicyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)

    @builtins.property
    @jsii.member(jsii_name="version")
    def version(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "version")

    @version.setter
    def version(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "version", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectOrganizationPolicyBooleanPolicy", jsii_struct_bases=[], name_mapping={'enforced': 'enforced'})
class ProjectOrganizationPolicyBooleanPolicy():
    def __init__(self, *, enforced: bool) -> None:
        """
        :param enforced: If true, then the Policy is enforced. If false, then any configuration is acceptable.
        """
        self._values = {
            'enforced': enforced,
        }

    @builtins.property
    def enforced(self) -> bool:
        """If true, then the Policy is enforced.

        If false, then any configuration is acceptable.
        """
        return self._values.get('enforced')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectOrganizationPolicyBooleanPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectOrganizationPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'constraint': 'constraint', 'project': 'project', 'boolean_policy': 'booleanPolicy', 'list_policy': 'listPolicy', 'restore_policy': 'restorePolicy', 'timeouts': 'timeouts', 'version': 'version'})
class ProjectOrganizationPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, constraint: str, project: str, boolean_policy: typing.Optional[typing.List["ProjectOrganizationPolicyBooleanPolicy"]]=None, list_policy: typing.Optional[typing.List["ProjectOrganizationPolicyListPolicy"]]=None, restore_policy: typing.Optional[typing.List["ProjectOrganizationPolicyRestorePolicy"]]=None, timeouts: typing.Optional["ProjectOrganizationPolicyTimeouts"]=None, version: typing.Optional[jsii.Number]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param constraint: The name of the Constraint the Policy is configuring, for example, serviceuser.services.
        :param project: The project ID.
        :param boolean_policy: boolean_policy block.
        :param list_policy: list_policy block.
        :param restore_policy: restore_policy block.
        :param timeouts: timeouts block.
        :param version: Version of the Policy. Default version is 0.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ProjectOrganizationPolicyTimeouts(**timeouts)
        self._values = {
            'constraint': constraint,
            'project': project,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if boolean_policy is not None: self._values["boolean_policy"] = boolean_policy
        if list_policy is not None: self._values["list_policy"] = list_policy
        if restore_policy is not None: self._values["restore_policy"] = restore_policy
        if timeouts is not None: self._values["timeouts"] = timeouts
        if version is not None: self._values["version"] = version

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def constraint(self) -> str:
        """The name of the Constraint the Policy is configuring, for example, serviceuser.services."""
        return self._values.get('constraint')

    @builtins.property
    def project(self) -> str:
        """The project ID."""
        return self._values.get('project')

    @builtins.property
    def boolean_policy(self) -> typing.Optional[typing.List["ProjectOrganizationPolicyBooleanPolicy"]]:
        """boolean_policy block."""
        return self._values.get('boolean_policy')

    @builtins.property
    def list_policy(self) -> typing.Optional[typing.List["ProjectOrganizationPolicyListPolicy"]]:
        """list_policy block."""
        return self._values.get('list_policy')

    @builtins.property
    def restore_policy(self) -> typing.Optional[typing.List["ProjectOrganizationPolicyRestorePolicy"]]:
        """restore_policy block."""
        return self._values.get('restore_policy')

    @builtins.property
    def timeouts(self) -> typing.Optional["ProjectOrganizationPolicyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    @builtins.property
    def version(self) -> typing.Optional[jsii.Number]:
        """Version of the Policy.

        Default version is 0.
        """
        return self._values.get('version')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectOrganizationPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectOrganizationPolicyListPolicy", jsii_struct_bases=[], name_mapping={'allow': 'allow', 'deny': 'deny', 'inherit_from_parent': 'inheritFromParent', 'suggested_value': 'suggestedValue'})
class ProjectOrganizationPolicyListPolicy():
    def __init__(self, *, allow: typing.Optional[typing.List["ProjectOrganizationPolicyListPolicyAllow"]]=None, deny: typing.Optional[typing.List["ProjectOrganizationPolicyListPolicyDeny"]]=None, inherit_from_parent: typing.Optional[bool]=None, suggested_value: typing.Optional[str]=None) -> None:
        """
        :param allow: allow block.
        :param deny: deny block.
        :param inherit_from_parent: If set to true, the values from the effective Policy of the parent resource are inherited, meaning the values set in this Policy are added to the values inherited up the hierarchy.
        :param suggested_value: The Google Cloud Console will try to default to a configuration that matches the value specified in this field.
        """
        self._values = {
        }
        if allow is not None: self._values["allow"] = allow
        if deny is not None: self._values["deny"] = deny
        if inherit_from_parent is not None: self._values["inherit_from_parent"] = inherit_from_parent
        if suggested_value is not None: self._values["suggested_value"] = suggested_value

    @builtins.property
    def allow(self) -> typing.Optional[typing.List["ProjectOrganizationPolicyListPolicyAllow"]]:
        """allow block."""
        return self._values.get('allow')

    @builtins.property
    def deny(self) -> typing.Optional[typing.List["ProjectOrganizationPolicyListPolicyDeny"]]:
        """deny block."""
        return self._values.get('deny')

    @builtins.property
    def inherit_from_parent(self) -> typing.Optional[bool]:
        """If set to true, the values from the effective Policy of the parent resource are inherited, meaning the values set in this Policy are added to the values inherited up the hierarchy."""
        return self._values.get('inherit_from_parent')

    @builtins.property
    def suggested_value(self) -> typing.Optional[str]:
        """The Google Cloud Console will try to default to a configuration that matches the value specified in this field."""
        return self._values.get('suggested_value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectOrganizationPolicyListPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectOrganizationPolicyListPolicyAllow", jsii_struct_bases=[], name_mapping={'all': 'all', 'values': 'values'})
class ProjectOrganizationPolicyListPolicyAllow():
    def __init__(self, *, all: typing.Optional[bool]=None, values: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param all: The policy allows or denies all values.
        :param values: The policy can define specific values that are allowed or denied.
        """
        self._values = {
        }
        if all is not None: self._values["all"] = all
        if values is not None: self._values["values"] = values

    @builtins.property
    def all(self) -> typing.Optional[bool]:
        """The policy allows or denies all values."""
        return self._values.get('all')

    @builtins.property
    def values(self) -> typing.Optional[typing.List[str]]:
        """The policy can define specific values that are allowed or denied."""
        return self._values.get('values')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectOrganizationPolicyListPolicyAllow(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectOrganizationPolicyListPolicyDeny", jsii_struct_bases=[], name_mapping={'all': 'all', 'values': 'values'})
class ProjectOrganizationPolicyListPolicyDeny():
    def __init__(self, *, all: typing.Optional[bool]=None, values: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param all: The policy allows or denies all values.
        :param values: The policy can define specific values that are allowed or denied.
        """
        self._values = {
        }
        if all is not None: self._values["all"] = all
        if values is not None: self._values["values"] = values

    @builtins.property
    def all(self) -> typing.Optional[bool]:
        """The policy allows or denies all values."""
        return self._values.get('all')

    @builtins.property
    def values(self) -> typing.Optional[typing.List[str]]:
        """The policy can define specific values that are allowed or denied."""
        return self._values.get('values')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectOrganizationPolicyListPolicyDeny(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectOrganizationPolicyRestorePolicy", jsii_struct_bases=[], name_mapping={'default': 'default'})
class ProjectOrganizationPolicyRestorePolicy():
    def __init__(self, *, default: bool) -> None:
        """
        :param default: May only be set to true. If set, then the default Policy is restored.
        """
        self._values = {
            'default': default,
        }

    @builtins.property
    def default(self) -> bool:
        """May only be set to true.

        If set, then the default Policy is restored.
        """
        return self._values.get('default')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectOrganizationPolicyRestorePolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectOrganizationPolicyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'read': 'read', 'update': 'update'})
class ProjectOrganizationPolicyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, read: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param read: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if read is not None: self._values["read"] = read
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def read(self) -> typing.Optional[str]:
        return self._values.get('read')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectOrganizationPolicyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ProjectService(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ProjectService"):
    def __init__(self, scope: constructs.Construct, id: str, *, service: str, disable_dependent_services: typing.Optional[bool]=None, disable_on_destroy: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ProjectServiceTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param service: 
        :param disable_dependent_services: 
        :param disable_on_destroy: 
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ProjectServiceConfig(service=service, disable_dependent_services=disable_dependent_services, disable_on_destroy=disable_on_destroy, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ProjectService, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="disableDependentServices")
    def disable_dependent_services(self) -> typing.Optional[bool]:
        return jsii.get(self, "disableDependentServices")

    @disable_dependent_services.setter
    def disable_dependent_services(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "disableDependentServices", value)

    @builtins.property
    @jsii.member(jsii_name="disableOnDestroy")
    def disable_on_destroy(self) -> typing.Optional[bool]:
        return jsii.get(self, "disableOnDestroy")

    @disable_on_destroy.setter
    def disable_on_destroy(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "disableOnDestroy", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ProjectServiceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ProjectServiceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectServiceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'service': 'service', 'disable_dependent_services': 'disableDependentServices', 'disable_on_destroy': 'disableOnDestroy', 'project': 'project', 'timeouts': 'timeouts'})
class ProjectServiceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, service: str, disable_dependent_services: typing.Optional[bool]=None, disable_on_destroy: typing.Optional[bool]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ProjectServiceTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param service: 
        :param disable_dependent_services: 
        :param disable_on_destroy: 
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ProjectServiceTimeouts(**timeouts)
        self._values = {
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if disable_dependent_services is not None: self._values["disable_dependent_services"] = disable_dependent_services
        if disable_on_destroy is not None: self._values["disable_on_destroy"] = disable_on_destroy
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def service(self) -> str:
        return self._values.get('service')

    @builtins.property
    def disable_dependent_services(self) -> typing.Optional[bool]:
        return self._values.get('disable_dependent_services')

    @builtins.property
    def disable_on_destroy(self) -> typing.Optional[bool]:
        return self._values.get('disable_on_destroy')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ProjectServiceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectServiceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectServiceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'read': 'read', 'update': 'update'})
class ProjectServiceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, read: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param read: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if read is not None: self._values["read"] = read
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def read(self) -> typing.Optional[str]:
        return self._values.get('read')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectServiceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'read': 'read', 'update': 'update'})
class ProjectTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, read: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param read: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if read is not None: self._values["read"] = read
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def read(self) -> typing.Optional[str]:
        return self._values.get('read')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ProjectUsageExportBucket(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ProjectUsageExportBucket"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket_name: str, prefix: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ProjectUsageExportBucketTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket_name: The bucket to store reports in.
        :param prefix: A prefix for the reports, for instance, the project name.
        :param project: The project to set the export bucket on. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ProjectUsageExportBucketConfig(bucket_name=bucket_name, prefix=prefix, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ProjectUsageExportBucket, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="bucketName")
    def bucket_name(self) -> str:
        return jsii.get(self, "bucketName")

    @bucket_name.setter
    def bucket_name(self, value: str) -> None:
        jsii.set(self, "bucketName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="prefix")
    def prefix(self) -> typing.Optional[str]:
        return jsii.get(self, "prefix")

    @prefix.setter
    def prefix(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "prefix", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ProjectUsageExportBucketTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ProjectUsageExportBucketTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectUsageExportBucketConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket_name': 'bucketName', 'prefix': 'prefix', 'project': 'project', 'timeouts': 'timeouts'})
class ProjectUsageExportBucketConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket_name: str, prefix: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ProjectUsageExportBucketTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket_name: The bucket to store reports in.
        :param prefix: A prefix for the reports, for instance, the project name.
        :param project: The project to set the export bucket on. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ProjectUsageExportBucketTimeouts(**timeouts)
        self._values = {
            'bucket_name': bucket_name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if prefix is not None: self._values["prefix"] = prefix
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket_name(self) -> str:
        """The bucket to store reports in."""
        return self._values.get('bucket_name')

    @builtins.property
    def prefix(self) -> typing.Optional[str]:
        """A prefix for the reports, for instance, the project name."""
        return self._values.get('prefix')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The project to set the export bucket on.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ProjectUsageExportBucketTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectUsageExportBucketConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ProjectUsageExportBucketTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ProjectUsageExportBucketTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ProjectUsageExportBucketTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class PubsubSubscription(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.PubsubSubscription"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, topic: str, ack_deadline_seconds: typing.Optional[jsii.Number]=None, dead_letter_policy: typing.Optional[typing.List["PubsubSubscriptionDeadLetterPolicy"]]=None, expiration_policy: typing.Optional[typing.List["PubsubSubscriptionExpirationPolicy"]]=None, filter: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, message_retention_duration: typing.Optional[str]=None, project: typing.Optional[str]=None, push_config: typing.Optional[typing.List["PubsubSubscriptionPushConfig"]]=None, retain_acked_messages: typing.Optional[bool]=None, timeouts: typing.Optional["PubsubSubscriptionTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the subscription.
        :param topic: A reference to a Topic resource.
        :param ack_deadline_seconds: This value is the maximum time after a subscriber receives a message before the subscriber should acknowledge the message. After message delivery but before the ack deadline expires and before the message is acknowledged, it is an outstanding message and will not be delivered again during that time (on a best-effort basis). For pull subscriptions, this value is used as the initial value for the ack deadline. To override this value for a given message, call subscriptions.modifyAckDeadline with the corresponding ackId if using pull. The minimum custom deadline you can specify is 10 seconds. The maximum custom deadline you can specify is 600 seconds (10 minutes). If this parameter is 0, a default value of 10 seconds is used. For push delivery, this value is also used to set the request timeout for the call to the push endpoint. If the subscriber never acknowledges the message, the Pub/Sub system will eventually redeliver the message.
        :param dead_letter_policy: dead_letter_policy block.
        :param expiration_policy: expiration_policy block.
        :param filter: The subscription only delivers the messages that match the filter. Pub/Sub automatically acknowledges the messages that don't match the filter. You can filter messages by their attributes. The maximum length of a filter is 256 bytes. After creating the subscription, you can't modify the filter.
        :param labels: A set of key/value label pairs to assign to this Subscription.
        :param message_retention_duration: How long to retain unacknowledged messages in the subscription's backlog, from the moment a message is published. If retainAckedMessages is true, then this also configures the retention of acknowledged messages, and thus configures how far back in time a subscriptions.seek can be done. Defaults to 7 days. Cannot be more than 7 days ('"604800s"') or less than 10 minutes ('"600s"'). A duration in seconds with up to nine fractional digits, terminated by 's'. Example: '"600.5s"'.
        :param project: 
        :param push_config: push_config block.
        :param retain_acked_messages: Indicates whether to retain acknowledged messages. If 'true', then messages are not expunged from the subscription's backlog, even if they are acknowledged, until they fall out of the messageRetentionDuration window.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PubsubSubscriptionConfig(name=name, topic=topic, ack_deadline_seconds=ack_deadline_seconds, dead_letter_policy=dead_letter_policy, expiration_policy=expiration_policy, filter=filter, labels=labels, message_retention_duration=message_retention_duration, project=project, push_config=push_config, retain_acked_messages=retain_acked_messages, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(PubsubSubscription, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="path")
    def path(self) -> str:
        return jsii.get(self, "path")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="topic")
    def topic(self) -> str:
        return jsii.get(self, "topic")

    @topic.setter
    def topic(self, value: str) -> None:
        jsii.set(self, "topic", value)

    @builtins.property
    @jsii.member(jsii_name="ackDeadlineSeconds")
    def ack_deadline_seconds(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "ackDeadlineSeconds")

    @ack_deadline_seconds.setter
    def ack_deadline_seconds(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "ackDeadlineSeconds", value)

    @builtins.property
    @jsii.member(jsii_name="deadLetterPolicy")
    def dead_letter_policy(self) -> typing.Optional[typing.List["PubsubSubscriptionDeadLetterPolicy"]]:
        return jsii.get(self, "deadLetterPolicy")

    @dead_letter_policy.setter
    def dead_letter_policy(self, value: typing.Optional[typing.List["PubsubSubscriptionDeadLetterPolicy"]]) -> None:
        jsii.set(self, "deadLetterPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="expirationPolicy")
    def expiration_policy(self) -> typing.Optional[typing.List["PubsubSubscriptionExpirationPolicy"]]:
        return jsii.get(self, "expirationPolicy")

    @expiration_policy.setter
    def expiration_policy(self, value: typing.Optional[typing.List["PubsubSubscriptionExpirationPolicy"]]) -> None:
        jsii.set(self, "expirationPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="filter")
    def filter(self) -> typing.Optional[str]:
        return jsii.get(self, "filter")

    @filter.setter
    def filter(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "filter", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="messageRetentionDuration")
    def message_retention_duration(self) -> typing.Optional[str]:
        return jsii.get(self, "messageRetentionDuration")

    @message_retention_duration.setter
    def message_retention_duration(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "messageRetentionDuration", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="pushConfig")
    def push_config(self) -> typing.Optional[typing.List["PubsubSubscriptionPushConfig"]]:
        return jsii.get(self, "pushConfig")

    @push_config.setter
    def push_config(self, value: typing.Optional[typing.List["PubsubSubscriptionPushConfig"]]) -> None:
        jsii.set(self, "pushConfig", value)

    @builtins.property
    @jsii.member(jsii_name="retainAckedMessages")
    def retain_acked_messages(self) -> typing.Optional[bool]:
        return jsii.get(self, "retainAckedMessages")

    @retain_acked_messages.setter
    def retain_acked_messages(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "retainAckedMessages", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["PubsubSubscriptionTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["PubsubSubscriptionTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubSubscriptionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'topic': 'topic', 'ack_deadline_seconds': 'ackDeadlineSeconds', 'dead_letter_policy': 'deadLetterPolicy', 'expiration_policy': 'expirationPolicy', 'filter': 'filter', 'labels': 'labels', 'message_retention_duration': 'messageRetentionDuration', 'project': 'project', 'push_config': 'pushConfig', 'retain_acked_messages': 'retainAckedMessages', 'timeouts': 'timeouts'})
class PubsubSubscriptionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, topic: str, ack_deadline_seconds: typing.Optional[jsii.Number]=None, dead_letter_policy: typing.Optional[typing.List["PubsubSubscriptionDeadLetterPolicy"]]=None, expiration_policy: typing.Optional[typing.List["PubsubSubscriptionExpirationPolicy"]]=None, filter: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, message_retention_duration: typing.Optional[str]=None, project: typing.Optional[str]=None, push_config: typing.Optional[typing.List["PubsubSubscriptionPushConfig"]]=None, retain_acked_messages: typing.Optional[bool]=None, timeouts: typing.Optional["PubsubSubscriptionTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the subscription.
        :param topic: A reference to a Topic resource.
        :param ack_deadline_seconds: This value is the maximum time after a subscriber receives a message before the subscriber should acknowledge the message. After message delivery but before the ack deadline expires and before the message is acknowledged, it is an outstanding message and will not be delivered again during that time (on a best-effort basis). For pull subscriptions, this value is used as the initial value for the ack deadline. To override this value for a given message, call subscriptions.modifyAckDeadline with the corresponding ackId if using pull. The minimum custom deadline you can specify is 10 seconds. The maximum custom deadline you can specify is 600 seconds (10 minutes). If this parameter is 0, a default value of 10 seconds is used. For push delivery, this value is also used to set the request timeout for the call to the push endpoint. If the subscriber never acknowledges the message, the Pub/Sub system will eventually redeliver the message.
        :param dead_letter_policy: dead_letter_policy block.
        :param expiration_policy: expiration_policy block.
        :param filter: The subscription only delivers the messages that match the filter. Pub/Sub automatically acknowledges the messages that don't match the filter. You can filter messages by their attributes. The maximum length of a filter is 256 bytes. After creating the subscription, you can't modify the filter.
        :param labels: A set of key/value label pairs to assign to this Subscription.
        :param message_retention_duration: How long to retain unacknowledged messages in the subscription's backlog, from the moment a message is published. If retainAckedMessages is true, then this also configures the retention of acknowledged messages, and thus configures how far back in time a subscriptions.seek can be done. Defaults to 7 days. Cannot be more than 7 days ('"604800s"') or less than 10 minutes ('"600s"'). A duration in seconds with up to nine fractional digits, terminated by 's'. Example: '"600.5s"'.
        :param project: 
        :param push_config: push_config block.
        :param retain_acked_messages: Indicates whether to retain acknowledged messages. If 'true', then messages are not expunged from the subscription's backlog, even if they are acknowledged, until they fall out of the messageRetentionDuration window.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = PubsubSubscriptionTimeouts(**timeouts)
        self._values = {
            'name': name,
            'topic': topic,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if ack_deadline_seconds is not None: self._values["ack_deadline_seconds"] = ack_deadline_seconds
        if dead_letter_policy is not None: self._values["dead_letter_policy"] = dead_letter_policy
        if expiration_policy is not None: self._values["expiration_policy"] = expiration_policy
        if filter is not None: self._values["filter"] = filter
        if labels is not None: self._values["labels"] = labels
        if message_retention_duration is not None: self._values["message_retention_duration"] = message_retention_duration
        if project is not None: self._values["project"] = project
        if push_config is not None: self._values["push_config"] = push_config
        if retain_acked_messages is not None: self._values["retain_acked_messages"] = retain_acked_messages
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the subscription."""
        return self._values.get('name')

    @builtins.property
    def topic(self) -> str:
        """A reference to a Topic resource."""
        return self._values.get('topic')

    @builtins.property
    def ack_deadline_seconds(self) -> typing.Optional[jsii.Number]:
        """This value is the maximum time after a subscriber receives a message before the subscriber should acknowledge the message.

        After message
        delivery but before the ack deadline expires and before the message is
        acknowledged, it is an outstanding message and will not be delivered
        again during that time (on a best-effort basis).

        For pull subscriptions, this value is used as the initial value for
        the ack deadline. To override this value for a given message, call
        subscriptions.modifyAckDeadline with the corresponding ackId if using
        pull. The minimum custom deadline you can specify is 10 seconds. The
        maximum custom deadline you can specify is 600 seconds (10 minutes).
        If this parameter is 0, a default value of 10 seconds is used.

        For push delivery, this value is also used to set the request timeout
        for the call to the push endpoint.

        If the subscriber never acknowledges the message, the Pub/Sub system
        will eventually redeliver the message.
        """
        return self._values.get('ack_deadline_seconds')

    @builtins.property
    def dead_letter_policy(self) -> typing.Optional[typing.List["PubsubSubscriptionDeadLetterPolicy"]]:
        """dead_letter_policy block."""
        return self._values.get('dead_letter_policy')

    @builtins.property
    def expiration_policy(self) -> typing.Optional[typing.List["PubsubSubscriptionExpirationPolicy"]]:
        """expiration_policy block."""
        return self._values.get('expiration_policy')

    @builtins.property
    def filter(self) -> typing.Optional[str]:
        """The subscription only delivers the messages that match the filter.

        Pub/Sub automatically acknowledges the messages that don't match the filter. You can filter messages
        by their attributes. The maximum length of a filter is 256 bytes. After creating the subscription,
        you can't modify the filter.
        """
        return self._values.get('filter')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value label pairs to assign to this Subscription."""
        return self._values.get('labels')

    @builtins.property
    def message_retention_duration(self) -> typing.Optional[str]:
        """How long to retain unacknowledged messages in the subscription's backlog, from the moment a message is published.

        If
        retainAckedMessages is true, then this also configures the retention
        of acknowledged messages, and thus configures how far back in time a
        subscriptions.seek can be done. Defaults to 7 days. Cannot be more
        than 7 days ('"604800s"') or less than 10 minutes ('"600s"').

        A duration in seconds with up to nine fractional digits, terminated
        by 's'. Example: '"600.5s"'.
        """
        return self._values.get('message_retention_duration')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def push_config(self) -> typing.Optional[typing.List["PubsubSubscriptionPushConfig"]]:
        """push_config block."""
        return self._values.get('push_config')

    @builtins.property
    def retain_acked_messages(self) -> typing.Optional[bool]:
        """Indicates whether to retain acknowledged messages.

        If 'true', then
        messages are not expunged from the subscription's backlog, even if
        they are acknowledged, until they fall out of the
        messageRetentionDuration window.
        """
        return self._values.get('retain_acked_messages')

    @builtins.property
    def timeouts(self) -> typing.Optional["PubsubSubscriptionTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubSubscriptionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubSubscriptionDeadLetterPolicy", jsii_struct_bases=[], name_mapping={'dead_letter_topic': 'deadLetterTopic', 'max_delivery_attempts': 'maxDeliveryAttempts'})
class PubsubSubscriptionDeadLetterPolicy():
    def __init__(self, *, dead_letter_topic: typing.Optional[str]=None, max_delivery_attempts: typing.Optional[jsii.Number]=None) -> None:
        """
        :param dead_letter_topic: The name of the topic to which dead letter messages should be published. Format is 'projects/{project}/topics/{topic}'. The Cloud Pub/Sub service account associated with the enclosing subscription's parent project (i.e., service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have permission to Publish() to this topic. The operation will fail if the topic does not exist. Users should ensure that there is a subscription attached to this topic since messages published to a topic with no subscriptions are lost.
        :param max_delivery_attempts: The maximum number of delivery attempts for any message. The value must be between 5 and 100. The number of delivery attempts is defined as 1 + (the sum of number of NACKs and number of times the acknowledgement deadline has been exceeded for the message). A NACK is any call to ModifyAckDeadline with a 0 deadline. Note that client libraries may automatically extend ack_deadlines. This field will be honored on a best effort basis. If this parameter is 0, a default value of 5 is used.
        """
        self._values = {
        }
        if dead_letter_topic is not None: self._values["dead_letter_topic"] = dead_letter_topic
        if max_delivery_attempts is not None: self._values["max_delivery_attempts"] = max_delivery_attempts

    @builtins.property
    def dead_letter_topic(self) -> typing.Optional[str]:
        """The name of the topic to which dead letter messages should be published. Format is 'projects/{project}/topics/{topic}'.

        The Cloud Pub/Sub service account associated with the enclosing subscription's
        parent project (i.e.,
        service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
        permission to Publish() to this topic.

        The operation will fail if the topic does not exist.
        Users should ensure that there is a subscription attached to this topic
        since messages published to a topic with no subscriptions are lost.
        """
        return self._values.get('dead_letter_topic')

    @builtins.property
    def max_delivery_attempts(self) -> typing.Optional[jsii.Number]:
        """The maximum number of delivery attempts for any message. The value must be between 5 and 100.

        The number of delivery attempts is defined as 1 + (the sum of number of
        NACKs and number of times the acknowledgement deadline has been exceeded for the message).

        A NACK is any call to ModifyAckDeadline with a 0 deadline. Note that
        client libraries may automatically extend ack_deadlines.

        This field will be honored on a best effort basis.

        If this parameter is 0, a default value of 5 is used.
        """
        return self._values.get('max_delivery_attempts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubSubscriptionDeadLetterPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubSubscriptionExpirationPolicy", jsii_struct_bases=[], name_mapping={'ttl': 'ttl'})
class PubsubSubscriptionExpirationPolicy():
    def __init__(self, *, ttl: str) -> None:
        """
        :param ttl: Specifies the "time-to-live" duration for an associated resource. The resource expires if it is not active for a period of ttl. If ttl is not set, the associated resource never expires. A duration in seconds with up to nine fractional digits, terminated by 's'. Example - "3.5s".
        """
        self._values = {
            'ttl': ttl,
        }

    @builtins.property
    def ttl(self) -> str:
        """Specifies the "time-to-live" duration for an associated resource.

        The
        resource expires if it is not active for a period of ttl.
        If ttl is not set, the associated resource never expires.
        A duration in seconds with up to nine fractional digits, terminated by 's'.
        Example - "3.5s".
        """
        return self._values.get('ttl')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubSubscriptionExpirationPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class PubsubSubscriptionIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.PubsubSubscriptionIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], role: str, subscription: str, condition: typing.Optional[typing.List["PubsubSubscriptionIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param role: 
        :param subscription: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PubsubSubscriptionIamBindingConfig(members=members, role=role, subscription=subscription, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(PubsubSubscriptionIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="subscription")
    def subscription(self) -> str:
        return jsii.get(self, "subscription")

    @subscription.setter
    def subscription(self, value: str) -> None:
        jsii.set(self, "subscription", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["PubsubSubscriptionIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["PubsubSubscriptionIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubSubscriptionIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class PubsubSubscriptionIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubSubscriptionIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubSubscriptionIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'role': 'role', 'subscription': 'subscription', 'condition': 'condition', 'project': 'project'})
class PubsubSubscriptionIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], role: str, subscription: str, condition: typing.Optional[typing.List["PubsubSubscriptionIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param role: 
        :param subscription: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'role': role,
            'subscription': subscription,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def subscription(self) -> str:
        return self._values.get('subscription')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["PubsubSubscriptionIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubSubscriptionIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class PubsubSubscriptionIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.PubsubSubscriptionIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, role: str, subscription: str, condition: typing.Optional[typing.List["PubsubSubscriptionIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param role: 
        :param subscription: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PubsubSubscriptionIamMemberConfig(member=member, role=role, subscription=subscription, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(PubsubSubscriptionIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="subscription")
    def subscription(self) -> str:
        return jsii.get(self, "subscription")

    @subscription.setter
    def subscription(self, value: str) -> None:
        jsii.set(self, "subscription", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["PubsubSubscriptionIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["PubsubSubscriptionIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubSubscriptionIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class PubsubSubscriptionIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubSubscriptionIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubSubscriptionIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'role': 'role', 'subscription': 'subscription', 'condition': 'condition', 'project': 'project'})
class PubsubSubscriptionIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, role: str, subscription: str, condition: typing.Optional[typing.List["PubsubSubscriptionIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param role: 
        :param subscription: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'role': role,
            'subscription': subscription,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def subscription(self) -> str:
        return self._values.get('subscription')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["PubsubSubscriptionIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubSubscriptionIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class PubsubSubscriptionIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.PubsubSubscriptionIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_data: str, subscription: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_data: 
        :param subscription: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PubsubSubscriptionIamPolicyConfig(policy_data=policy_data, subscription=subscription, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(PubsubSubscriptionIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="subscription")
    def subscription(self) -> str:
        return jsii.get(self, "subscription")

    @subscription.setter
    def subscription(self, value: str) -> None:
        jsii.set(self, "subscription", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubSubscriptionIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_data': 'policyData', 'subscription': 'subscription', 'project': 'project'})
class PubsubSubscriptionIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_data: str, subscription: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_data: 
        :param subscription: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'policy_data': policy_data,
            'subscription': subscription,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def subscription(self) -> str:
        return self._values.get('subscription')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubSubscriptionIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubSubscriptionPushConfig", jsii_struct_bases=[], name_mapping={'push_endpoint': 'pushEndpoint', 'attributes': 'attributes', 'oidc_token': 'oidcToken'})
class PubsubSubscriptionPushConfig():
    def __init__(self, *, push_endpoint: str, attributes: typing.Optional[typing.Mapping[str, str]]=None, oidc_token: typing.Optional[typing.List["PubsubSubscriptionPushConfigOidcToken"]]=None) -> None:
        """
        :param push_endpoint: A URL locating the endpoint to which messages should be pushed. For example, a Webhook endpoint might use "https://example.com/push".
        :param attributes: Endpoint configuration attributes. Every endpoint has a set of API supported attributes that can be used to control different aspects of the message delivery. The currently supported attribute is x-goog-version, which you can use to change the format of the pushed message. This attribute indicates the version of the data expected by the endpoint. This controls the shape of the pushed message (i.e., its fields and metadata). The endpoint version is based on the version of the Pub/Sub API. If not present during the subscriptions.create call, it will default to the version of the API used to make such call. If not present during a subscriptions.modifyPushConfig call, its value will not be changed. subscriptions.get calls will always return a valid version, even if the subscription was created without this attribute. The possible values for this attribute are: - v1beta1: uses the push format defined in the v1beta1 Pub/Sub API. - v1 or v1beta2: uses the push format defined in the v1 Pub/Sub API.
        :param oidc_token: oidc_token block.
        """
        self._values = {
            'push_endpoint': push_endpoint,
        }
        if attributes is not None: self._values["attributes"] = attributes
        if oidc_token is not None: self._values["oidc_token"] = oidc_token

    @builtins.property
    def push_endpoint(self) -> str:
        """A URL locating the endpoint to which messages should be pushed.

        For example, a Webhook endpoint might use
        "https://example.com/push".
        """
        return self._values.get('push_endpoint')

    @builtins.property
    def attributes(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Endpoint configuration attributes.

        Every endpoint has a set of API supported attributes that can
        be used to control different aspects of the message delivery.

        The currently supported attribute is x-goog-version, which you
        can use to change the format of the pushed message. This
        attribute indicates the version of the data expected by
        the endpoint. This controls the shape of the pushed message
        (i.e., its fields and metadata). The endpoint version is
        based on the version of the Pub/Sub API.

        If not present during the subscriptions.create call,
        it will default to the version of the API used to make
        such call. If not present during a subscriptions.modifyPushConfig
        call, its value will not be changed. subscriptions.get
        calls will always return a valid version, even if the
        subscription was created without this attribute.

        The possible values for this attribute are:

        - v1beta1: uses the push format defined in the v1beta1 Pub/Sub API.
        - v1 or v1beta2: uses the push format defined in the v1 Pub/Sub API.
        """
        return self._values.get('attributes')

    @builtins.property
    def oidc_token(self) -> typing.Optional[typing.List["PubsubSubscriptionPushConfigOidcToken"]]:
        """oidc_token block."""
        return self._values.get('oidc_token')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubSubscriptionPushConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubSubscriptionPushConfigOidcToken", jsii_struct_bases=[], name_mapping={'service_account_email': 'serviceAccountEmail', 'audience': 'audience'})
class PubsubSubscriptionPushConfigOidcToken():
    def __init__(self, *, service_account_email: str, audience: typing.Optional[str]=None) -> None:
        """
        :param service_account_email: Service account email to be used for generating the OIDC token. The caller (for subscriptions.create, subscriptions.patch, and subscriptions.modifyPushConfig RPCs) must have the iam.serviceAccounts.actAs permission for the service account.
        :param audience: Audience to be used when generating OIDC token. The audience claim identifies the recipients that the JWT is intended for. The audience value is a single case-sensitive string. Having multiple values (array) for the audience field is not supported. More info about the OIDC JWT token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3 Note: if not specified, the Push endpoint URL will be used.
        """
        self._values = {
            'service_account_email': service_account_email,
        }
        if audience is not None: self._values["audience"] = audience

    @builtins.property
    def service_account_email(self) -> str:
        """Service account email to be used for generating the OIDC token.

        The caller (for subscriptions.create, subscriptions.patch, and
        subscriptions.modifyPushConfig RPCs) must have the
        iam.serviceAccounts.actAs permission for the service account.
        """
        return self._values.get('service_account_email')

    @builtins.property
    def audience(self) -> typing.Optional[str]:
        """Audience to be used when generating OIDC token.

        The audience claim
        identifies the recipients that the JWT is intended for. The audience
        value is a single case-sensitive string. Having multiple values (array)
        for the audience field is not supported. More info about the OIDC JWT
        token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
        Note: if not specified, the Push endpoint URL will be used.
        """
        return self._values.get('audience')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubSubscriptionPushConfigOidcToken(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubSubscriptionTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class PubsubSubscriptionTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubSubscriptionTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class PubsubTopic(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.PubsubTopic"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, kms_key_name: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, message_storage_policy: typing.Optional[typing.List["PubsubTopicMessageStoragePolicy"]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["PubsubTopicTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Name of the topic.
        :param kms_key_name: The resource name of the Cloud KMS CryptoKey to be used to protect access to messages published on this topic. Your project's PubSub service account ('service-{{PROJECT_NUMBER}}@gcp-sa-pubsub.iam.gserviceaccount.com') must have 'roles/cloudkms.cryptoKeyEncrypterDecrypter' to use this feature. The expected format is 'projects/*/locations/*/keyRings/*/cryptoKeys/*'
        :param labels: A set of key/value label pairs to assign to this Topic.
        :param message_storage_policy: message_storage_policy block.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PubsubTopicConfig(name=name, kms_key_name=kms_key_name, labels=labels, message_storage_policy=message_storage_policy, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(PubsubTopic, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="kmsKeyName")
    def kms_key_name(self) -> typing.Optional[str]:
        return jsii.get(self, "kmsKeyName")

    @kms_key_name.setter
    def kms_key_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "kmsKeyName", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="messageStoragePolicy")
    def message_storage_policy(self) -> typing.Optional[typing.List["PubsubTopicMessageStoragePolicy"]]:
        return jsii.get(self, "messageStoragePolicy")

    @message_storage_policy.setter
    def message_storage_policy(self, value: typing.Optional[typing.List["PubsubTopicMessageStoragePolicy"]]) -> None:
        jsii.set(self, "messageStoragePolicy", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["PubsubTopicTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["PubsubTopicTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubTopicConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'kms_key_name': 'kmsKeyName', 'labels': 'labels', 'message_storage_policy': 'messageStoragePolicy', 'project': 'project', 'timeouts': 'timeouts'})
class PubsubTopicConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, kms_key_name: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, message_storage_policy: typing.Optional[typing.List["PubsubTopicMessageStoragePolicy"]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["PubsubTopicTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Name of the topic.
        :param kms_key_name: The resource name of the Cloud KMS CryptoKey to be used to protect access to messages published on this topic. Your project's PubSub service account ('service-{{PROJECT_NUMBER}}@gcp-sa-pubsub.iam.gserviceaccount.com') must have 'roles/cloudkms.cryptoKeyEncrypterDecrypter' to use this feature. The expected format is 'projects/*/locations/*/keyRings/*/cryptoKeys/*'
        :param labels: A set of key/value label pairs to assign to this Topic.
        :param message_storage_policy: message_storage_policy block.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = PubsubTopicTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if kms_key_name is not None: self._values["kms_key_name"] = kms_key_name
        if labels is not None: self._values["labels"] = labels
        if message_storage_policy is not None: self._values["message_storage_policy"] = message_storage_policy
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Name of the topic."""
        return self._values.get('name')

    @builtins.property
    def kms_key_name(self) -> typing.Optional[str]:
        """The resource name of the Cloud KMS CryptoKey to be used to protect access to messages published on this topic.

        Your project's PubSub service account
        ('service-{{PROJECT_NUMBER}}@gcp-sa-pubsub.iam.gserviceaccount.com') must have
        'roles/cloudkms.cryptoKeyEncrypterDecrypter' to use this feature.
        The expected format is 'projects/*/locations/*/keyRings/*/cryptoKeys/*'
        """
        return self._values.get('kms_key_name')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value label pairs to assign to this Topic."""
        return self._values.get('labels')

    @builtins.property
    def message_storage_policy(self) -> typing.Optional[typing.List["PubsubTopicMessageStoragePolicy"]]:
        """message_storage_policy block."""
        return self._values.get('message_storage_policy')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["PubsubTopicTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubTopicConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class PubsubTopicIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.PubsubTopicIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], role: str, topic: str, condition: typing.Optional[typing.List["PubsubTopicIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param role: 
        :param topic: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PubsubTopicIamBindingConfig(members=members, role=role, topic=topic, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(PubsubTopicIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="topic")
    def topic(self) -> str:
        return jsii.get(self, "topic")

    @topic.setter
    def topic(self, value: str) -> None:
        jsii.set(self, "topic", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["PubsubTopicIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["PubsubTopicIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubTopicIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class PubsubTopicIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubTopicIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubTopicIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'role': 'role', 'topic': 'topic', 'condition': 'condition', 'project': 'project'})
class PubsubTopicIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], role: str, topic: str, condition: typing.Optional[typing.List["PubsubTopicIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param role: 
        :param topic: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'role': role,
            'topic': topic,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def topic(self) -> str:
        return self._values.get('topic')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["PubsubTopicIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubTopicIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class PubsubTopicIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.PubsubTopicIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, role: str, topic: str, condition: typing.Optional[typing.List["PubsubTopicIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param role: 
        :param topic: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PubsubTopicIamMemberConfig(member=member, role=role, topic=topic, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(PubsubTopicIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="topic")
    def topic(self) -> str:
        return jsii.get(self, "topic")

    @topic.setter
    def topic(self, value: str) -> None:
        jsii.set(self, "topic", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["PubsubTopicIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["PubsubTopicIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubTopicIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class PubsubTopicIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubTopicIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubTopicIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'role': 'role', 'topic': 'topic', 'condition': 'condition', 'project': 'project'})
class PubsubTopicIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, role: str, topic: str, condition: typing.Optional[typing.List["PubsubTopicIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param role: 
        :param topic: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'role': role,
            'topic': topic,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def topic(self) -> str:
        return self._values.get('topic')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["PubsubTopicIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubTopicIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class PubsubTopicIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.PubsubTopicIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_data: str, topic: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_data: 
        :param topic: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = PubsubTopicIamPolicyConfig(policy_data=policy_data, topic=topic, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(PubsubTopicIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="topic")
    def topic(self) -> str:
        return jsii.get(self, "topic")

    @topic.setter
    def topic(self, value: str) -> None:
        jsii.set(self, "topic", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubTopicIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_data': 'policyData', 'topic': 'topic', 'project': 'project'})
class PubsubTopicIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_data: str, topic: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_data: 
        :param topic: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'policy_data': policy_data,
            'topic': topic,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def topic(self) -> str:
        return self._values.get('topic')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubTopicIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubTopicMessageStoragePolicy", jsii_struct_bases=[], name_mapping={'allowed_persistence_regions': 'allowedPersistenceRegions'})
class PubsubTopicMessageStoragePolicy():
    def __init__(self, *, allowed_persistence_regions: typing.List[str]) -> None:
        """
        :param allowed_persistence_regions: A list of IDs of GCP regions where messages that are published to the topic may be persisted in storage. Messages published by publishers running in non-allowed GCP regions (or running outside of GCP altogether) will be routed for storage in one of the allowed regions. An empty list means that no regions are allowed, and is not a valid configuration.
        """
        self._values = {
            'allowed_persistence_regions': allowed_persistence_regions,
        }

    @builtins.property
    def allowed_persistence_regions(self) -> typing.List[str]:
        """A list of IDs of GCP regions where messages that are published to the topic may be persisted in storage.

        Messages published by
        publishers running in non-allowed GCP regions (or running outside
        of GCP altogether) will be routed for storage in one of the
        allowed regions. An empty list means that no regions are allowed,
        and is not a valid configuration.
        """
        return self._values.get('allowed_persistence_regions')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubTopicMessageStoragePolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.PubsubTopicTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class PubsubTopicTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'PubsubTopicTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class RedisInstance(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.RedisInstance"):
    def __init__(self, scope: constructs.Construct, id: str, *, memory_size_gb: jsii.Number, name: str, alternative_location_id: typing.Optional[str]=None, authorized_network: typing.Optional[str]=None, connect_mode: typing.Optional[str]=None, display_name: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, location_id: typing.Optional[str]=None, project: typing.Optional[str]=None, redis_configs: typing.Optional[typing.Mapping[str, str]]=None, redis_version: typing.Optional[str]=None, region: typing.Optional[str]=None, reserved_ip_range: typing.Optional[str]=None, tier: typing.Optional[str]=None, timeouts: typing.Optional["RedisInstanceTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param memory_size_gb: Redis memory size in GiB.
        :param name: The ID of the instance or a fully qualified identifier for the instance.
        :param alternative_location_id: Only applicable to STANDARD_HA tier which protects the instance against zonal failures by provisioning it across two zones. If provided, it must be a different zone from the one provided in [locationId].
        :param authorized_network: The full name of the Google Compute Engine network to which the instance is connected. If left unspecified, the default network will be used.
        :param connect_mode: The connection mode of the Redis instance. Default value: "DIRECT_PEERING" Possible values: ["DIRECT_PEERING", "PRIVATE_SERVICE_ACCESS"]
        :param display_name: An arbitrary and optional user-provided name for the instance.
        :param labels: Resource labels to represent user provided metadata.
        :param location_id: The zone where the instance will be provisioned. If not provided, the service will choose a zone for the instance. For STANDARD_HA tier, instances will be created across two zones for protection against zonal failures. If [alternativeLocationId] is also provided, it must be different from [locationId].
        :param project: 
        :param redis_configs: Redis configuration parameters, according to http://redis.io/topics/config. Please check Memorystore documentation for the list of supported parameters: https://cloud.google.com/memorystore/docs/redis/reference/rest/v1/projects.locations.instances#Instance.FIELDS.redis_configs.
        :param redis_version: The version of Redis software. If not provided, latest supported version will be used. Currently, the supported values are:. - REDIS_5_0 for Redis 5.0 compatibility - REDIS_4_0 for Redis 4.0 compatibility - REDIS_3_2 for Redis 3.2 compatibility
        :param region: The name of the Redis region of the instance.
        :param reserved_ip_range: The CIDR range of internal addresses that are reserved for this instance. If not provided, the service will choose an unused /29 block, for example, 10.0.0.0/29 or 192.168.0.0/29. Ranges must be unique and non-overlapping with existing subnets in an authorized network.
        :param tier: The service tier of the instance. Must be one of these values:. - BASIC: standalone instance - STANDARD_HA: highly available primary/replica instances Default value: "BASIC" Possible values: ["BASIC", "STANDARD_HA"]
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RedisInstanceConfig(memory_size_gb=memory_size_gb, name=name, alternative_location_id=alternative_location_id, authorized_network=authorized_network, connect_mode=connect_mode, display_name=display_name, labels=labels, location_id=location_id, project=project, redis_configs=redis_configs, redis_version=redis_version, region=region, reserved_ip_range=reserved_ip_range, tier=tier, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(RedisInstance, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="currentLocationId")
    def current_location_id(self) -> str:
        return jsii.get(self, "currentLocationId")

    @builtins.property
    @jsii.member(jsii_name="host")
    def host(self) -> str:
        return jsii.get(self, "host")

    @builtins.property
    @jsii.member(jsii_name="persistenceIamIdentity")
    def persistence_iam_identity(self) -> str:
        return jsii.get(self, "persistenceIamIdentity")

    @builtins.property
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")

    @builtins.property
    @jsii.member(jsii_name="memorySizeGb")
    def memory_size_gb(self) -> jsii.Number:
        return jsii.get(self, "memorySizeGb")

    @memory_size_gb.setter
    def memory_size_gb(self, value: jsii.Number) -> None:
        jsii.set(self, "memorySizeGb", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="alternativeLocationId")
    def alternative_location_id(self) -> typing.Optional[str]:
        return jsii.get(self, "alternativeLocationId")

    @alternative_location_id.setter
    def alternative_location_id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "alternativeLocationId", value)

    @builtins.property
    @jsii.member(jsii_name="authorizedNetwork")
    def authorized_network(self) -> typing.Optional[str]:
        return jsii.get(self, "authorizedNetwork")

    @authorized_network.setter
    def authorized_network(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "authorizedNetwork", value)

    @builtins.property
    @jsii.member(jsii_name="connectMode")
    def connect_mode(self) -> typing.Optional[str]:
        return jsii.get(self, "connectMode")

    @connect_mode.setter
    def connect_mode(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "connectMode", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> typing.Optional[str]:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="locationId")
    def location_id(self) -> typing.Optional[str]:
        return jsii.get(self, "locationId")

    @location_id.setter
    def location_id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "locationId", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="redisConfigs")
    def redis_configs(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "redisConfigs")

    @redis_configs.setter
    def redis_configs(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "redisConfigs", value)

    @builtins.property
    @jsii.member(jsii_name="redisVersion")
    def redis_version(self) -> typing.Optional[str]:
        return jsii.get(self, "redisVersion")

    @redis_version.setter
    def redis_version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "redisVersion", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="reservedIpRange")
    def reserved_ip_range(self) -> typing.Optional[str]:
        return jsii.get(self, "reservedIpRange")

    @reserved_ip_range.setter
    def reserved_ip_range(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "reservedIpRange", value)

    @builtins.property
    @jsii.member(jsii_name="tier")
    def tier(self) -> typing.Optional[str]:
        return jsii.get(self, "tier")

    @tier.setter
    def tier(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "tier", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["RedisInstanceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["RedisInstanceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.RedisInstanceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'memory_size_gb': 'memorySizeGb', 'name': 'name', 'alternative_location_id': 'alternativeLocationId', 'authorized_network': 'authorizedNetwork', 'connect_mode': 'connectMode', 'display_name': 'displayName', 'labels': 'labels', 'location_id': 'locationId', 'project': 'project', 'redis_configs': 'redisConfigs', 'redis_version': 'redisVersion', 'region': 'region', 'reserved_ip_range': 'reservedIpRange', 'tier': 'tier', 'timeouts': 'timeouts'})
class RedisInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, memory_size_gb: jsii.Number, name: str, alternative_location_id: typing.Optional[str]=None, authorized_network: typing.Optional[str]=None, connect_mode: typing.Optional[str]=None, display_name: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, location_id: typing.Optional[str]=None, project: typing.Optional[str]=None, redis_configs: typing.Optional[typing.Mapping[str, str]]=None, redis_version: typing.Optional[str]=None, region: typing.Optional[str]=None, reserved_ip_range: typing.Optional[str]=None, tier: typing.Optional[str]=None, timeouts: typing.Optional["RedisInstanceTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param memory_size_gb: Redis memory size in GiB.
        :param name: The ID of the instance or a fully qualified identifier for the instance.
        :param alternative_location_id: Only applicable to STANDARD_HA tier which protects the instance against zonal failures by provisioning it across two zones. If provided, it must be a different zone from the one provided in [locationId].
        :param authorized_network: The full name of the Google Compute Engine network to which the instance is connected. If left unspecified, the default network will be used.
        :param connect_mode: The connection mode of the Redis instance. Default value: "DIRECT_PEERING" Possible values: ["DIRECT_PEERING", "PRIVATE_SERVICE_ACCESS"]
        :param display_name: An arbitrary and optional user-provided name for the instance.
        :param labels: Resource labels to represent user provided metadata.
        :param location_id: The zone where the instance will be provisioned. If not provided, the service will choose a zone for the instance. For STANDARD_HA tier, instances will be created across two zones for protection against zonal failures. If [alternativeLocationId] is also provided, it must be different from [locationId].
        :param project: 
        :param redis_configs: Redis configuration parameters, according to http://redis.io/topics/config. Please check Memorystore documentation for the list of supported parameters: https://cloud.google.com/memorystore/docs/redis/reference/rest/v1/projects.locations.instances#Instance.FIELDS.redis_configs.
        :param redis_version: The version of Redis software. If not provided, latest supported version will be used. Currently, the supported values are:. - REDIS_5_0 for Redis 5.0 compatibility - REDIS_4_0 for Redis 4.0 compatibility - REDIS_3_2 for Redis 3.2 compatibility
        :param region: The name of the Redis region of the instance.
        :param reserved_ip_range: The CIDR range of internal addresses that are reserved for this instance. If not provided, the service will choose an unused /29 block, for example, 10.0.0.0/29 or 192.168.0.0/29. Ranges must be unique and non-overlapping with existing subnets in an authorized network.
        :param tier: The service tier of the instance. Must be one of these values:. - BASIC: standalone instance - STANDARD_HA: highly available primary/replica instances Default value: "BASIC" Possible values: ["BASIC", "STANDARD_HA"]
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = RedisInstanceTimeouts(**timeouts)
        self._values = {
            'memory_size_gb': memory_size_gb,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if alternative_location_id is not None: self._values["alternative_location_id"] = alternative_location_id
        if authorized_network is not None: self._values["authorized_network"] = authorized_network
        if connect_mode is not None: self._values["connect_mode"] = connect_mode
        if display_name is not None: self._values["display_name"] = display_name
        if labels is not None: self._values["labels"] = labels
        if location_id is not None: self._values["location_id"] = location_id
        if project is not None: self._values["project"] = project
        if redis_configs is not None: self._values["redis_configs"] = redis_configs
        if redis_version is not None: self._values["redis_version"] = redis_version
        if region is not None: self._values["region"] = region
        if reserved_ip_range is not None: self._values["reserved_ip_range"] = reserved_ip_range
        if tier is not None: self._values["tier"] = tier
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def memory_size_gb(self) -> jsii.Number:
        """Redis memory size in GiB."""
        return self._values.get('memory_size_gb')

    @builtins.property
    def name(self) -> str:
        """The ID of the instance or a fully qualified identifier for the instance."""
        return self._values.get('name')

    @builtins.property
    def alternative_location_id(self) -> typing.Optional[str]:
        """Only applicable to STANDARD_HA tier which protects the instance against zonal failures by provisioning it across two zones.

        If provided, it must be a different zone from the one provided in
        [locationId].
        """
        return self._values.get('alternative_location_id')

    @builtins.property
    def authorized_network(self) -> typing.Optional[str]:
        """The full name of the Google Compute Engine network to which the instance is connected.

        If left unspecified, the default network
        will be used.
        """
        return self._values.get('authorized_network')

    @builtins.property
    def connect_mode(self) -> typing.Optional[str]:
        """The connection mode of the Redis instance.

        Default value: "DIRECT_PEERING" Possible values: ["DIRECT_PEERING", "PRIVATE_SERVICE_ACCESS"]
        """
        return self._values.get('connect_mode')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """An arbitrary and optional user-provided name for the instance."""
        return self._values.get('display_name')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Resource labels to represent user provided metadata."""
        return self._values.get('labels')

    @builtins.property
    def location_id(self) -> typing.Optional[str]:
        """The zone where the instance will be provisioned.

        If not provided,
        the service will choose a zone for the instance. For STANDARD_HA tier,
        instances will be created across two zones for protection against
        zonal failures. If [alternativeLocationId] is also provided, it must
        be different from [locationId].
        """
        return self._values.get('location_id')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def redis_configs(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Redis configuration parameters, according to http://redis.io/topics/config. Please check Memorystore documentation for the list of supported parameters: https://cloud.google.com/memorystore/docs/redis/reference/rest/v1/projects.locations.instances#Instance.FIELDS.redis_configs."""
        return self._values.get('redis_configs')

    @builtins.property
    def redis_version(self) -> typing.Optional[str]:
        """The version of Redis software. If not provided, latest supported version will be used. Currently, the supported values are:.

        - REDIS_5_0 for Redis 5.0 compatibility
        - REDIS_4_0 for Redis 4.0 compatibility
        - REDIS_3_2 for Redis 3.2 compatibility
        """
        return self._values.get('redis_version')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The name of the Redis region of the instance."""
        return self._values.get('region')

    @builtins.property
    def reserved_ip_range(self) -> typing.Optional[str]:
        """The CIDR range of internal addresses that are reserved for this instance.

        If not provided, the service will choose an unused /29
        block, for example, 10.0.0.0/29 or 192.168.0.0/29. Ranges must be
        unique and non-overlapping with existing subnets in an authorized
        network.
        """
        return self._values.get('reserved_ip_range')

    @builtins.property
    def tier(self) -> typing.Optional[str]:
        """The service tier of the instance. Must be one of these values:.

        - BASIC: standalone instance
        - STANDARD_HA: highly available primary/replica instances Default value: "BASIC" Possible values: ["BASIC", "STANDARD_HA"]
        """
        return self._values.get('tier')

    @builtins.property
    def timeouts(self) -> typing.Optional["RedisInstanceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'RedisInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.RedisInstanceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class RedisInstanceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'RedisInstanceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ResourceManagerLien(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ResourceManagerLien"):
    def __init__(self, scope: constructs.Construct, id: str, *, origin: str, parent: str, reason: str, restrictions: typing.List[str], timeouts: typing.Optional["ResourceManagerLienTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param origin: A stable, user-visible/meaningful string identifying the origin of the Lien, intended to be inspected programmatically. Maximum length of 200 characters.
        :param parent: A reference to the resource this Lien is attached to. The server will validate the parent against those for which Liens are supported. Since a variety of objects can have Liens against them, you must provide the type prefix (e.g. "projects/my-project-name").
        :param reason: Concise user-visible strings indicating why an action cannot be performed on a resource. Maximum length of 200 characters.
        :param restrictions: The types of operations which should be blocked as a result of this Lien. Each value should correspond to an IAM permission. The server will validate the permissions against those for which Liens are supported. An empty list is meaningless and will be rejected. e.g. ['resourcemanager.projects.delete']
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ResourceManagerLienConfig(origin=origin, parent=parent, reason=reason, restrictions=restrictions, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ResourceManagerLien, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="origin")
    def origin(self) -> str:
        return jsii.get(self, "origin")

    @origin.setter
    def origin(self, value: str) -> None:
        jsii.set(self, "origin", value)

    @builtins.property
    @jsii.member(jsii_name="parent")
    def parent(self) -> str:
        return jsii.get(self, "parent")

    @parent.setter
    def parent(self, value: str) -> None:
        jsii.set(self, "parent", value)

    @builtins.property
    @jsii.member(jsii_name="reason")
    def reason(self) -> str:
        return jsii.get(self, "reason")

    @reason.setter
    def reason(self, value: str) -> None:
        jsii.set(self, "reason", value)

    @builtins.property
    @jsii.member(jsii_name="restrictions")
    def restrictions(self) -> typing.List[str]:
        return jsii.get(self, "restrictions")

    @restrictions.setter
    def restrictions(self, value: typing.List[str]) -> None:
        jsii.set(self, "restrictions", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ResourceManagerLienTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ResourceManagerLienTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ResourceManagerLienConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'origin': 'origin', 'parent': 'parent', 'reason': 'reason', 'restrictions': 'restrictions', 'timeouts': 'timeouts'})
class ResourceManagerLienConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, origin: str, parent: str, reason: str, restrictions: typing.List[str], timeouts: typing.Optional["ResourceManagerLienTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param origin: A stable, user-visible/meaningful string identifying the origin of the Lien, intended to be inspected programmatically. Maximum length of 200 characters.
        :param parent: A reference to the resource this Lien is attached to. The server will validate the parent against those for which Liens are supported. Since a variety of objects can have Liens against them, you must provide the type prefix (e.g. "projects/my-project-name").
        :param reason: Concise user-visible strings indicating why an action cannot be performed on a resource. Maximum length of 200 characters.
        :param restrictions: The types of operations which should be blocked as a result of this Lien. Each value should correspond to an IAM permission. The server will validate the permissions against those for which Liens are supported. An empty list is meaningless and will be rejected. e.g. ['resourcemanager.projects.delete']
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ResourceManagerLienTimeouts(**timeouts)
        self._values = {
            'origin': origin,
            'parent': parent,
            'reason': reason,
            'restrictions': restrictions,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def origin(self) -> str:
        """A stable, user-visible/meaningful string identifying the origin of the Lien, intended to be inspected programmatically.

        Maximum length of
        200 characters.
        """
        return self._values.get('origin')

    @builtins.property
    def parent(self) -> str:
        """A reference to the resource this Lien is attached to.

        The server will validate the parent against those for which Liens are supported.
        Since a variety of objects can have Liens against them, you must provide the type
        prefix (e.g. "projects/my-project-name").
        """
        return self._values.get('parent')

    @builtins.property
    def reason(self) -> str:
        """Concise user-visible strings indicating why an action cannot be performed on a resource.

        Maximum length of 200 characters.
        """
        return self._values.get('reason')

    @builtins.property
    def restrictions(self) -> typing.List[str]:
        """The types of operations which should be blocked as a result of this Lien.

        Each value should correspond to an IAM permission. The server will validate
        the permissions against those for which Liens are supported.  An empty
        list is meaningless and will be rejected.
        e.g. ['resourcemanager.projects.delete']
        """
        return self._values.get('restrictions')

    @builtins.property
    def timeouts(self) -> typing.Optional["ResourceManagerLienTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ResourceManagerLienConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ResourceManagerLienTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class ResourceManagerLienTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ResourceManagerLienTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class RuntimeconfigConfig(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.RuntimeconfigConfig"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the runtime config.
        :param description: The description to associate with the runtime config.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RuntimeconfigConfigConfig(name=name, description=description, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(RuntimeconfigConfig, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.RuntimeconfigConfigConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'description': 'description', 'project': 'project'})
class RuntimeconfigConfigConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, description: typing.Optional[str]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the runtime config.
        :param description: The description to associate with the runtime config.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name of the runtime config."""
        return self._values.get('name')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """The description to associate with the runtime config."""
        return self._values.get('description')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'RuntimeconfigConfigConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class RuntimeconfigConfigIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.RuntimeconfigConfigIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, config: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["RuntimeconfigConfigIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param config: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config_ = RuntimeconfigConfigIamBindingConfig(config=config, members=members, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(RuntimeconfigConfigIamBinding, self, [scope, id, config_])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="config")
    def config(self) -> str:
        return jsii.get(self, "config")

    @config.setter
    def config(self, value: str) -> None:
        jsii.set(self, "config", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["RuntimeconfigConfigIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["RuntimeconfigConfigIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.RuntimeconfigConfigIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class RuntimeconfigConfigIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'RuntimeconfigConfigIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.RuntimeconfigConfigIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'config': 'config', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class RuntimeconfigConfigIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, config: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["RuntimeconfigConfigIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param config: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'config': config,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def config(self) -> str:
        return self._values.get('config')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["RuntimeconfigConfigIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'RuntimeconfigConfigIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class RuntimeconfigConfigIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.RuntimeconfigConfigIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, config: str, member: str, role: str, condition: typing.Optional[typing.List["RuntimeconfigConfigIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param config: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config_ = RuntimeconfigConfigIamMemberConfig(config=config, member=member, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(RuntimeconfigConfigIamMember, self, [scope, id, config_])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="config")
    def config(self) -> str:
        return jsii.get(self, "config")

    @config.setter
    def config(self, value: str) -> None:
        jsii.set(self, "config", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["RuntimeconfigConfigIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["RuntimeconfigConfigIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.RuntimeconfigConfigIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class RuntimeconfigConfigIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'RuntimeconfigConfigIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.RuntimeconfigConfigIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'config': 'config', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class RuntimeconfigConfigIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, config: str, member: str, role: str, condition: typing.Optional[typing.List["RuntimeconfigConfigIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param config: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'config': config,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def config(self) -> str:
        return self._values.get('config')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["RuntimeconfigConfigIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'RuntimeconfigConfigIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class RuntimeconfigConfigIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.RuntimeconfigConfigIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, config: str, policy_data: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param config: 
        :param policy_data: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config_ = RuntimeconfigConfigIamPolicyConfig(config=config, policy_data=policy_data, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(RuntimeconfigConfigIamPolicy, self, [scope, id, config_])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="config")
    def config(self) -> str:
        return jsii.get(self, "config")

    @config.setter
    def config(self, value: str) -> None:
        jsii.set(self, "config", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.RuntimeconfigConfigIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'config': 'config', 'policy_data': 'policyData', 'project': 'project'})
class RuntimeconfigConfigIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, config: str, policy_data: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param config: 
        :param policy_data: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'config': config,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def config(self) -> str:
        return self._values.get('config')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'RuntimeconfigConfigIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class RuntimeconfigVariable(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.RuntimeconfigVariable"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, parent: str, project: typing.Optional[str]=None, text: typing.Optional[str]=None, value: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the variable to manage. Note that variable names can be hierarchical using slashes (e.g. "prod-variables/hostname").
        :param parent: The name of the RuntimeConfig resource containing this variable.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param text: 
        :param value: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = RuntimeconfigVariableConfig(name=name, parent=parent, project=project, text=text, value=value, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(RuntimeconfigVariable, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="updateTime")
    def update_time(self) -> str:
        return jsii.get(self, "updateTime")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="parent")
    def parent(self) -> str:
        return jsii.get(self, "parent")

    @parent.setter
    def parent(self, value: str) -> None:
        jsii.set(self, "parent", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="text")
    def text(self) -> typing.Optional[str]:
        return jsii.get(self, "text")

    @text.setter
    def text(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "text", value)

    @builtins.property
    @jsii.member(jsii_name="value")
    def value(self) -> typing.Optional[str]:
        return jsii.get(self, "value")

    @value.setter
    def value(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "value", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.RuntimeconfigVariableConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'parent': 'parent', 'project': 'project', 'text': 'text', 'value': 'value'})
class RuntimeconfigVariableConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, parent: str, project: typing.Optional[str]=None, text: typing.Optional[str]=None, value: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the variable to manage. Note that variable names can be hierarchical using slashes (e.g. "prod-variables/hostname").
        :param parent: The name of the RuntimeConfig resource containing this variable.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param text: 
        :param value: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
            'parent': parent,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if text is not None: self._values["text"] = text
        if value is not None: self._values["value"] = value

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name of the variable to manage.

        Note that variable names can be hierarchical using slashes (e.g. "prod-variables/hostname").
        """
        return self._values.get('name')

    @builtins.property
    def parent(self) -> str:
        """The name of the RuntimeConfig resource containing this variable."""
        return self._values.get('parent')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def text(self) -> typing.Optional[str]:
        return self._values.get('text')

    @builtins.property
    def value(self) -> typing.Optional[str]:
        return self._values.get('value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'RuntimeconfigVariableConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SccSource(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SccSource"):
    def __init__(self, scope: constructs.Construct, id: str, *, display_name: str, organization: str, description: typing.Optional[str]=None, timeouts: typing.Optional["SccSourceTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param display_name: The source’s display name. A source’s display name must be unique amongst its siblings, for example, two sources with the same parent can't share the same display name. The display name must start and end with a letter or digit, may contain letters, digits, spaces, hyphens, and underscores, and can be no longer than 32 characters.
        :param organization: The organization whose Cloud Security Command Center the Source lives in.
        :param description: The description of the source (max of 1024 characters).
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SccSourceConfig(display_name=display_name, organization=organization, description=description, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SccSource, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="organization")
    def organization(self) -> str:
        return jsii.get(self, "organization")

    @organization.setter
    def organization(self, value: str) -> None:
        jsii.set(self, "organization", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["SccSourceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["SccSourceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SccSourceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'display_name': 'displayName', 'organization': 'organization', 'description': 'description', 'timeouts': 'timeouts'})
class SccSourceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, display_name: str, organization: str, description: typing.Optional[str]=None, timeouts: typing.Optional["SccSourceTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param display_name: The source’s display name. A source’s display name must be unique amongst its siblings, for example, two sources with the same parent can't share the same display name. The display name must start and end with a letter or digit, may contain letters, digits, spaces, hyphens, and underscores, and can be no longer than 32 characters.
        :param organization: The organization whose Cloud Security Command Center the Source lives in.
        :param description: The description of the source (max of 1024 characters).
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = SccSourceTimeouts(**timeouts)
        self._values = {
            'display_name': display_name,
            'organization': organization,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def display_name(self) -> str:
        """The source’s display name.

        A source’s display name must be unique
        amongst its siblings, for example, two sources with the same parent
        can't share the same display name. The display name must start and end
        with a letter or digit, may contain letters, digits, spaces, hyphens,
        and underscores, and can be no longer than 32 characters.
        """
        return self._values.get('display_name')

    @builtins.property
    def organization(self) -> str:
        """The organization whose Cloud Security Command Center the Source lives in."""
        return self._values.get('organization')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """The description of the source (max of 1024 characters)."""
        return self._values.get('description')

    @builtins.property
    def timeouts(self) -> typing.Optional["SccSourceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SccSourceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SccSourceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class SccSourceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SccSourceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SecretManagerSecret(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SecretManagerSecret"):
    def __init__(self, scope: constructs.Construct, id: str, *, replication: typing.List["SecretManagerSecretReplication"], secret_id: str, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["SecretManagerSecretTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param replication: replication block.
        :param secret_id: This must be unique within the project.
        :param labels: The labels assigned to this Secret. Label keys must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62} Label values must be between 0 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63} No more than 64 labels can be assigned to a given resource. An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SecretManagerSecretConfig(replication=replication, secret_id=secret_id, labels=labels, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SecretManagerSecret, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="replication")
    def replication(self) -> typing.List["SecretManagerSecretReplication"]:
        return jsii.get(self, "replication")

    @replication.setter
    def replication(self, value: typing.List["SecretManagerSecretReplication"]) -> None:
        jsii.set(self, "replication", value)

    @builtins.property
    @jsii.member(jsii_name="secretId")
    def secret_id(self) -> str:
        return jsii.get(self, "secretId")

    @secret_id.setter
    def secret_id(self, value: str) -> None:
        jsii.set(self, "secretId", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["SecretManagerSecretTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["SecretManagerSecretTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SecretManagerSecretConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'replication': 'replication', 'secret_id': 'secretId', 'labels': 'labels', 'project': 'project', 'timeouts': 'timeouts'})
class SecretManagerSecretConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, replication: typing.List["SecretManagerSecretReplication"], secret_id: str, labels: typing.Optional[typing.Mapping[str, str]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["SecretManagerSecretTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param replication: replication block.
        :param secret_id: This must be unique within the project.
        :param labels: The labels assigned to this Secret. Label keys must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62} Label values must be between 0 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes, and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63} No more than 64 labels can be assigned to a given resource. An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = SecretManagerSecretTimeouts(**timeouts)
        self._values = {
            'replication': replication,
            'secret_id': secret_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if labels is not None: self._values["labels"] = labels
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def replication(self) -> typing.List["SecretManagerSecretReplication"]:
        """replication block."""
        return self._values.get('replication')

    @builtins.property
    def secret_id(self) -> str:
        """This must be unique within the project."""
        return self._values.get('secret_id')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """The labels assigned to this Secret.

        Label keys must be between 1 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes,
        and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62}

        Label values must be between 0 and 63 characters long, have a UTF-8 encoding of maximum 128 bytes,
        and must conform to the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63}

        No more than 64 labels can be assigned to a given resource.

        An object containing a list of "key": value pairs. Example:
        { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        """
        return self._values.get('labels')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["SecretManagerSecretTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SecretManagerSecretConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SecretManagerSecretIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SecretManagerSecretIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], role: str, secret_id: str, condition: typing.Optional[typing.List["SecretManagerSecretIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param role: 
        :param secret_id: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SecretManagerSecretIamBindingConfig(members=members, role=role, secret_id=secret_id, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SecretManagerSecretIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="secretId")
    def secret_id(self) -> str:
        return jsii.get(self, "secretId")

    @secret_id.setter
    def secret_id(self, value: str) -> None:
        jsii.set(self, "secretId", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["SecretManagerSecretIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["SecretManagerSecretIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SecretManagerSecretIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class SecretManagerSecretIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SecretManagerSecretIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SecretManagerSecretIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'role': 'role', 'secret_id': 'secretId', 'condition': 'condition', 'project': 'project'})
class SecretManagerSecretIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], role: str, secret_id: str, condition: typing.Optional[typing.List["SecretManagerSecretIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param role: 
        :param secret_id: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'role': role,
            'secret_id': secret_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def secret_id(self) -> str:
        return self._values.get('secret_id')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["SecretManagerSecretIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SecretManagerSecretIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SecretManagerSecretIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SecretManagerSecretIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, role: str, secret_id: str, condition: typing.Optional[typing.List["SecretManagerSecretIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param role: 
        :param secret_id: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SecretManagerSecretIamMemberConfig(member=member, role=role, secret_id=secret_id, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SecretManagerSecretIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="secretId")
    def secret_id(self) -> str:
        return jsii.get(self, "secretId")

    @secret_id.setter
    def secret_id(self, value: str) -> None:
        jsii.set(self, "secretId", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["SecretManagerSecretIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["SecretManagerSecretIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SecretManagerSecretIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class SecretManagerSecretIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SecretManagerSecretIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SecretManagerSecretIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'role': 'role', 'secret_id': 'secretId', 'condition': 'condition', 'project': 'project'})
class SecretManagerSecretIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, role: str, secret_id: str, condition: typing.Optional[typing.List["SecretManagerSecretIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param role: 
        :param secret_id: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'role': role,
            'secret_id': secret_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def secret_id(self) -> str:
        return self._values.get('secret_id')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["SecretManagerSecretIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SecretManagerSecretIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SecretManagerSecretIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SecretManagerSecretIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_data: str, secret_id: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_data: 
        :param secret_id: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SecretManagerSecretIamPolicyConfig(policy_data=policy_data, secret_id=secret_id, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SecretManagerSecretIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="secretId")
    def secret_id(self) -> str:
        return jsii.get(self, "secretId")

    @secret_id.setter
    def secret_id(self, value: str) -> None:
        jsii.set(self, "secretId", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SecretManagerSecretIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_data': 'policyData', 'secret_id': 'secretId', 'project': 'project'})
class SecretManagerSecretIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_data: str, secret_id: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_data: 
        :param secret_id: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'policy_data': policy_data,
            'secret_id': secret_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def secret_id(self) -> str:
        return self._values.get('secret_id')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SecretManagerSecretIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SecretManagerSecretReplication", jsii_struct_bases=[], name_mapping={'automatic': 'automatic', 'user_managed': 'userManaged'})
class SecretManagerSecretReplication():
    def __init__(self, *, automatic: typing.Optional[bool]=None, user_managed: typing.Optional[typing.List["SecretManagerSecretReplicationUserManaged"]]=None) -> None:
        """
        :param automatic: The Secret will automatically be replicated without any restrictions.
        :param user_managed: user_managed block.
        """
        self._values = {
        }
        if automatic is not None: self._values["automatic"] = automatic
        if user_managed is not None: self._values["user_managed"] = user_managed

    @builtins.property
    def automatic(self) -> typing.Optional[bool]:
        """The Secret will automatically be replicated without any restrictions."""
        return self._values.get('automatic')

    @builtins.property
    def user_managed(self) -> typing.Optional[typing.List["SecretManagerSecretReplicationUserManaged"]]:
        """user_managed block."""
        return self._values.get('user_managed')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SecretManagerSecretReplication(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SecretManagerSecretReplicationUserManaged", jsii_struct_bases=[], name_mapping={'replicas': 'replicas'})
class SecretManagerSecretReplicationUserManaged():
    def __init__(self, *, replicas: typing.List["SecretManagerSecretReplicationUserManagedReplicas"]) -> None:
        """
        :param replicas: replicas block.
        """
        self._values = {
            'replicas': replicas,
        }

    @builtins.property
    def replicas(self) -> typing.List["SecretManagerSecretReplicationUserManagedReplicas"]:
        """replicas block."""
        return self._values.get('replicas')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SecretManagerSecretReplicationUserManaged(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SecretManagerSecretReplicationUserManagedReplicas", jsii_struct_bases=[], name_mapping={'location': 'location'})
class SecretManagerSecretReplicationUserManagedReplicas():
    def __init__(self, *, location: str) -> None:
        """
        :param location: The canonical IDs of the location to replicate data. For example: "us-east1".
        """
        self._values = {
            'location': location,
        }

    @builtins.property
    def location(self) -> str:
        """The canonical IDs of the location to replicate data.

        For example: "us-east1".
        """
        return self._values.get('location')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SecretManagerSecretReplicationUserManagedReplicas(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SecretManagerSecretTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class SecretManagerSecretTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SecretManagerSecretTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SecretManagerSecretVersion(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SecretManagerSecretVersion"):
    def __init__(self, scope: constructs.Construct, id: str, *, secret: str, enabled: typing.Optional[bool]=None, secret_data: typing.Optional[str]=None, timeouts: typing.Optional["SecretManagerSecretVersionTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param secret: Secret Manager secret resource.
        :param enabled: The current state of the SecretVersion.
        :param secret_data: The secret data. Must be no larger than 64KiB.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SecretManagerSecretVersionConfig(secret=secret, enabled=enabled, secret_data=secret_data, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SecretManagerSecretVersion, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="destroyTime")
    def destroy_time(self) -> str:
        return jsii.get(self, "destroyTime")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="secret")
    def secret(self) -> str:
        return jsii.get(self, "secret")

    @secret.setter
    def secret(self, value: str) -> None:
        jsii.set(self, "secret", value)

    @builtins.property
    @jsii.member(jsii_name="enabled")
    def enabled(self) -> typing.Optional[bool]:
        return jsii.get(self, "enabled")

    @enabled.setter
    def enabled(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "enabled", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="secretData")
    def secret_data(self) -> typing.Optional[str]:
        return jsii.get(self, "secretData")

    @secret_data.setter
    def secret_data(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "secretData", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["SecretManagerSecretVersionTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["SecretManagerSecretVersionTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SecretManagerSecretVersionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'secret': 'secret', 'enabled': 'enabled', 'secret_data': 'secretData', 'timeouts': 'timeouts'})
class SecretManagerSecretVersionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, secret: str, enabled: typing.Optional[bool]=None, secret_data: typing.Optional[str]=None, timeouts: typing.Optional["SecretManagerSecretVersionTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param secret: Secret Manager secret resource.
        :param enabled: The current state of the SecretVersion.
        :param secret_data: The secret data. Must be no larger than 64KiB.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = SecretManagerSecretVersionTimeouts(**timeouts)
        self._values = {
            'secret': secret,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if enabled is not None: self._values["enabled"] = enabled
        if secret_data is not None: self._values["secret_data"] = secret_data
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def secret(self) -> str:
        """Secret Manager secret resource."""
        return self._values.get('secret')

    @builtins.property
    def enabled(self) -> typing.Optional[bool]:
        """The current state of the SecretVersion."""
        return self._values.get('enabled')

    @builtins.property
    def secret_data(self) -> typing.Optional[str]:
        """The secret data.

        Must be no larger than 64KiB.
        """
        return self._values.get('secret_data')

    @builtins.property
    def timeouts(self) -> typing.Optional["SecretManagerSecretVersionTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SecretManagerSecretVersionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SecretManagerSecretVersionTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class SecretManagerSecretVersionTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SecretManagerSecretVersionTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ServiceAccount(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ServiceAccount"):
    def __init__(self, scope: constructs.Construct, id: str, *, account_id: str, description: typing.Optional[str]=None, display_name: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ServiceAccountTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param account_id: The account id that is used to generate the service account email address and a stable unique id. It is unique within a project, must be 6-30 characters long, and match the regular expression `a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_ to comply with RFC1035. Changing this forces a new service account to be created.
        :param description: A text description of the service account. Must be less than or equal to 256 UTF-8 bytes.
        :param display_name: The display name for the service account. Can be updated without creating a new resource.
        :param project: The ID of the project that the service account will be created in. Defaults to the provider project configuration.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServiceAccountConfig(account_id=account_id, description=description, display_name=display_name, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ServiceAccount, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="email")
    def email(self) -> str:
        return jsii.get(self, "email")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="uniqueId")
    def unique_id(self) -> str:
        return jsii.get(self, "uniqueId")

    @builtins.property
    @jsii.member(jsii_name="accountId")
    def account_id(self) -> str:
        return jsii.get(self, "accountId")

    @account_id.setter
    def account_id(self, value: str) -> None:
        jsii.set(self, "accountId", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> typing.Optional[str]:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ServiceAccountTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ServiceAccountTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ServiceAccountConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'account_id': 'accountId', 'description': 'description', 'display_name': 'displayName', 'project': 'project', 'timeouts': 'timeouts'})
class ServiceAccountConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, account_id: str, description: typing.Optional[str]=None, display_name: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["ServiceAccountTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param account_id: The account id that is used to generate the service account email address and a stable unique id. It is unique within a project, must be 6-30 characters long, and match the regular expression `a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_ to comply with RFC1035. Changing this forces a new service account to be created.
        :param description: A text description of the service account. Must be less than or equal to 256 UTF-8 bytes.
        :param display_name: The display name for the service account. Can be updated without creating a new resource.
        :param project: The ID of the project that the service account will be created in. Defaults to the provider project configuration.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ServiceAccountTimeouts(**timeouts)
        self._values = {
            'account_id': account_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if display_name is not None: self._values["display_name"] = display_name
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def account_id(self) -> str:
        """The account id that is used to generate the service account email address and a stable unique id.

        It is unique within a project, must be 6-30 characters long, and match the regular expression `a-z <%5B-a-z0-9%5D*%5Ba-z0-9%5D>`_ to comply with RFC1035. Changing this forces a new service account to be created.
        """
        return self._values.get('account_id')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """A text description of the service account.

        Must be less than or equal to 256 UTF-8 bytes.
        """
        return self._values.get('description')

    @builtins.property
    def display_name(self) -> typing.Optional[str]:
        """The display name for the service account.

        Can be updated without creating a new resource.
        """
        return self._values.get('display_name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project that the service account will be created in.

        Defaults to the provider project configuration.
        """
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["ServiceAccountTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ServiceAccountConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ServiceAccountIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ServiceAccountIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], role: str, service_account_id: str, condition: typing.Optional[typing.List["ServiceAccountIamBindingCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param role: 
        :param service_account_id: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServiceAccountIamBindingConfig(members=members, role=role, service_account_id=service_account_id, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ServiceAccountIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="serviceAccountId")
    def service_account_id(self) -> str:
        return jsii.get(self, "serviceAccountId")

    @service_account_id.setter
    def service_account_id(self, value: str) -> None:
        jsii.set(self, "serviceAccountId", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["ServiceAccountIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["ServiceAccountIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ServiceAccountIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class ServiceAccountIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ServiceAccountIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ServiceAccountIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'role': 'role', 'service_account_id': 'serviceAccountId', 'condition': 'condition'})
class ServiceAccountIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], role: str, service_account_id: str, condition: typing.Optional[typing.List["ServiceAccountIamBindingCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param role: 
        :param service_account_id: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'role': role,
            'service_account_id': service_account_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def service_account_id(self) -> str:
        return self._values.get('service_account_id')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["ServiceAccountIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ServiceAccountIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ServiceAccountIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ServiceAccountIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, role: str, service_account_id: str, condition: typing.Optional[typing.List["ServiceAccountIamMemberCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param role: 
        :param service_account_id: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServiceAccountIamMemberConfig(member=member, role=role, service_account_id=service_account_id, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ServiceAccountIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="serviceAccountId")
    def service_account_id(self) -> str:
        return jsii.get(self, "serviceAccountId")

    @service_account_id.setter
    def service_account_id(self, value: str) -> None:
        jsii.set(self, "serviceAccountId", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["ServiceAccountIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["ServiceAccountIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ServiceAccountIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class ServiceAccountIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ServiceAccountIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ServiceAccountIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'role': 'role', 'service_account_id': 'serviceAccountId', 'condition': 'condition'})
class ServiceAccountIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, role: str, service_account_id: str, condition: typing.Optional[typing.List["ServiceAccountIamMemberCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param role: 
        :param service_account_id: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'role': role,
            'service_account_id': service_account_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def service_account_id(self) -> str:
        return self._values.get('service_account_id')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["ServiceAccountIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ServiceAccountIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ServiceAccountIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ServiceAccountIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_data: str, service_account_id: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_data: 
        :param service_account_id: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServiceAccountIamPolicyConfig(policy_data=policy_data, service_account_id=service_account_id, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ServiceAccountIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="serviceAccountId")
    def service_account_id(self) -> str:
        return jsii.get(self, "serviceAccountId")

    @service_account_id.setter
    def service_account_id(self, value: str) -> None:
        jsii.set(self, "serviceAccountId", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ServiceAccountIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_data': 'policyData', 'service_account_id': 'serviceAccountId'})
class ServiceAccountIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_data: str, service_account_id: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_data: 
        :param service_account_id: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'policy_data': policy_data,
            'service_account_id': service_account_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def service_account_id(self) -> str:
        return self._values.get('service_account_id')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ServiceAccountIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ServiceAccountKey(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ServiceAccountKey"):
    def __init__(self, scope: constructs.Construct, id: str, *, service_account_id: str, key_algorithm: typing.Optional[str]=None, pgp_key: typing.Optional[str]=None, private_key_type: typing.Optional[str]=None, public_key_data: typing.Optional[str]=None, public_key_type: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param service_account_id: The ID of the parent service account of the key. This can be a string in the format {ACCOUNT} or projects/{PROJECT_ID}/serviceAccounts/{ACCOUNT}, where {ACCOUNT} is the email address or unique id of the service account. If the {ACCOUNT} syntax is used, the project will be inferred from the account.
        :param key_algorithm: The algorithm used to generate the key, used only on create. KEY_ALG_RSA_2048 is the default algorithm. Valid values are: "KEY_ALG_RSA_1024", "KEY_ALG_RSA_2048".
        :param pgp_key: 
        :param private_key_type: 
        :param public_key_data: A field that allows clients to upload their own public key. If set, use this public key data to create a service account key for given service account. Please note, the expected format for this field is a base64 encoded X509_PEM.
        :param public_key_type: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServiceAccountKeyConfig(service_account_id=service_account_id, key_algorithm=key_algorithm, pgp_key=pgp_key, private_key_type=private_key_type, public_key_data=public_key_data, public_key_type=public_key_type, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ServiceAccountKey, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="privateKey")
    def private_key(self) -> str:
        return jsii.get(self, "privateKey")

    @builtins.property
    @jsii.member(jsii_name="privateKeyEncrypted")
    def private_key_encrypted(self) -> str:
        return jsii.get(self, "privateKeyEncrypted")

    @builtins.property
    @jsii.member(jsii_name="privateKeyFingerprint")
    def private_key_fingerprint(self) -> str:
        return jsii.get(self, "privateKeyFingerprint")

    @builtins.property
    @jsii.member(jsii_name="publicKey")
    def public_key(self) -> str:
        return jsii.get(self, "publicKey")

    @builtins.property
    @jsii.member(jsii_name="validAfter")
    def valid_after(self) -> str:
        return jsii.get(self, "validAfter")

    @builtins.property
    @jsii.member(jsii_name="validBefore")
    def valid_before(self) -> str:
        return jsii.get(self, "validBefore")

    @builtins.property
    @jsii.member(jsii_name="serviceAccountId")
    def service_account_id(self) -> str:
        return jsii.get(self, "serviceAccountId")

    @service_account_id.setter
    def service_account_id(self, value: str) -> None:
        jsii.set(self, "serviceAccountId", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="keyAlgorithm")
    def key_algorithm(self) -> typing.Optional[str]:
        return jsii.get(self, "keyAlgorithm")

    @key_algorithm.setter
    def key_algorithm(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "keyAlgorithm", value)

    @builtins.property
    @jsii.member(jsii_name="pgpKey")
    def pgp_key(self) -> typing.Optional[str]:
        return jsii.get(self, "pgpKey")

    @pgp_key.setter
    def pgp_key(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "pgpKey", value)

    @builtins.property
    @jsii.member(jsii_name="privateKeyType")
    def private_key_type(self) -> typing.Optional[str]:
        return jsii.get(self, "privateKeyType")

    @private_key_type.setter
    def private_key_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "privateKeyType", value)

    @builtins.property
    @jsii.member(jsii_name="publicKeyData")
    def public_key_data(self) -> typing.Optional[str]:
        return jsii.get(self, "publicKeyData")

    @public_key_data.setter
    def public_key_data(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "publicKeyData", value)

    @builtins.property
    @jsii.member(jsii_name="publicKeyType")
    def public_key_type(self) -> typing.Optional[str]:
        return jsii.get(self, "publicKeyType")

    @public_key_type.setter
    def public_key_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "publicKeyType", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ServiceAccountKeyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'service_account_id': 'serviceAccountId', 'key_algorithm': 'keyAlgorithm', 'pgp_key': 'pgpKey', 'private_key_type': 'privateKeyType', 'public_key_data': 'publicKeyData', 'public_key_type': 'publicKeyType'})
class ServiceAccountKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, service_account_id: str, key_algorithm: typing.Optional[str]=None, pgp_key: typing.Optional[str]=None, private_key_type: typing.Optional[str]=None, public_key_data: typing.Optional[str]=None, public_key_type: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param service_account_id: The ID of the parent service account of the key. This can be a string in the format {ACCOUNT} or projects/{PROJECT_ID}/serviceAccounts/{ACCOUNT}, where {ACCOUNT} is the email address or unique id of the service account. If the {ACCOUNT} syntax is used, the project will be inferred from the account.
        :param key_algorithm: The algorithm used to generate the key, used only on create. KEY_ALG_RSA_2048 is the default algorithm. Valid values are: "KEY_ALG_RSA_1024", "KEY_ALG_RSA_2048".
        :param pgp_key: 
        :param private_key_type: 
        :param public_key_data: A field that allows clients to upload their own public key. If set, use this public key data to create a service account key for given service account. Please note, the expected format for this field is a base64 encoded X509_PEM.
        :param public_key_type: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'service_account_id': service_account_id,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if key_algorithm is not None: self._values["key_algorithm"] = key_algorithm
        if pgp_key is not None: self._values["pgp_key"] = pgp_key
        if private_key_type is not None: self._values["private_key_type"] = private_key_type
        if public_key_data is not None: self._values["public_key_data"] = public_key_data
        if public_key_type is not None: self._values["public_key_type"] = public_key_type

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def service_account_id(self) -> str:
        """The ID of the parent service account of the key.

        This can be a string in the format {ACCOUNT} or projects/{PROJECT_ID}/serviceAccounts/{ACCOUNT}, where {ACCOUNT} is the email address or unique id of the service account. If the {ACCOUNT} syntax is used, the project will be inferred from the account.
        """
        return self._values.get('service_account_id')

    @builtins.property
    def key_algorithm(self) -> typing.Optional[str]:
        """The algorithm used to generate the key, used only on create.

        KEY_ALG_RSA_2048 is the default algorithm. Valid values are: "KEY_ALG_RSA_1024", "KEY_ALG_RSA_2048".
        """
        return self._values.get('key_algorithm')

    @builtins.property
    def pgp_key(self) -> typing.Optional[str]:
        return self._values.get('pgp_key')

    @builtins.property
    def private_key_type(self) -> typing.Optional[str]:
        return self._values.get('private_key_type')

    @builtins.property
    def public_key_data(self) -> typing.Optional[str]:
        """A field that allows clients to upload their own public key.

        If set, use this public key data to create a service account key for given service account. Please note, the expected format for this field is a base64 encoded X509_PEM.
        """
        return self._values.get('public_key_data')

    @builtins.property
    def public_key_type(self) -> typing.Optional[str]:
        return self._values.get('public_key_type')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ServiceAccountKeyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ServiceAccountTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create'})
class ServiceAccountTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None) -> None:
        """
        :param create: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ServiceAccountTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class ServiceNetworkingConnection(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.ServiceNetworkingConnection"):
    def __init__(self, scope: constructs.Construct, id: str, *, network: str, reserved_peering_ranges: typing.List[str], service: str, timeouts: typing.Optional["ServiceNetworkingConnectionTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param network: Name of VPC network connected with service producers using VPC peering.
        :param reserved_peering_ranges: Named IP address range(s) of PEERING type reserved for this service provider. Note that invoking this method with a different range when connection is already established will not reallocate already provisioned service producer subnetworks.
        :param service: Provider peering service that is managing peering connectivity for a service provider organization. For Google services that support this functionality it is 'servicenetworking.googleapis.com'.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = ServiceNetworkingConnectionConfig(network=network, reserved_peering_ranges=reserved_peering_ranges, service=service, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(ServiceNetworkingConnection, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="peering")
    def peering(self) -> str:
        return jsii.get(self, "peering")

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: str) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="reservedPeeringRanges")
    def reserved_peering_ranges(self) -> typing.List[str]:
        return jsii.get(self, "reservedPeeringRanges")

    @reserved_peering_ranges.setter
    def reserved_peering_ranges(self, value: typing.List[str]) -> None:
        jsii.set(self, "reservedPeeringRanges", value)

    @builtins.property
    @jsii.member(jsii_name="service")
    def service(self) -> str:
        return jsii.get(self, "service")

    @service.setter
    def service(self, value: str) -> None:
        jsii.set(self, "service", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["ServiceNetworkingConnectionTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["ServiceNetworkingConnectionTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.ServiceNetworkingConnectionConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'network': 'network', 'reserved_peering_ranges': 'reservedPeeringRanges', 'service': 'service', 'timeouts': 'timeouts'})
class ServiceNetworkingConnectionConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, network: str, reserved_peering_ranges: typing.List[str], service: str, timeouts: typing.Optional["ServiceNetworkingConnectionTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param network: Name of VPC network connected with service producers using VPC peering.
        :param reserved_peering_ranges: Named IP address range(s) of PEERING type reserved for this service provider. Note that invoking this method with a different range when connection is already established will not reallocate already provisioned service producer subnetworks.
        :param service: Provider peering service that is managing peering connectivity for a service provider organization. For Google services that support this functionality it is 'servicenetworking.googleapis.com'.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = ServiceNetworkingConnectionTimeouts(**timeouts)
        self._values = {
            'network': network,
            'reserved_peering_ranges': reserved_peering_ranges,
            'service': service,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def network(self) -> str:
        """Name of VPC network connected with service producers using VPC peering."""
        return self._values.get('network')

    @builtins.property
    def reserved_peering_ranges(self) -> typing.List[str]:
        """Named IP address range(s) of PEERING type reserved for this service provider.

        Note that invoking this method with a different range when connection is already established will not reallocate already provisioned service producer subnetworks.
        """
        return self._values.get('reserved_peering_ranges')

    @builtins.property
    def service(self) -> str:
        """Provider peering service that is managing peering connectivity for a service provider organization.

        For Google services that support this functionality it is 'servicenetworking.googleapis.com'.
        """
        return self._values.get('service')

    @builtins.property
    def timeouts(self) -> typing.Optional["ServiceNetworkingConnectionTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ServiceNetworkingConnectionConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.ServiceNetworkingConnectionTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class ServiceNetworkingConnectionTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'ServiceNetworkingConnectionTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SourcerepoRepository(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SourcerepoRepository"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, project: typing.Optional[str]=None, pubsub_configs: typing.Optional[typing.List["SourcerepoRepositoryPubsubConfigs"]]=None, timeouts: typing.Optional["SourcerepoRepositoryTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: Resource name of the repository, of the form '{{repo}}'. The repo name may contain slashes. eg, 'name/with/slash'
        :param project: 
        :param pubsub_configs: pubsub_configs block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SourcerepoRepositoryConfig(name=name, project=project, pubsub_configs=pubsub_configs, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SourcerepoRepository, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="size")
    def size(self) -> jsii.Number:
        return jsii.get(self, "size")

    @builtins.property
    @jsii.member(jsii_name="url")
    def url(self) -> str:
        return jsii.get(self, "url")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="pubsubConfigs")
    def pubsub_configs(self) -> typing.Optional[typing.List["SourcerepoRepositoryPubsubConfigs"]]:
        return jsii.get(self, "pubsubConfigs")

    @pubsub_configs.setter
    def pubsub_configs(self, value: typing.Optional[typing.List["SourcerepoRepositoryPubsubConfigs"]]) -> None:
        jsii.set(self, "pubsubConfigs", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["SourcerepoRepositoryTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["SourcerepoRepositoryTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SourcerepoRepositoryConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'project': 'project', 'pubsub_configs': 'pubsubConfigs', 'timeouts': 'timeouts'})
class SourcerepoRepositoryConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, project: typing.Optional[str]=None, pubsub_configs: typing.Optional[typing.List["SourcerepoRepositoryPubsubConfigs"]]=None, timeouts: typing.Optional["SourcerepoRepositoryTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: Resource name of the repository, of the form '{{repo}}'. The repo name may contain slashes. eg, 'name/with/slash'
        :param project: 
        :param pubsub_configs: pubsub_configs block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = SourcerepoRepositoryTimeouts(**timeouts)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if pubsub_configs is not None: self._values["pubsub_configs"] = pubsub_configs
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """Resource name of the repository, of the form '{{repo}}'.

        The repo name may contain slashes. eg, 'name/with/slash'
        """
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def pubsub_configs(self) -> typing.Optional[typing.List["SourcerepoRepositoryPubsubConfigs"]]:
        """pubsub_configs block."""
        return self._values.get('pubsub_configs')

    @builtins.property
    def timeouts(self) -> typing.Optional["SourcerepoRepositoryTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SourcerepoRepositoryConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SourcerepoRepositoryIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SourcerepoRepositoryIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, members: typing.List[str], repository: str, role: str, condition: typing.Optional[typing.List["SourcerepoRepositoryIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param members: 
        :param repository: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SourcerepoRepositoryIamBindingConfig(members=members, repository=repository, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SourcerepoRepositoryIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="repository")
    def repository(self) -> str:
        return jsii.get(self, "repository")

    @repository.setter
    def repository(self, value: str) -> None:
        jsii.set(self, "repository", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["SourcerepoRepositoryIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["SourcerepoRepositoryIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SourcerepoRepositoryIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class SourcerepoRepositoryIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SourcerepoRepositoryIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SourcerepoRepositoryIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'members': 'members', 'repository': 'repository', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class SourcerepoRepositoryIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, members: typing.List[str], repository: str, role: str, condition: typing.Optional[typing.List["SourcerepoRepositoryIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param members: 
        :param repository: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'members': members,
            'repository': repository,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def repository(self) -> str:
        return self._values.get('repository')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["SourcerepoRepositoryIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SourcerepoRepositoryIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SourcerepoRepositoryIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SourcerepoRepositoryIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, member: str, repository: str, role: str, condition: typing.Optional[typing.List["SourcerepoRepositoryIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param member: 
        :param repository: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SourcerepoRepositoryIamMemberConfig(member=member, repository=repository, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SourcerepoRepositoryIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="repository")
    def repository(self) -> str:
        return jsii.get(self, "repository")

    @repository.setter
    def repository(self, value: str) -> None:
        jsii.set(self, "repository", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["SourcerepoRepositoryIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["SourcerepoRepositoryIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SourcerepoRepositoryIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class SourcerepoRepositoryIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SourcerepoRepositoryIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SourcerepoRepositoryIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'member': 'member', 'repository': 'repository', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class SourcerepoRepositoryIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, member: str, repository: str, role: str, condition: typing.Optional[typing.List["SourcerepoRepositoryIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param member: 
        :param repository: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'member': member,
            'repository': repository,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def repository(self) -> str:
        return self._values.get('repository')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["SourcerepoRepositoryIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SourcerepoRepositoryIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SourcerepoRepositoryIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SourcerepoRepositoryIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, policy_data: str, repository: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param policy_data: 
        :param repository: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SourcerepoRepositoryIamPolicyConfig(policy_data=policy_data, repository=repository, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SourcerepoRepositoryIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="repository")
    def repository(self) -> str:
        return jsii.get(self, "repository")

    @repository.setter
    def repository(self, value: str) -> None:
        jsii.set(self, "repository", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SourcerepoRepositoryIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'policy_data': 'policyData', 'repository': 'repository', 'project': 'project'})
class SourcerepoRepositoryIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, policy_data: str, repository: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param policy_data: 
        :param repository: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'policy_data': policy_data,
            'repository': repository,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def repository(self) -> str:
        return self._values.get('repository')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SourcerepoRepositoryIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SourcerepoRepositoryPubsubConfigs", jsii_struct_bases=[], name_mapping={'message_format': 'messageFormat', 'topic': 'topic', 'service_account_email': 'serviceAccountEmail'})
class SourcerepoRepositoryPubsubConfigs():
    def __init__(self, *, message_format: str, topic: str, service_account_email: typing.Optional[str]=None) -> None:
        """
        :param message_format: The format of the Cloud Pub/Sub messages. - PROTOBUF: The message payload is a serialized protocol buffer of SourceRepoEvent. - JSON: The message payload is a JSON string of SourceRepoEvent. Possible values: ["PROTOBUF", "JSON"]
        :param topic: 
        :param service_account_email: Email address of the service account used for publishing Cloud Pub/Sub messages. This service account needs to be in the same project as the PubsubConfig. When added, the caller needs to have iam.serviceAccounts.actAs permission on this service account. If unspecified, it defaults to the compute engine default service account.
        """
        self._values = {
            'message_format': message_format,
            'topic': topic,
        }
        if service_account_email is not None: self._values["service_account_email"] = service_account_email

    @builtins.property
    def message_format(self) -> str:
        """The format of the Cloud Pub/Sub messages.

        - PROTOBUF: The message payload is a serialized protocol buffer of SourceRepoEvent.
        - JSON: The message payload is a JSON string of SourceRepoEvent. Possible values: ["PROTOBUF", "JSON"]
        """
        return self._values.get('message_format')

    @builtins.property
    def topic(self) -> str:
        return self._values.get('topic')

    @builtins.property
    def service_account_email(self) -> typing.Optional[str]:
        """Email address of the service account used for publishing Cloud Pub/Sub messages.

        This service account needs to be in the same project as the PubsubConfig. When added,
        the caller needs to have iam.serviceAccounts.actAs permission on this service account.
        If unspecified, it defaults to the compute engine default service account.
        """
        return self._values.get('service_account_email')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SourcerepoRepositoryPubsubConfigs(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SourcerepoRepositoryTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class SourcerepoRepositoryTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SourcerepoRepositoryTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SpannerDatabase(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SpannerDatabase"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, name: str, ddl: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["SpannerDatabaseTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: The instance to create the database on.
        :param name: A unique identifier for the database, which cannot be changed after the instance is created. Values are of the form [a-z][-a-z0-9]*[a-z0-9].
        :param ddl: An optional list of DDL statements to run inside the newly created database. Statements can create tables, indexes, etc. These statements execute atomically with the creation of the database: if there is an error in any statement, the database is not created.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SpannerDatabaseConfig(instance=instance, name=name, ddl=ddl, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SpannerDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="state")
    def state(self) -> str:
        return jsii.get(self, "state")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="ddl")
    def ddl(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "ddl")

    @ddl.setter
    def ddl(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "ddl", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["SpannerDatabaseTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["SpannerDatabaseTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerDatabaseConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'name': 'name', 'ddl': 'ddl', 'project': 'project', 'timeouts': 'timeouts'})
class SpannerDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, name: str, ddl: typing.Optional[typing.List[str]]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["SpannerDatabaseTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: The instance to create the database on.
        :param name: A unique identifier for the database, which cannot be changed after the instance is created. Values are of the form [a-z][-a-z0-9]*[a-z0-9].
        :param ddl: An optional list of DDL statements to run inside the newly created database. Statements can create tables, indexes, etc. These statements execute atomically with the creation of the database: if there is an error in any statement, the database is not created.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = SpannerDatabaseTimeouts(**timeouts)
        self._values = {
            'instance': instance,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if ddl is not None: self._values["ddl"] = ddl
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        """The instance to create the database on."""
        return self._values.get('instance')

    @builtins.property
    def name(self) -> str:
        """A unique identifier for the database, which cannot be changed after the instance is created.

        Values are of the form [a-z][-a-z0-9]*[a-z0-9].
        """
        return self._values.get('name')

    @builtins.property
    def ddl(self) -> typing.Optional[typing.List[str]]:
        """An optional list of DDL statements to run inside the newly created database.

        Statements can create tables, indexes, etc. These statements
        execute atomically with the creation of the database: if there is an
        error in any statement, the database is not created.
        """
        return self._values.get('ddl')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["SpannerDatabaseTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerDatabaseConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SpannerDatabaseIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SpannerDatabaseIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, database: str, instance: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["SpannerDatabaseIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param database: 
        :param instance: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SpannerDatabaseIamBindingConfig(database=database, instance=instance, members=members, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SpannerDatabaseIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="database")
    def database(self) -> str:
        return jsii.get(self, "database")

    @database.setter
    def database(self, value: str) -> None:
        jsii.set(self, "database", value)

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["SpannerDatabaseIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["SpannerDatabaseIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerDatabaseIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class SpannerDatabaseIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerDatabaseIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerDatabaseIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'database': 'database', 'instance': 'instance', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class SpannerDatabaseIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, database: str, instance: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["SpannerDatabaseIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param database: 
        :param instance: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'database': database,
            'instance': instance,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def database(self) -> str:
        return self._values.get('database')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["SpannerDatabaseIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerDatabaseIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SpannerDatabaseIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SpannerDatabaseIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, database: str, instance: str, member: str, role: str, condition: typing.Optional[typing.List["SpannerDatabaseIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param database: 
        :param instance: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SpannerDatabaseIamMemberConfig(database=database, instance=instance, member=member, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SpannerDatabaseIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="database")
    def database(self) -> str:
        return jsii.get(self, "database")

    @database.setter
    def database(self, value: str) -> None:
        jsii.set(self, "database", value)

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["SpannerDatabaseIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["SpannerDatabaseIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerDatabaseIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class SpannerDatabaseIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerDatabaseIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerDatabaseIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'database': 'database', 'instance': 'instance', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class SpannerDatabaseIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, database: str, instance: str, member: str, role: str, condition: typing.Optional[typing.List["SpannerDatabaseIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param database: 
        :param instance: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'database': database,
            'instance': instance,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def database(self) -> str:
        return self._values.get('database')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["SpannerDatabaseIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerDatabaseIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SpannerDatabaseIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SpannerDatabaseIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, database: str, instance: str, policy_data: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param database: 
        :param instance: 
        :param policy_data: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SpannerDatabaseIamPolicyConfig(database=database, instance=instance, policy_data=policy_data, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SpannerDatabaseIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="database")
    def database(self) -> str:
        return jsii.get(self, "database")

    @database.setter
    def database(self, value: str) -> None:
        jsii.set(self, "database", value)

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerDatabaseIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'database': 'database', 'instance': 'instance', 'policy_data': 'policyData', 'project': 'project'})
class SpannerDatabaseIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, database: str, instance: str, policy_data: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param database: 
        :param instance: 
        :param policy_data: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'database': database,
            'instance': instance,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def database(self) -> str:
        return self._values.get('database')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerDatabaseIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerDatabaseTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class SpannerDatabaseTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerDatabaseTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SpannerInstance(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SpannerInstance"):
    def __init__(self, scope: constructs.Construct, id: str, *, config: str, display_name: str, labels: typing.Optional[typing.Mapping[str, str]]=None, name: typing.Optional[str]=None, num_nodes: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["SpannerInstanceTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param config: The name of the instance's configuration (similar but not quite the same as a region) which defines defines the geographic placement and replication of your databases in this instance. It determines where your data is stored. Values are typically of the form 'regional-europe-west1' , 'us-central' etc. In order to obtain a valid list please consult the `Configuration section of the docs <https://cloud.google.com/spanner/docs/instances>`_.
        :param display_name: The descriptive name for this instance as it appears in UIs. Must be unique per project and between 4 and 30 characters in length.
        :param labels: An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        :param name: A unique identifier for the instance, which cannot be changed after the instance is created. The name must be between 6 and 30 characters in length. If not provided, a random string starting with 'tf-' will be selected.
        :param num_nodes: The number of nodes allocated to this instance.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config_ = SpannerInstanceConfig(config=config, display_name=display_name, labels=labels, name=name, num_nodes=num_nodes, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SpannerInstance, self, [scope, id, config_])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="state")
    def state(self) -> str:
        return jsii.get(self, "state")

    @builtins.property
    @jsii.member(jsii_name="config")
    def config(self) -> str:
        return jsii.get(self, "config")

    @config.setter
    def config(self, value: str) -> None:
        jsii.set(self, "config", value)

    @builtins.property
    @jsii.member(jsii_name="displayName")
    def display_name(self) -> str:
        return jsii.get(self, "displayName")

    @display_name.setter
    def display_name(self, value: str) -> None:
        jsii.set(self, "displayName", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="numNodes")
    def num_nodes(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "numNodes")

    @num_nodes.setter
    def num_nodes(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "numNodes", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["SpannerInstanceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["SpannerInstanceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerInstanceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'config': 'config', 'display_name': 'displayName', 'labels': 'labels', 'name': 'name', 'num_nodes': 'numNodes', 'project': 'project', 'timeouts': 'timeouts'})
class SpannerInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, config: str, display_name: str, labels: typing.Optional[typing.Mapping[str, str]]=None, name: typing.Optional[str]=None, num_nodes: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["SpannerInstanceTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param config: The name of the instance's configuration (similar but not quite the same as a region) which defines defines the geographic placement and replication of your databases in this instance. It determines where your data is stored. Values are typically of the form 'regional-europe-west1' , 'us-central' etc. In order to obtain a valid list please consult the `Configuration section of the docs <https://cloud.google.com/spanner/docs/instances>`_.
        :param display_name: The descriptive name for this instance as it appears in UIs. Must be unique per project and between 4 and 30 characters in length.
        :param labels: An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        :param name: A unique identifier for the instance, which cannot be changed after the instance is created. The name must be between 6 and 30 characters in length. If not provided, a random string starting with 'tf-' will be selected.
        :param num_nodes: The number of nodes allocated to this instance.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = SpannerInstanceTimeouts(**timeouts)
        self._values = {
            'config': config,
            'display_name': display_name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if labels is not None: self._values["labels"] = labels
        if name is not None: self._values["name"] = name
        if num_nodes is not None: self._values["num_nodes"] = num_nodes
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def config(self) -> str:
        """The name of the instance's configuration (similar but not quite the same as a region) which defines defines the geographic placement and replication of your databases in this instance.

        It determines where your data
        is stored. Values are typically of the form 'regional-europe-west1' , 'us-central' etc.
        In order to obtain a valid list please consult the
        `Configuration section of the docs <https://cloud.google.com/spanner/docs/instances>`_.
        """
        return self._values.get('config')

    @builtins.property
    def display_name(self) -> str:
        """The descriptive name for this instance as it appears in UIs.

        Must be
        unique per project and between 4 and 30 characters in length.
        """
        return self._values.get('display_name')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """An object containing a list of "key": value pairs.

        Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }.
        """
        return self._values.get('labels')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """A unique identifier for the instance, which cannot be changed after the instance is created.

        The name must be between 6 and 30 characters
        in length.

        If not provided, a random string starting with 'tf-' will be selected.
        """
        return self._values.get('name')

    @builtins.property
    def num_nodes(self) -> typing.Optional[jsii.Number]:
        """The number of nodes allocated to this instance."""
        return self._values.get('num_nodes')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["SpannerInstanceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SpannerInstanceIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SpannerInstanceIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["SpannerInstanceIamBindingCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SpannerInstanceIamBindingConfig(instance=instance, members=members, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SpannerInstanceIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["SpannerInstanceIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["SpannerInstanceIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerInstanceIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class SpannerInstanceIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerInstanceIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerInstanceIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'members': 'members', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class SpannerInstanceIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["SpannerInstanceIamBindingCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance': instance,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["SpannerInstanceIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerInstanceIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SpannerInstanceIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SpannerInstanceIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, member: str, role: str, condition: typing.Optional[typing.List["SpannerInstanceIamMemberCondition"]]=None, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SpannerInstanceIamMemberConfig(instance=instance, member=member, role=role, condition=condition, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SpannerInstanceIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["SpannerInstanceIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["SpannerInstanceIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerInstanceIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class SpannerInstanceIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerInstanceIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerInstanceIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'member': 'member', 'role': 'role', 'condition': 'condition', 'project': 'project'})
class SpannerInstanceIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, member: str, role: str, condition: typing.Optional[typing.List["SpannerInstanceIamMemberCondition"]]=None, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance': instance,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["SpannerInstanceIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerInstanceIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SpannerInstanceIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SpannerInstanceIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, policy_data: str, project: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: 
        :param policy_data: 
        :param project: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SpannerInstanceIamPolicyConfig(instance=instance, policy_data=policy_data, project=project, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SpannerInstanceIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerInstanceIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'policy_data': 'policyData', 'project': 'project'})
class SpannerInstanceIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, policy_data: str, project: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: 
        :param policy_data: 
        :param project: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'instance': instance,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        return self._values.get('instance')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerInstanceIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SpannerInstanceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class SpannerInstanceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SpannerInstanceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SqlDatabase(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SqlDatabase"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, name: str, charset: typing.Optional[str]=None, collation: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["SqlDatabaseTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: The name of the Cloud SQL instance. This does not include the project ID.
        :param name: The name of the database in the Cloud SQL instance. This does not include the project ID or instance name.
        :param charset: The charset value. See MySQL's `Supported Character Sets and Collations <https://dev.mysql.com/doc/refman/5.7/en/charset-charsets.html>`_ and Postgres' `Character Set Support <https://www.postgresql.org/docs/9.6/static/multibyte.html>`_ for more details and supported values. Postgres databases only support a value of 'UTF8' at creation time.
        :param collation: The collation value. See MySQL's `Supported Character Sets and Collations <https://dev.mysql.com/doc/refman/5.7/en/charset-charsets.html>`_ and Postgres' `Collation Support <https://www.postgresql.org/docs/9.6/static/collation.html>`_ for more details and supported values. Postgres databases only support a value of 'en_US.UTF8' at creation time.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SqlDatabaseConfig(instance=instance, name=name, charset=charset, collation=collation, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SqlDatabase, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="charset")
    def charset(self) -> typing.Optional[str]:
        return jsii.get(self, "charset")

    @charset.setter
    def charset(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "charset", value)

    @builtins.property
    @jsii.member(jsii_name="collation")
    def collation(self) -> typing.Optional[str]:
        return jsii.get(self, "collation")

    @collation.setter
    def collation(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "collation", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["SqlDatabaseTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["SqlDatabaseTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlDatabaseConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'name': 'name', 'charset': 'charset', 'collation': 'collation', 'project': 'project', 'timeouts': 'timeouts'})
class SqlDatabaseConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, name: str, charset: typing.Optional[str]=None, collation: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["SqlDatabaseTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: The name of the Cloud SQL instance. This does not include the project ID.
        :param name: The name of the database in the Cloud SQL instance. This does not include the project ID or instance name.
        :param charset: The charset value. See MySQL's `Supported Character Sets and Collations <https://dev.mysql.com/doc/refman/5.7/en/charset-charsets.html>`_ and Postgres' `Character Set Support <https://www.postgresql.org/docs/9.6/static/multibyte.html>`_ for more details and supported values. Postgres databases only support a value of 'UTF8' at creation time.
        :param collation: The collation value. See MySQL's `Supported Character Sets and Collations <https://dev.mysql.com/doc/refman/5.7/en/charset-charsets.html>`_ and Postgres' `Collation Support <https://www.postgresql.org/docs/9.6/static/collation.html>`_ for more details and supported values. Postgres databases only support a value of 'en_US.UTF8' at creation time.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = SqlDatabaseTimeouts(**timeouts)
        self._values = {
            'instance': instance,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if charset is not None: self._values["charset"] = charset
        if collation is not None: self._values["collation"] = collation
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        """The name of the Cloud SQL instance.

        This does not include the project
        ID.
        """
        return self._values.get('instance')

    @builtins.property
    def name(self) -> str:
        """The name of the database in the Cloud SQL instance.

        This does not include the project ID or instance name.
        """
        return self._values.get('name')

    @builtins.property
    def charset(self) -> typing.Optional[str]:
        """The charset value.

        See MySQL's
        `Supported Character Sets and Collations <https://dev.mysql.com/doc/refman/5.7/en/charset-charsets.html>`_
        and Postgres' `Character Set Support <https://www.postgresql.org/docs/9.6/static/multibyte.html>`_
        for more details and supported values. Postgres databases only support
        a value of 'UTF8' at creation time.
        """
        return self._values.get('charset')

    @builtins.property
    def collation(self) -> typing.Optional[str]:
        """The collation value.

        See MySQL's
        `Supported Character Sets and Collations <https://dev.mysql.com/doc/refman/5.7/en/charset-charsets.html>`_
        and Postgres' `Collation Support <https://www.postgresql.org/docs/9.6/static/collation.html>`_
        for more details and supported values. Postgres databases only support
        a value of 'en_US.UTF8' at creation time.
        """
        return self._values.get('collation')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["SqlDatabaseTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlDatabaseConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SqlDatabaseInstance(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SqlDatabaseInstance"):
    def __init__(self, scope: constructs.Construct, id: str, *, settings: typing.List["SqlDatabaseInstanceSettings"], database_version: typing.Optional[str]=None, master_instance_name: typing.Optional[str]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, replica_configuration: typing.Optional[typing.List["SqlDatabaseInstanceReplicaConfiguration"]]=None, root_password: typing.Optional[str]=None, timeouts: typing.Optional["SqlDatabaseInstanceTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param settings: settings block.
        :param database_version: The MySQL, PostgreSQL or SQL Server (beta) version to use. Supported values include MYSQL_5_6, MYSQL_5_7, POSTGRES_9_6,POSTGRES_11, SQLSERVER_2017_STANDARD, SQLSERVER_2017_ENTERPRISE, SQLSERVER_2017_EXPRESS, SQLSERVER_2017_WEB. Database Version Policies includes an up-to-date reference of supported versions.
        :param master_instance_name: The name of the instance that will act as the master in the replication setup. Note, this requires the master to have binary_log_enabled set, as well as existing backups.
        :param name: The name of the instance. If the name is left blank, Terraform will randomly generate one when the instance is first created. This is done because after a name is used, it cannot be reused for up to one week.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param region: The region the instance will sit in. Note, Cloud SQL is not available in all regions - choose from one of the options listed here. A valid region must be provided to use this resource. If a region is not provided in the resource definition, the provider region will be used instead, but this will be an apply-time error for instances if the provider region is not supported with Cloud SQL. If you choose not to provide the region argument for this resource, make sure you understand this.
        :param replica_configuration: replica_configuration block.
        :param root_password: Initial root password. Required for MS SQL Server, ignored by MySQL and PostgreSQL.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SqlDatabaseInstanceConfig(settings=settings, database_version=database_version, master_instance_name=master_instance_name, name=name, project=project, region=region, replica_configuration=replica_configuration, root_password=root_password, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SqlDatabaseInstance, self, [scope, id, config])

    @jsii.member(jsii_name="ipAddress")
    def ip_address(self, index: str) -> "SqlDatabaseInstanceIpAddress":
        """
        :param index: -
        """
        return jsii.invoke(self, "ipAddress", [index])

    @jsii.member(jsii_name="serverCaCert")
    def server_ca_cert(self, index: str) -> "SqlDatabaseInstanceServerCaCert":
        """
        :param index: -
        """
        return jsii.invoke(self, "serverCaCert", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="connectionName")
    def connection_name(self) -> str:
        return jsii.get(self, "connectionName")

    @builtins.property
    @jsii.member(jsii_name="firstIpAddress")
    def first_ip_address(self) -> str:
        return jsii.get(self, "firstIpAddress")

    @builtins.property
    @jsii.member(jsii_name="privateIpAddress")
    def private_ip_address(self) -> str:
        return jsii.get(self, "privateIpAddress")

    @builtins.property
    @jsii.member(jsii_name="publicIpAddress")
    def public_ip_address(self) -> str:
        return jsii.get(self, "publicIpAddress")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="serviceAccountEmailAddress")
    def service_account_email_address(self) -> str:
        return jsii.get(self, "serviceAccountEmailAddress")

    @builtins.property
    @jsii.member(jsii_name="settings")
    def settings(self) -> typing.List["SqlDatabaseInstanceSettings"]:
        return jsii.get(self, "settings")

    @settings.setter
    def settings(self, value: typing.List["SqlDatabaseInstanceSettings"]) -> None:
        jsii.set(self, "settings", value)

    @builtins.property
    @jsii.member(jsii_name="databaseVersion")
    def database_version(self) -> typing.Optional[str]:
        return jsii.get(self, "databaseVersion")

    @database_version.setter
    def database_version(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "databaseVersion", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="masterInstanceName")
    def master_instance_name(self) -> typing.Optional[str]:
        return jsii.get(self, "masterInstanceName")

    @master_instance_name.setter
    def master_instance_name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "masterInstanceName", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> typing.Optional[str]:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="replicaConfiguration")
    def replica_configuration(self) -> typing.Optional[typing.List["SqlDatabaseInstanceReplicaConfiguration"]]:
        return jsii.get(self, "replicaConfiguration")

    @replica_configuration.setter
    def replica_configuration(self, value: typing.Optional[typing.List["SqlDatabaseInstanceReplicaConfiguration"]]) -> None:
        jsii.set(self, "replicaConfiguration", value)

    @builtins.property
    @jsii.member(jsii_name="rootPassword")
    def root_password(self) -> typing.Optional[str]:
        return jsii.get(self, "rootPassword")

    @root_password.setter
    def root_password(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "rootPassword", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["SqlDatabaseInstanceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["SqlDatabaseInstanceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlDatabaseInstanceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'settings': 'settings', 'database_version': 'databaseVersion', 'master_instance_name': 'masterInstanceName', 'name': 'name', 'project': 'project', 'region': 'region', 'replica_configuration': 'replicaConfiguration', 'root_password': 'rootPassword', 'timeouts': 'timeouts'})
class SqlDatabaseInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, settings: typing.List["SqlDatabaseInstanceSettings"], database_version: typing.Optional[str]=None, master_instance_name: typing.Optional[str]=None, name: typing.Optional[str]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, replica_configuration: typing.Optional[typing.List["SqlDatabaseInstanceReplicaConfiguration"]]=None, root_password: typing.Optional[str]=None, timeouts: typing.Optional["SqlDatabaseInstanceTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param settings: settings block.
        :param database_version: The MySQL, PostgreSQL or SQL Server (beta) version to use. Supported values include MYSQL_5_6, MYSQL_5_7, POSTGRES_9_6,POSTGRES_11, SQLSERVER_2017_STANDARD, SQLSERVER_2017_ENTERPRISE, SQLSERVER_2017_EXPRESS, SQLSERVER_2017_WEB. Database Version Policies includes an up-to-date reference of supported versions.
        :param master_instance_name: The name of the instance that will act as the master in the replication setup. Note, this requires the master to have binary_log_enabled set, as well as existing backups.
        :param name: The name of the instance. If the name is left blank, Terraform will randomly generate one when the instance is first created. This is done because after a name is used, it cannot be reused for up to one week.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param region: The region the instance will sit in. Note, Cloud SQL is not available in all regions - choose from one of the options listed here. A valid region must be provided to use this resource. If a region is not provided in the resource definition, the provider region will be used instead, but this will be an apply-time error for instances if the provider region is not supported with Cloud SQL. If you choose not to provide the region argument for this resource, make sure you understand this.
        :param replica_configuration: replica_configuration block.
        :param root_password: Initial root password. Required for MS SQL Server, ignored by MySQL and PostgreSQL.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = SqlDatabaseInstanceTimeouts(**timeouts)
        self._values = {
            'settings': settings,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if database_version is not None: self._values["database_version"] = database_version
        if master_instance_name is not None: self._values["master_instance_name"] = master_instance_name
        if name is not None: self._values["name"] = name
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if replica_configuration is not None: self._values["replica_configuration"] = replica_configuration
        if root_password is not None: self._values["root_password"] = root_password
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def settings(self) -> typing.List["SqlDatabaseInstanceSettings"]:
        """settings block."""
        return self._values.get('settings')

    @builtins.property
    def database_version(self) -> typing.Optional[str]:
        """The MySQL, PostgreSQL or SQL Server (beta) version to use.

        Supported values include MYSQL_5_6, MYSQL_5_7, POSTGRES_9_6,POSTGRES_11, SQLSERVER_2017_STANDARD, SQLSERVER_2017_ENTERPRISE, SQLSERVER_2017_EXPRESS, SQLSERVER_2017_WEB. Database Version Policies includes an up-to-date reference of supported versions.
        """
        return self._values.get('database_version')

    @builtins.property
    def master_instance_name(self) -> typing.Optional[str]:
        """The name of the instance that will act as the master in the replication setup.

        Note, this requires the master to have binary_log_enabled set, as well as existing backups.
        """
        return self._values.get('master_instance_name')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        """The name of the instance.

        If the name is left blank, Terraform will randomly generate one when the instance is first created. This is done because after a name is used, it cannot be reused for up to one week.
        """
        return self._values.get('name')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The region the instance will sit in.

        Note, Cloud SQL is not available in all regions - choose from one of the options listed here. A valid region must be provided to use this resource. If a region is not provided in the resource definition, the provider region will be used instead, but this will be an apply-time error for instances if the provider region is not supported with Cloud SQL. If you choose not to provide the region argument for this resource, make sure you understand this.
        """
        return self._values.get('region')

    @builtins.property
    def replica_configuration(self) -> typing.Optional[typing.List["SqlDatabaseInstanceReplicaConfiguration"]]:
        """replica_configuration block."""
        return self._values.get('replica_configuration')

    @builtins.property
    def root_password(self) -> typing.Optional[str]:
        """Initial root password.

        Required for MS SQL Server, ignored by MySQL and PostgreSQL.
        """
        return self._values.get('root_password')

    @builtins.property
    def timeouts(self) -> typing.Optional["SqlDatabaseInstanceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlDatabaseInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SqlDatabaseInstanceIpAddress(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SqlDatabaseInstanceIpAddress"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(SqlDatabaseInstanceIpAddress, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> str:
        return jsii.get(self, "ipAddress")

    @builtins.property
    @jsii.member(jsii_name="timeToRetire")
    def time_to_retire(self) -> str:
        return jsii.get(self, "timeToRetire")

    @builtins.property
    @jsii.member(jsii_name="type")
    def type(self) -> str:
        return jsii.get(self, "type")


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlDatabaseInstanceReplicaConfiguration", jsii_struct_bases=[], name_mapping={'ca_certificate': 'caCertificate', 'client_certificate': 'clientCertificate', 'client_key': 'clientKey', 'connect_retry_interval': 'connectRetryInterval', 'dump_file_path': 'dumpFilePath', 'failover_target': 'failoverTarget', 'master_heartbeat_period': 'masterHeartbeatPeriod', 'password': 'password', 'ssl_cipher': 'sslCipher', 'username': 'username', 'verify_server_certificate': 'verifyServerCertificate'})
class SqlDatabaseInstanceReplicaConfiguration():
    def __init__(self, *, ca_certificate: typing.Optional[str]=None, client_certificate: typing.Optional[str]=None, client_key: typing.Optional[str]=None, connect_retry_interval: typing.Optional[jsii.Number]=None, dump_file_path: typing.Optional[str]=None, failover_target: typing.Optional[bool]=None, master_heartbeat_period: typing.Optional[jsii.Number]=None, password: typing.Optional[str]=None, ssl_cipher: typing.Optional[str]=None, username: typing.Optional[str]=None, verify_server_certificate: typing.Optional[bool]=None) -> None:
        """
        :param ca_certificate: PEM representation of the trusted CA's x509 certificate.
        :param client_certificate: PEM representation of the slave's x509 certificate.
        :param client_key: PEM representation of the slave's private key. The corresponding public key in encoded in the client_certificate.
        :param connect_retry_interval: The number of seconds between connect retries.
        :param dump_file_path: Path to a SQL file in GCS from which slave instances are created. Format is gs://bucket/filename.
        :param failover_target: Specifies if the replica is the failover target. If the field is set to true the replica will be designated as a failover replica. If the master instance fails, the replica instance will be promoted as the new master instance.
        :param master_heartbeat_period: Time in ms between replication heartbeats.
        :param password: Password for the replication connection.
        :param ssl_cipher: Permissible ciphers for use in SSL encryption.
        :param username: Username for replication connection.
        :param verify_server_certificate: True if the master's common name value is checked during the SSL handshake.
        """
        self._values = {
        }
        if ca_certificate is not None: self._values["ca_certificate"] = ca_certificate
        if client_certificate is not None: self._values["client_certificate"] = client_certificate
        if client_key is not None: self._values["client_key"] = client_key
        if connect_retry_interval is not None: self._values["connect_retry_interval"] = connect_retry_interval
        if dump_file_path is not None: self._values["dump_file_path"] = dump_file_path
        if failover_target is not None: self._values["failover_target"] = failover_target
        if master_heartbeat_period is not None: self._values["master_heartbeat_period"] = master_heartbeat_period
        if password is not None: self._values["password"] = password
        if ssl_cipher is not None: self._values["ssl_cipher"] = ssl_cipher
        if username is not None: self._values["username"] = username
        if verify_server_certificate is not None: self._values["verify_server_certificate"] = verify_server_certificate

    @builtins.property
    def ca_certificate(self) -> typing.Optional[str]:
        """PEM representation of the trusted CA's x509 certificate."""
        return self._values.get('ca_certificate')

    @builtins.property
    def client_certificate(self) -> typing.Optional[str]:
        """PEM representation of the slave's x509 certificate."""
        return self._values.get('client_certificate')

    @builtins.property
    def client_key(self) -> typing.Optional[str]:
        """PEM representation of the slave's private key.

        The corresponding public key in encoded in the client_certificate.
        """
        return self._values.get('client_key')

    @builtins.property
    def connect_retry_interval(self) -> typing.Optional[jsii.Number]:
        """The number of seconds between connect retries."""
        return self._values.get('connect_retry_interval')

    @builtins.property
    def dump_file_path(self) -> typing.Optional[str]:
        """Path to a SQL file in GCS from which slave instances are created.

        Format is gs://bucket/filename.
        """
        return self._values.get('dump_file_path')

    @builtins.property
    def failover_target(self) -> typing.Optional[bool]:
        """Specifies if the replica is the failover target.

        If the field is set to true the replica will be designated as a failover replica. If the master instance fails, the replica instance will be promoted as the new master instance.
        """
        return self._values.get('failover_target')

    @builtins.property
    def master_heartbeat_period(self) -> typing.Optional[jsii.Number]:
        """Time in ms between replication heartbeats."""
        return self._values.get('master_heartbeat_period')

    @builtins.property
    def password(self) -> typing.Optional[str]:
        """Password for the replication connection."""
        return self._values.get('password')

    @builtins.property
    def ssl_cipher(self) -> typing.Optional[str]:
        """Permissible ciphers for use in SSL encryption."""
        return self._values.get('ssl_cipher')

    @builtins.property
    def username(self) -> typing.Optional[str]:
        """Username for replication connection."""
        return self._values.get('username')

    @builtins.property
    def verify_server_certificate(self) -> typing.Optional[bool]:
        """True if the master's common name value is checked during the SSL handshake."""
        return self._values.get('verify_server_certificate')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlDatabaseInstanceReplicaConfiguration(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SqlDatabaseInstanceServerCaCert(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SqlDatabaseInstanceServerCaCert"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(SqlDatabaseInstanceServerCaCert, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="cert")
    def cert(self) -> str:
        return jsii.get(self, "cert")

    @builtins.property
    @jsii.member(jsii_name="commonName")
    def common_name(self) -> str:
        return jsii.get(self, "commonName")

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="expirationTime")
    def expiration_time(self) -> str:
        return jsii.get(self, "expirationTime")

    @builtins.property
    @jsii.member(jsii_name="sha1Fingerprint")
    def sha1_fingerprint(self) -> str:
        return jsii.get(self, "sha1Fingerprint")


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlDatabaseInstanceSettings", jsii_struct_bases=[], name_mapping={'tier': 'tier', 'activation_policy': 'activationPolicy', 'authorized_gae_applications': 'authorizedGaeApplications', 'availability_type': 'availabilityType', 'backup_configuration': 'backupConfiguration', 'crash_safe_replication': 'crashSafeReplication', 'database_flags': 'databaseFlags', 'disk_autoresize': 'diskAutoresize', 'disk_size': 'diskSize', 'disk_type': 'diskType', 'ip_configuration': 'ipConfiguration', 'location_preference': 'locationPreference', 'maintenance_window': 'maintenanceWindow', 'pricing_plan': 'pricingPlan', 'replication_type': 'replicationType', 'user_labels': 'userLabels'})
class SqlDatabaseInstanceSettings():
    def __init__(self, *, tier: str, activation_policy: typing.Optional[str]=None, authorized_gae_applications: typing.Optional[typing.List[str]]=None, availability_type: typing.Optional[str]=None, backup_configuration: typing.Optional[typing.List["SqlDatabaseInstanceSettingsBackupConfiguration"]]=None, crash_safe_replication: typing.Optional[bool]=None, database_flags: typing.Optional[typing.List["SqlDatabaseInstanceSettingsDatabaseFlags"]]=None, disk_autoresize: typing.Optional[bool]=None, disk_size: typing.Optional[jsii.Number]=None, disk_type: typing.Optional[str]=None, ip_configuration: typing.Optional[typing.List["SqlDatabaseInstanceSettingsIpConfiguration"]]=None, location_preference: typing.Optional[typing.List["SqlDatabaseInstanceSettingsLocationPreference"]]=None, maintenance_window: typing.Optional[typing.List["SqlDatabaseInstanceSettingsMaintenanceWindow"]]=None, pricing_plan: typing.Optional[str]=None, replication_type: typing.Optional[str]=None, user_labels: typing.Optional[typing.Mapping[str, str]]=None) -> None:
        """
        :param tier: The machine type to use. See tiers for more details and supported versions. Postgres supports only shared-core machine types such as db-f1-micro, and custom machine types such as db-custom-2-13312. See the Custom Machine Type Documentation to learn about specifying custom machine types.
        :param activation_policy: This specifies when the instance should be active. Can be either ALWAYS, NEVER or ON_DEMAND.
        :param authorized_gae_applications: This property is only applicable to First Generation instances. First Generation instances are now deprecated, see https://cloud.google.com/sql/docs/mysql/deprecation-notice for information on how to upgrade to Second Generation instances. A list of Google App Engine (GAE) project names that are allowed to access this instance.
        :param availability_type: The availability type of the Cloud SQL instance, high availability (REGIONAL) or single zone (ZONAL). For MySQL instances, ensure that settings.backup_configuration.enabled and settings.backup_configuration.binary_log_enabled are both set to true.
        :param backup_configuration: backup_configuration block.
        :param crash_safe_replication: This property is only applicable to First Generation instances. First Generation instances are now deprecated, see here for information on how to upgrade to Second Generation instances. Specific to read instances, indicates when crash-safe replication flags are enabled.
        :param database_flags: database_flags block.
        :param disk_autoresize: Configuration to increase storage size automatically. Note that future terraform apply calls will attempt to resize the disk to the value specified in disk_size - if this is set, do not set disk_size.
        :param disk_size: The size of data disk, in GB. Size of a running instance cannot be reduced but can be increased.
        :param disk_type: The type of data disk: PD_SSD or PD_HDD.
        :param ip_configuration: ip_configuration block.
        :param location_preference: location_preference block.
        :param maintenance_window: maintenance_window block.
        :param pricing_plan: Pricing plan for this instance, can only be PER_USE.
        :param replication_type: This property is only applicable to First Generation instances. First Generation instances are now deprecated, see here for information on how to upgrade to Second Generation instances. Replication type for this instance, can be one of ASYNCHRONOUS or SYNCHRONOUS.
        :param user_labels: A set of key/value user label pairs to assign to the instance.
        """
        self._values = {
            'tier': tier,
        }
        if activation_policy is not None: self._values["activation_policy"] = activation_policy
        if authorized_gae_applications is not None: self._values["authorized_gae_applications"] = authorized_gae_applications
        if availability_type is not None: self._values["availability_type"] = availability_type
        if backup_configuration is not None: self._values["backup_configuration"] = backup_configuration
        if crash_safe_replication is not None: self._values["crash_safe_replication"] = crash_safe_replication
        if database_flags is not None: self._values["database_flags"] = database_flags
        if disk_autoresize is not None: self._values["disk_autoresize"] = disk_autoresize
        if disk_size is not None: self._values["disk_size"] = disk_size
        if disk_type is not None: self._values["disk_type"] = disk_type
        if ip_configuration is not None: self._values["ip_configuration"] = ip_configuration
        if location_preference is not None: self._values["location_preference"] = location_preference
        if maintenance_window is not None: self._values["maintenance_window"] = maintenance_window
        if pricing_plan is not None: self._values["pricing_plan"] = pricing_plan
        if replication_type is not None: self._values["replication_type"] = replication_type
        if user_labels is not None: self._values["user_labels"] = user_labels

    @builtins.property
    def tier(self) -> str:
        """The machine type to use.

        See tiers for more details and supported versions. Postgres supports only shared-core machine types such as db-f1-micro, and custom machine types such as db-custom-2-13312. See the Custom Machine Type Documentation to learn about specifying custom machine types.
        """
        return self._values.get('tier')

    @builtins.property
    def activation_policy(self) -> typing.Optional[str]:
        """This specifies when the instance should be active.

        Can be either ALWAYS, NEVER or ON_DEMAND.
        """
        return self._values.get('activation_policy')

    @builtins.property
    def authorized_gae_applications(self) -> typing.Optional[typing.List[str]]:
        """This property is only applicable to First Generation instances.

        First Generation instances are now deprecated, see https://cloud.google.com/sql/docs/mysql/deprecation-notice for information on how to upgrade to Second Generation instances. A list of Google App Engine (GAE) project names that are allowed to access this instance.
        """
        return self._values.get('authorized_gae_applications')

    @builtins.property
    def availability_type(self) -> typing.Optional[str]:
        """The availability type of the Cloud SQL instance, high availability (REGIONAL) or single zone (ZONAL).

        For MySQL instances, ensure that
        settings.backup_configuration.enabled and
        settings.backup_configuration.binary_log_enabled are both set to true.
        """
        return self._values.get('availability_type')

    @builtins.property
    def backup_configuration(self) -> typing.Optional[typing.List["SqlDatabaseInstanceSettingsBackupConfiguration"]]:
        """backup_configuration block."""
        return self._values.get('backup_configuration')

    @builtins.property
    def crash_safe_replication(self) -> typing.Optional[bool]:
        """This property is only applicable to First Generation instances.

        First Generation instances are now deprecated, see here for information on how to upgrade to Second Generation instances. Specific to read instances, indicates when crash-safe replication flags are enabled.
        """
        return self._values.get('crash_safe_replication')

    @builtins.property
    def database_flags(self) -> typing.Optional[typing.List["SqlDatabaseInstanceSettingsDatabaseFlags"]]:
        """database_flags block."""
        return self._values.get('database_flags')

    @builtins.property
    def disk_autoresize(self) -> typing.Optional[bool]:
        """Configuration to increase storage size automatically.

        Note that future terraform apply calls will attempt to resize the disk to the value specified in disk_size - if this is set, do not set disk_size.
        """
        return self._values.get('disk_autoresize')

    @builtins.property
    def disk_size(self) -> typing.Optional[jsii.Number]:
        """The size of data disk, in GB.

        Size of a running instance cannot be reduced but can be increased.
        """
        return self._values.get('disk_size')

    @builtins.property
    def disk_type(self) -> typing.Optional[str]:
        """The type of data disk: PD_SSD or PD_HDD."""
        return self._values.get('disk_type')

    @builtins.property
    def ip_configuration(self) -> typing.Optional[typing.List["SqlDatabaseInstanceSettingsIpConfiguration"]]:
        """ip_configuration block."""
        return self._values.get('ip_configuration')

    @builtins.property
    def location_preference(self) -> typing.Optional[typing.List["SqlDatabaseInstanceSettingsLocationPreference"]]:
        """location_preference block."""
        return self._values.get('location_preference')

    @builtins.property
    def maintenance_window(self) -> typing.Optional[typing.List["SqlDatabaseInstanceSettingsMaintenanceWindow"]]:
        """maintenance_window block."""
        return self._values.get('maintenance_window')

    @builtins.property
    def pricing_plan(self) -> typing.Optional[str]:
        """Pricing plan for this instance, can only be PER_USE."""
        return self._values.get('pricing_plan')

    @builtins.property
    def replication_type(self) -> typing.Optional[str]:
        """This property is only applicable to First Generation instances.

        First Generation instances are now deprecated, see here for information on how to upgrade to Second Generation instances. Replication type for this instance, can be one of ASYNCHRONOUS or SYNCHRONOUS.
        """
        return self._values.get('replication_type')

    @builtins.property
    def user_labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value user label pairs to assign to the instance."""
        return self._values.get('user_labels')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlDatabaseInstanceSettings(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlDatabaseInstanceSettingsBackupConfiguration", jsii_struct_bases=[], name_mapping={'binary_log_enabled': 'binaryLogEnabled', 'enabled': 'enabled', 'location': 'location', 'point_in_time_recovery_enabled': 'pointInTimeRecoveryEnabled', 'start_time': 'startTime'})
class SqlDatabaseInstanceSettingsBackupConfiguration():
    def __init__(self, *, binary_log_enabled: typing.Optional[bool]=None, enabled: typing.Optional[bool]=None, location: typing.Optional[str]=None, point_in_time_recovery_enabled: typing.Optional[bool]=None, start_time: typing.Optional[str]=None) -> None:
        """
        :param binary_log_enabled: True if binary logging is enabled. If settings.backup_configuration.enabled is false, this must be as well. Cannot be used with Postgres.
        :param enabled: True if backup configuration is enabled.
        :param location: Location of the backup configuration.
        :param point_in_time_recovery_enabled: True if Point-in-time recovery is enabled.
        :param start_time: HH:MM format time indicating when backup configuration starts.
        """
        self._values = {
        }
        if binary_log_enabled is not None: self._values["binary_log_enabled"] = binary_log_enabled
        if enabled is not None: self._values["enabled"] = enabled
        if location is not None: self._values["location"] = location
        if point_in_time_recovery_enabled is not None: self._values["point_in_time_recovery_enabled"] = point_in_time_recovery_enabled
        if start_time is not None: self._values["start_time"] = start_time

    @builtins.property
    def binary_log_enabled(self) -> typing.Optional[bool]:
        """True if binary logging is enabled.

        If settings.backup_configuration.enabled is false, this must be as well. Cannot be used with Postgres.
        """
        return self._values.get('binary_log_enabled')

    @builtins.property
    def enabled(self) -> typing.Optional[bool]:
        """True if backup configuration is enabled."""
        return self._values.get('enabled')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """Location of the backup configuration."""
        return self._values.get('location')

    @builtins.property
    def point_in_time_recovery_enabled(self) -> typing.Optional[bool]:
        """True if Point-in-time recovery is enabled."""
        return self._values.get('point_in_time_recovery_enabled')

    @builtins.property
    def start_time(self) -> typing.Optional[str]:
        """HH:MM format time indicating when backup configuration starts."""
        return self._values.get('start_time')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlDatabaseInstanceSettingsBackupConfiguration(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlDatabaseInstanceSettingsDatabaseFlags", jsii_struct_bases=[], name_mapping={'name': 'name', 'value': 'value'})
class SqlDatabaseInstanceSettingsDatabaseFlags():
    def __init__(self, *, name: str, value: str) -> None:
        """
        :param name: Name of the flag.
        :param value: Value of the flag.
        """
        self._values = {
            'name': name,
            'value': value,
        }

    @builtins.property
    def name(self) -> str:
        """Name of the flag."""
        return self._values.get('name')

    @builtins.property
    def value(self) -> str:
        """Value of the flag."""
        return self._values.get('value')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlDatabaseInstanceSettingsDatabaseFlags(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlDatabaseInstanceSettingsIpConfiguration", jsii_struct_bases=[], name_mapping={'authorized_networks': 'authorizedNetworks', 'ipv4_enabled': 'ipv4Enabled', 'private_network': 'privateNetwork', 'require_ssl': 'requireSsl'})
class SqlDatabaseInstanceSettingsIpConfiguration():
    def __init__(self, *, authorized_networks: typing.Optional[typing.List["SqlDatabaseInstanceSettingsIpConfigurationAuthorizedNetworks"]]=None, ipv4_enabled: typing.Optional[bool]=None, private_network: typing.Optional[str]=None, require_ssl: typing.Optional[bool]=None) -> None:
        """
        :param authorized_networks: authorized_networks block.
        :param ipv4_enabled: Whether this Cloud SQL instance should be assigned a public IPV4 address. Either ipv4_enabled must be enabled or a private_network must be configured.
        :param private_network: The VPC network from which the Cloud SQL instance is accessible for private IP. For example, projects/myProject/global/networks/default. Specifying a network enables private IP. Either ipv4_enabled must be enabled or a private_network must be configured. This setting can be updated, but it cannot be removed after it is set.
        :param require_ssl: 
        """
        self._values = {
        }
        if authorized_networks is not None: self._values["authorized_networks"] = authorized_networks
        if ipv4_enabled is not None: self._values["ipv4_enabled"] = ipv4_enabled
        if private_network is not None: self._values["private_network"] = private_network
        if require_ssl is not None: self._values["require_ssl"] = require_ssl

    @builtins.property
    def authorized_networks(self) -> typing.Optional[typing.List["SqlDatabaseInstanceSettingsIpConfigurationAuthorizedNetworks"]]:
        """authorized_networks block."""
        return self._values.get('authorized_networks')

    @builtins.property
    def ipv4_enabled(self) -> typing.Optional[bool]:
        """Whether this Cloud SQL instance should be assigned a public IPV4 address.

        Either ipv4_enabled must be enabled or a private_network must be configured.
        """
        return self._values.get('ipv4_enabled')

    @builtins.property
    def private_network(self) -> typing.Optional[str]:
        """The VPC network from which the Cloud SQL instance is accessible for private IP.

        For example, projects/myProject/global/networks/default. Specifying a network enables private IP. Either ipv4_enabled must be enabled or a private_network must be configured. This setting can be updated, but it cannot be removed after it is set.
        """
        return self._values.get('private_network')

    @builtins.property
    def require_ssl(self) -> typing.Optional[bool]:
        return self._values.get('require_ssl')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlDatabaseInstanceSettingsIpConfiguration(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlDatabaseInstanceSettingsIpConfigurationAuthorizedNetworks", jsii_struct_bases=[], name_mapping={'value': 'value', 'expiration_time': 'expirationTime', 'name': 'name'})
class SqlDatabaseInstanceSettingsIpConfigurationAuthorizedNetworks():
    def __init__(self, *, value: str, expiration_time: typing.Optional[str]=None, name: typing.Optional[str]=None) -> None:
        """
        :param value: 
        :param expiration_time: 
        :param name: 
        """
        self._values = {
            'value': value,
        }
        if expiration_time is not None: self._values["expiration_time"] = expiration_time
        if name is not None: self._values["name"] = name

    @builtins.property
    def value(self) -> str:
        return self._values.get('value')

    @builtins.property
    def expiration_time(self) -> typing.Optional[str]:
        return self._values.get('expiration_time')

    @builtins.property
    def name(self) -> typing.Optional[str]:
        return self._values.get('name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlDatabaseInstanceSettingsIpConfigurationAuthorizedNetworks(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlDatabaseInstanceSettingsLocationPreference", jsii_struct_bases=[], name_mapping={'follow_gae_application': 'followGaeApplication', 'zone': 'zone'})
class SqlDatabaseInstanceSettingsLocationPreference():
    def __init__(self, *, follow_gae_application: typing.Optional[str]=None, zone: typing.Optional[str]=None) -> None:
        """
        :param follow_gae_application: A GAE application whose zone to remain in. Must be in the same region as this instance.
        :param zone: The preferred compute engine zone.
        """
        self._values = {
        }
        if follow_gae_application is not None: self._values["follow_gae_application"] = follow_gae_application
        if zone is not None: self._values["zone"] = zone

    @builtins.property
    def follow_gae_application(self) -> typing.Optional[str]:
        """A GAE application whose zone to remain in.

        Must be in the same region as this instance.
        """
        return self._values.get('follow_gae_application')

    @builtins.property
    def zone(self) -> typing.Optional[str]:
        """The preferred compute engine zone."""
        return self._values.get('zone')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlDatabaseInstanceSettingsLocationPreference(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlDatabaseInstanceSettingsMaintenanceWindow", jsii_struct_bases=[], name_mapping={'day': 'day', 'hour': 'hour', 'update_track': 'updateTrack'})
class SqlDatabaseInstanceSettingsMaintenanceWindow():
    def __init__(self, *, day: typing.Optional[jsii.Number]=None, hour: typing.Optional[jsii.Number]=None, update_track: typing.Optional[str]=None) -> None:
        """
        :param day: Day of week (1-7), starting on Monday.
        :param hour: Hour of day (0-23), ignored if day not set.
        :param update_track: Receive updates earlier (canary) or later (stable).
        """
        self._values = {
        }
        if day is not None: self._values["day"] = day
        if hour is not None: self._values["hour"] = hour
        if update_track is not None: self._values["update_track"] = update_track

    @builtins.property
    def day(self) -> typing.Optional[jsii.Number]:
        """Day of week (1-7), starting on Monday."""
        return self._values.get('day')

    @builtins.property
    def hour(self) -> typing.Optional[jsii.Number]:
        """Hour of day (0-23), ignored if day not set."""
        return self._values.get('hour')

    @builtins.property
    def update_track(self) -> typing.Optional[str]:
        """Receive updates earlier (canary) or later (stable)."""
        return self._values.get('update_track')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlDatabaseInstanceSettingsMaintenanceWindow(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlDatabaseInstanceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class SqlDatabaseInstanceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlDatabaseInstanceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlDatabaseTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class SqlDatabaseTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlDatabaseTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SqlSourceRepresentationInstance(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SqlSourceRepresentationInstance"):
    def __init__(self, scope: constructs.Construct, id: str, *, database_version: str, host: str, name: str, port: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["SqlSourceRepresentationInstanceTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param database_version: The MySQL version running on your source database server. Possible values: ["MYSQL_5_6", "MYSQL_5_7"]
        :param host: The externally accessible IPv4 address for the source database server.
        :param name: The name of the source representation instance. Use any valid Cloud SQL instance name.
        :param port: The externally accessible port for the source database server. Defaults to 3306.
        :param project: 
        :param region: The Region in which the created instance should reside. If it is not provided, the provider region is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SqlSourceRepresentationInstanceConfig(database_version=database_version, host=host, name=name, port=port, project=project, region=region, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SqlSourceRepresentationInstance, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="databaseVersion")
    def database_version(self) -> str:
        return jsii.get(self, "databaseVersion")

    @database_version.setter
    def database_version(self, value: str) -> None:
        jsii.set(self, "databaseVersion", value)

    @builtins.property
    @jsii.member(jsii_name="host")
    def host(self) -> str:
        return jsii.get(self, "host")

    @host.setter
    def host(self, value: str) -> None:
        jsii.set(self, "host", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="port")
    def port(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "port")

    @port.setter
    def port(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "port", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> typing.Optional[str]:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["SqlSourceRepresentationInstanceTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["SqlSourceRepresentationInstanceTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlSourceRepresentationInstanceConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'database_version': 'databaseVersion', 'host': 'host', 'name': 'name', 'port': 'port', 'project': 'project', 'region': 'region', 'timeouts': 'timeouts'})
class SqlSourceRepresentationInstanceConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, database_version: str, host: str, name: str, port: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, region: typing.Optional[str]=None, timeouts: typing.Optional["SqlSourceRepresentationInstanceTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param database_version: The MySQL version running on your source database server. Possible values: ["MYSQL_5_6", "MYSQL_5_7"]
        :param host: The externally accessible IPv4 address for the source database server.
        :param name: The name of the source representation instance. Use any valid Cloud SQL instance name.
        :param port: The externally accessible port for the source database server. Defaults to 3306.
        :param project: 
        :param region: The Region in which the created instance should reside. If it is not provided, the provider region is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = SqlSourceRepresentationInstanceTimeouts(**timeouts)
        self._values = {
            'database_version': database_version,
            'host': host,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if port is not None: self._values["port"] = port
        if project is not None: self._values["project"] = project
        if region is not None: self._values["region"] = region
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def database_version(self) -> str:
        """The MySQL version running on your source database server.

        Possible values: ["MYSQL_5_6", "MYSQL_5_7"]
        """
        return self._values.get('database_version')

    @builtins.property
    def host(self) -> str:
        """The externally accessible IPv4 address for the source database server."""
        return self._values.get('host')

    @builtins.property
    def name(self) -> str:
        """The name of the source representation instance.

        Use any valid Cloud SQL instance name.
        """
        return self._values.get('name')

    @builtins.property
    def port(self) -> typing.Optional[jsii.Number]:
        """The externally accessible port for the source database server.

        Defaults to 3306.
        """
        return self._values.get('port')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def region(self) -> typing.Optional[str]:
        """The Region in which the created instance should reside.

        If it is not provided, the provider region is used.
        """
        return self._values.get('region')

    @builtins.property
    def timeouts(self) -> typing.Optional["SqlSourceRepresentationInstanceTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlSourceRepresentationInstanceConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlSourceRepresentationInstanceTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class SqlSourceRepresentationInstanceTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlSourceRepresentationInstanceTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SqlSslCert(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SqlSslCert"):
    def __init__(self, scope: constructs.Construct, id: str, *, common_name: str, instance: str, project: typing.Optional[str]=None, timeouts: typing.Optional["SqlSslCertTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param common_name: The common name to be used in the certificate to identify the client. Constrained to [a-zA-Z.-_ ]+. Changing this forces a new resource to be created.
        :param instance: The name of the Cloud SQL instance. Changing this forces a new resource to be created.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SqlSslCertConfig(common_name=common_name, instance=instance, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SqlSslCert, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="cert")
    def cert(self) -> str:
        return jsii.get(self, "cert")

    @builtins.property
    @jsii.member(jsii_name="certSerialNumber")
    def cert_serial_number(self) -> str:
        return jsii.get(self, "certSerialNumber")

    @builtins.property
    @jsii.member(jsii_name="createTime")
    def create_time(self) -> str:
        return jsii.get(self, "createTime")

    @builtins.property
    @jsii.member(jsii_name="expirationTime")
    def expiration_time(self) -> str:
        return jsii.get(self, "expirationTime")

    @builtins.property
    @jsii.member(jsii_name="privateKey")
    def private_key(self) -> str:
        return jsii.get(self, "privateKey")

    @builtins.property
    @jsii.member(jsii_name="serverCaCert")
    def server_ca_cert(self) -> str:
        return jsii.get(self, "serverCaCert")

    @builtins.property
    @jsii.member(jsii_name="sha1Fingerprint")
    def sha1_fingerprint(self) -> str:
        return jsii.get(self, "sha1Fingerprint")

    @builtins.property
    @jsii.member(jsii_name="commonName")
    def common_name(self) -> str:
        return jsii.get(self, "commonName")

    @common_name.setter
    def common_name(self, value: str) -> None:
        jsii.set(self, "commonName", value)

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["SqlSslCertTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["SqlSslCertTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlSslCertConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'common_name': 'commonName', 'instance': 'instance', 'project': 'project', 'timeouts': 'timeouts'})
class SqlSslCertConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, common_name: str, instance: str, project: typing.Optional[str]=None, timeouts: typing.Optional["SqlSslCertTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param common_name: The common name to be used in the certificate to identify the client. Constrained to [a-zA-Z.-_ ]+. Changing this forces a new resource to be created.
        :param instance: The name of the Cloud SQL instance. Changing this forces a new resource to be created.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = SqlSslCertTimeouts(**timeouts)
        self._values = {
            'common_name': common_name,
            'instance': instance,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def common_name(self) -> str:
        """The common name to be used in the certificate to identify the client.

        Constrained to [a-zA-Z.-_ ]+. Changing this forces a new resource to be created.
        """
        return self._values.get('common_name')

    @builtins.property
    def instance(self) -> str:
        """The name of the Cloud SQL instance.

        Changing this forces a new resource to be created.
        """
        return self._values.get('instance')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["SqlSslCertTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlSslCertConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlSslCertTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class SqlSslCertTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlSslCertTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class SqlUser(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.SqlUser"):
    def __init__(self, scope: constructs.Construct, id: str, *, instance: str, name: str, host: typing.Optional[str]=None, password: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["SqlUserTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param instance: The name of the Cloud SQL instance. Changing this forces a new resource to be created.
        :param name: The name of the user. Changing this forces a new resource to be created.
        :param host: The host the user can connect from. This is only supported for MySQL instances. Don't set this field for PostgreSQL instances. Can be an IP address. Changing this forces a new resource to be created.
        :param password: The password for the user. Can be updated. For Postgres instances this is a Required field.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = SqlUserConfig(instance=instance, name=name, host=host, password=password, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(SqlUser, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="instance")
    def instance(self) -> str:
        return jsii.get(self, "instance")

    @instance.setter
    def instance(self, value: str) -> None:
        jsii.set(self, "instance", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="host")
    def host(self) -> typing.Optional[str]:
        return jsii.get(self, "host")

    @host.setter
    def host(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "host", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="password")
    def password(self) -> typing.Optional[str]:
        return jsii.get(self, "password")

    @password.setter
    def password(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "password", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["SqlUserTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["SqlUserTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlUserConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'instance': 'instance', 'name': 'name', 'host': 'host', 'password': 'password', 'project': 'project', 'timeouts': 'timeouts'})
class SqlUserConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, instance: str, name: str, host: typing.Optional[str]=None, password: typing.Optional[str]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["SqlUserTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param instance: The name of the Cloud SQL instance. Changing this forces a new resource to be created.
        :param name: The name of the user. Changing this forces a new resource to be created.
        :param host: The host the user can connect from. This is only supported for MySQL instances. Don't set this field for PostgreSQL instances. Can be an IP address. Changing this forces a new resource to be created.
        :param password: The password for the user. Can be updated. For Postgres instances this is a Required field.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = SqlUserTimeouts(**timeouts)
        self._values = {
            'instance': instance,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if host is not None: self._values["host"] = host
        if password is not None: self._values["password"] = password
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def instance(self) -> str:
        """The name of the Cloud SQL instance.

        Changing this forces a new resource to be created.
        """
        return self._values.get('instance')

    @builtins.property
    def name(self) -> str:
        """The name of the user.

        Changing this forces a new resource to be created.
        """
        return self._values.get('name')

    @builtins.property
    def host(self) -> typing.Optional[str]:
        """The host the user can connect from.

        This is only supported for MySQL instances. Don't set this field for PostgreSQL instances. Can be an IP address. Changing this forces a new resource to be created.
        """
        return self._values.get('host')

    @builtins.property
    def password(self) -> typing.Optional[str]:
        """The password for the user.

        Can be updated. For Postgres instances this is a Required field.
        """
        return self._values.get('password')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["SqlUserTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlUserConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.SqlUserTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class SqlUserTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'SqlUserTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageBucket(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageBucket"):
    def __init__(self, scope: constructs.Construct, id: str, *, name: str, bucket_policy_only: typing.Optional[bool]=None, cors: typing.Optional[typing.List["StorageBucketCors"]]=None, default_event_based_hold: typing.Optional[bool]=None, encryption: typing.Optional[typing.List["StorageBucketEncryption"]]=None, force_destroy: typing.Optional[bool]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, lifecycle_rule: typing.Optional[typing.List["StorageBucketLifecycleRule"]]=None, location: typing.Optional[str]=None, logging: typing.Optional[typing.List["StorageBucketLogging"]]=None, project: typing.Optional[str]=None, requester_pays: typing.Optional[bool]=None, retention_policy: typing.Optional[typing.List["StorageBucketRetentionPolicy"]]=None, storage_class: typing.Optional[str]=None, versioning: typing.Optional[typing.List["StorageBucketVersioning"]]=None, website: typing.Optional[typing.List["StorageBucketWebsite"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param name: The name of the bucket.
        :param bucket_policy_only: Enables Bucket Policy Only access to a bucket.
        :param cors: cors block.
        :param default_event_based_hold: 
        :param encryption: encryption block.
        :param force_destroy: When deleting a bucket, this boolean option will delete all contained objects. If you try to delete a bucket that contains objects, Terraform will fail that run.
        :param labels: A set of key/value label pairs to assign to the bucket.
        :param lifecycle_rule: lifecycle_rule block.
        :param location: The GCS location.
        :param logging: logging block.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param requester_pays: Enables Requester Pays on a storage bucket.
        :param retention_policy: retention_policy block.
        :param storage_class: The Storage Class of the new bucket. Supported values include: STANDARD, MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE.
        :param versioning: versioning block.
        :param website: website block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageBucketConfig(name=name, bucket_policy_only=bucket_policy_only, cors=cors, default_event_based_hold=default_event_based_hold, encryption=encryption, force_destroy=force_destroy, labels=labels, lifecycle_rule=lifecycle_rule, location=location, logging=logging, project=project, requester_pays=requester_pays, retention_policy=retention_policy, storage_class=storage_class, versioning=versioning, website=website, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageBucket, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="url")
    def url(self) -> str:
        return jsii.get(self, "url")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="bucketPolicyOnly")
    def bucket_policy_only(self) -> typing.Optional[bool]:
        return jsii.get(self, "bucketPolicyOnly")

    @bucket_policy_only.setter
    def bucket_policy_only(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "bucketPolicyOnly", value)

    @builtins.property
    @jsii.member(jsii_name="cors")
    def cors(self) -> typing.Optional[typing.List["StorageBucketCors"]]:
        return jsii.get(self, "cors")

    @cors.setter
    def cors(self, value: typing.Optional[typing.List["StorageBucketCors"]]) -> None:
        jsii.set(self, "cors", value)

    @builtins.property
    @jsii.member(jsii_name="defaultEventBasedHold")
    def default_event_based_hold(self) -> typing.Optional[bool]:
        return jsii.get(self, "defaultEventBasedHold")

    @default_event_based_hold.setter
    def default_event_based_hold(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "defaultEventBasedHold", value)

    @builtins.property
    @jsii.member(jsii_name="encryption")
    def encryption(self) -> typing.Optional[typing.List["StorageBucketEncryption"]]:
        return jsii.get(self, "encryption")

    @encryption.setter
    def encryption(self, value: typing.Optional[typing.List["StorageBucketEncryption"]]) -> None:
        jsii.set(self, "encryption", value)

    @builtins.property
    @jsii.member(jsii_name="forceDestroy")
    def force_destroy(self) -> typing.Optional[bool]:
        return jsii.get(self, "forceDestroy")

    @force_destroy.setter
    def force_destroy(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "forceDestroy", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="lifecycleRule")
    def lifecycle_rule(self) -> typing.Optional[typing.List["StorageBucketLifecycleRule"]]:
        return jsii.get(self, "lifecycleRule")

    @lifecycle_rule.setter
    def lifecycle_rule(self, value: typing.Optional[typing.List["StorageBucketLifecycleRule"]]) -> None:
        jsii.set(self, "lifecycleRule", value)

    @builtins.property
    @jsii.member(jsii_name="location")
    def location(self) -> typing.Optional[str]:
        return jsii.get(self, "location")

    @location.setter
    def location(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "location", value)

    @builtins.property
    @jsii.member(jsii_name="logging")
    def logging(self) -> typing.Optional[typing.List["StorageBucketLogging"]]:
        return jsii.get(self, "logging")

    @logging.setter
    def logging(self, value: typing.Optional[typing.List["StorageBucketLogging"]]) -> None:
        jsii.set(self, "logging", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="requesterPays")
    def requester_pays(self) -> typing.Optional[bool]:
        return jsii.get(self, "requesterPays")

    @requester_pays.setter
    def requester_pays(self, value: typing.Optional[bool]) -> None:
        jsii.set(self, "requesterPays", value)

    @builtins.property
    @jsii.member(jsii_name="retentionPolicy")
    def retention_policy(self) -> typing.Optional[typing.List["StorageBucketRetentionPolicy"]]:
        return jsii.get(self, "retentionPolicy")

    @retention_policy.setter
    def retention_policy(self, value: typing.Optional[typing.List["StorageBucketRetentionPolicy"]]) -> None:
        jsii.set(self, "retentionPolicy", value)

    @builtins.property
    @jsii.member(jsii_name="storageClass")
    def storage_class(self) -> typing.Optional[str]:
        return jsii.get(self, "storageClass")

    @storage_class.setter
    def storage_class(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "storageClass", value)

    @builtins.property
    @jsii.member(jsii_name="versioning")
    def versioning(self) -> typing.Optional[typing.List["StorageBucketVersioning"]]:
        return jsii.get(self, "versioning")

    @versioning.setter
    def versioning(self, value: typing.Optional[typing.List["StorageBucketVersioning"]]) -> None:
        jsii.set(self, "versioning", value)

    @builtins.property
    @jsii.member(jsii_name="website")
    def website(self) -> typing.Optional[typing.List["StorageBucketWebsite"]]:
        return jsii.get(self, "website")

    @website.setter
    def website(self, value: typing.Optional[typing.List["StorageBucketWebsite"]]) -> None:
        jsii.set(self, "website", value)


class StorageBucketAccessControl(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageBucketAccessControl"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: str, entity: str, role: typing.Optional[str]=None, timeouts: typing.Optional["StorageBucketAccessControlTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: The name of the bucket.
        :param entity: The entity holding the permission, in one of the following forms: user-userId user-email group-groupId group-email domain-domain project-team-projectId allUsers allAuthenticatedUsers Examples: The user liz@example.com would be user-liz@example.com. The group example@googlegroups.com would be group-example@googlegroups.com. To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com.
        :param role: The access permission for the entity. Possible values: ["OWNER", "READER", "WRITER"]
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageBucketAccessControlConfig(bucket=bucket, entity=entity, role=role, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageBucketAccessControl, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="domain")
    def domain(self) -> str:
        return jsii.get(self, "domain")

    @builtins.property
    @jsii.member(jsii_name="email")
    def email(self) -> str:
        return jsii.get(self, "email")

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> str:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: str) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="entity")
    def entity(self) -> str:
        return jsii.get(self, "entity")

    @entity.setter
    def entity(self, value: str) -> None:
        jsii.set(self, "entity", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> typing.Optional[str]:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["StorageBucketAccessControlTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["StorageBucketAccessControlTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketAccessControlConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'entity': 'entity', 'role': 'role', 'timeouts': 'timeouts'})
class StorageBucketAccessControlConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: str, entity: str, role: typing.Optional[str]=None, timeouts: typing.Optional["StorageBucketAccessControlTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: The name of the bucket.
        :param entity: The entity holding the permission, in one of the following forms: user-userId user-email group-groupId group-email domain-domain project-team-projectId allUsers allAuthenticatedUsers Examples: The user liz@example.com would be user-liz@example.com. The group example@googlegroups.com would be group-example@googlegroups.com. To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com.
        :param role: The access permission for the entity. Possible values: ["OWNER", "READER", "WRITER"]
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = StorageBucketAccessControlTimeouts(**timeouts)
        self._values = {
            'bucket': bucket,
            'entity': entity,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if role is not None: self._values["role"] = role
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> str:
        """The name of the bucket."""
        return self._values.get('bucket')

    @builtins.property
    def entity(self) -> str:
        """The entity holding the permission, in one of the following forms: user-userId user-email group-groupId group-email domain-domain project-team-projectId allUsers allAuthenticatedUsers Examples: The user liz@example.com would be user-liz@example.com. The group example@googlegroups.com would be group-example@googlegroups.com. To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com."""
        return self._values.get('entity')

    @builtins.property
    def role(self) -> typing.Optional[str]:
        """The access permission for the entity.

        Possible values: ["OWNER", "READER", "WRITER"]
        """
        return self._values.get('role')

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageBucketAccessControlTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketAccessControlConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketAccessControlTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class StorageBucketAccessControlTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketAccessControlTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageBucketAcl(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageBucketAcl"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: str, default_acl: typing.Optional[str]=None, predefined_acl: typing.Optional[str]=None, role_entity: typing.Optional[typing.List[str]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: The name of the bucket it applies to.
        :param default_acl: Configure this ACL to be the default ACL.
        :param predefined_acl: The canned GCS ACL to apply. Must be set if role_entity is not.
        :param role_entity: List of role/entity pairs in the form ROLE:entity. See GCS Bucket ACL documentation for more details. Must be set if predefined_acl is not.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageBucketAclConfig(bucket=bucket, default_acl=default_acl, predefined_acl=predefined_acl, role_entity=role_entity, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageBucketAcl, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> str:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: str) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="defaultAcl")
    def default_acl(self) -> typing.Optional[str]:
        return jsii.get(self, "defaultAcl")

    @default_acl.setter
    def default_acl(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "defaultAcl", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="predefinedAcl")
    def predefined_acl(self) -> typing.Optional[str]:
        return jsii.get(self, "predefinedAcl")

    @predefined_acl.setter
    def predefined_acl(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "predefinedAcl", value)

    @builtins.property
    @jsii.member(jsii_name="roleEntity")
    def role_entity(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "roleEntity")

    @role_entity.setter
    def role_entity(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "roleEntity", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketAclConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'default_acl': 'defaultAcl', 'predefined_acl': 'predefinedAcl', 'role_entity': 'roleEntity'})
class StorageBucketAclConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: str, default_acl: typing.Optional[str]=None, predefined_acl: typing.Optional[str]=None, role_entity: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: The name of the bucket it applies to.
        :param default_acl: Configure this ACL to be the default ACL.
        :param predefined_acl: The canned GCS ACL to apply. Must be set if role_entity is not.
        :param role_entity: List of role/entity pairs in the form ROLE:entity. See GCS Bucket ACL documentation for more details. Must be set if predefined_acl is not.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'bucket': bucket,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if default_acl is not None: self._values["default_acl"] = default_acl
        if predefined_acl is not None: self._values["predefined_acl"] = predefined_acl
        if role_entity is not None: self._values["role_entity"] = role_entity

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> str:
        """The name of the bucket it applies to."""
        return self._values.get('bucket')

    @builtins.property
    def default_acl(self) -> typing.Optional[str]:
        """Configure this ACL to be the default ACL."""
        return self._values.get('default_acl')

    @builtins.property
    def predefined_acl(self) -> typing.Optional[str]:
        """The canned GCS ACL to apply.

        Must be set if role_entity is not.
        """
        return self._values.get('predefined_acl')

    @builtins.property
    def role_entity(self) -> typing.Optional[typing.List[str]]:
        """List of role/entity pairs in the form ROLE:entity.

        See GCS Bucket ACL documentation  for more details. Must be set if predefined_acl is not.
        """
        return self._values.get('role_entity')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketAclConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'name': 'name', 'bucket_policy_only': 'bucketPolicyOnly', 'cors': 'cors', 'default_event_based_hold': 'defaultEventBasedHold', 'encryption': 'encryption', 'force_destroy': 'forceDestroy', 'labels': 'labels', 'lifecycle_rule': 'lifecycleRule', 'location': 'location', 'logging': 'logging', 'project': 'project', 'requester_pays': 'requesterPays', 'retention_policy': 'retentionPolicy', 'storage_class': 'storageClass', 'versioning': 'versioning', 'website': 'website'})
class StorageBucketConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, name: str, bucket_policy_only: typing.Optional[bool]=None, cors: typing.Optional[typing.List["StorageBucketCors"]]=None, default_event_based_hold: typing.Optional[bool]=None, encryption: typing.Optional[typing.List["StorageBucketEncryption"]]=None, force_destroy: typing.Optional[bool]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, lifecycle_rule: typing.Optional[typing.List["StorageBucketLifecycleRule"]]=None, location: typing.Optional[str]=None, logging: typing.Optional[typing.List["StorageBucketLogging"]]=None, project: typing.Optional[str]=None, requester_pays: typing.Optional[bool]=None, retention_policy: typing.Optional[typing.List["StorageBucketRetentionPolicy"]]=None, storage_class: typing.Optional[str]=None, versioning: typing.Optional[typing.List["StorageBucketVersioning"]]=None, website: typing.Optional[typing.List["StorageBucketWebsite"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param name: The name of the bucket.
        :param bucket_policy_only: Enables Bucket Policy Only access to a bucket.
        :param cors: cors block.
        :param default_event_based_hold: 
        :param encryption: encryption block.
        :param force_destroy: When deleting a bucket, this boolean option will delete all contained objects. If you try to delete a bucket that contains objects, Terraform will fail that run.
        :param labels: A set of key/value label pairs to assign to the bucket.
        :param lifecycle_rule: lifecycle_rule block.
        :param location: The GCS location.
        :param logging: logging block.
        :param project: The ID of the project in which the resource belongs. If it is not provided, the provider project is used.
        :param requester_pays: Enables Requester Pays on a storage bucket.
        :param retention_policy: retention_policy block.
        :param storage_class: The Storage Class of the new bucket. Supported values include: STANDARD, MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE.
        :param versioning: versioning block.
        :param website: website block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if bucket_policy_only is not None: self._values["bucket_policy_only"] = bucket_policy_only
        if cors is not None: self._values["cors"] = cors
        if default_event_based_hold is not None: self._values["default_event_based_hold"] = default_event_based_hold
        if encryption is not None: self._values["encryption"] = encryption
        if force_destroy is not None: self._values["force_destroy"] = force_destroy
        if labels is not None: self._values["labels"] = labels
        if lifecycle_rule is not None: self._values["lifecycle_rule"] = lifecycle_rule
        if location is not None: self._values["location"] = location
        if logging is not None: self._values["logging"] = logging
        if project is not None: self._values["project"] = project
        if requester_pays is not None: self._values["requester_pays"] = requester_pays
        if retention_policy is not None: self._values["retention_policy"] = retention_policy
        if storage_class is not None: self._values["storage_class"] = storage_class
        if versioning is not None: self._values["versioning"] = versioning
        if website is not None: self._values["website"] = website

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def name(self) -> str:
        """The name of the bucket."""
        return self._values.get('name')

    @builtins.property
    def bucket_policy_only(self) -> typing.Optional[bool]:
        """Enables Bucket Policy Only access to a bucket."""
        return self._values.get('bucket_policy_only')

    @builtins.property
    def cors(self) -> typing.Optional[typing.List["StorageBucketCors"]]:
        """cors block."""
        return self._values.get('cors')

    @builtins.property
    def default_event_based_hold(self) -> typing.Optional[bool]:
        return self._values.get('default_event_based_hold')

    @builtins.property
    def encryption(self) -> typing.Optional[typing.List["StorageBucketEncryption"]]:
        """encryption block."""
        return self._values.get('encryption')

    @builtins.property
    def force_destroy(self) -> typing.Optional[bool]:
        """When deleting a bucket, this boolean option will delete all contained objects.

        If you try to delete a bucket that contains objects, Terraform will fail that run.
        """
        return self._values.get('force_destroy')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value label pairs to assign to the bucket."""
        return self._values.get('labels')

    @builtins.property
    def lifecycle_rule(self) -> typing.Optional[typing.List["StorageBucketLifecycleRule"]]:
        """lifecycle_rule block."""
        return self._values.get('lifecycle_rule')

    @builtins.property
    def location(self) -> typing.Optional[str]:
        """The GCS location."""
        return self._values.get('location')

    @builtins.property
    def logging(self) -> typing.Optional[typing.List["StorageBucketLogging"]]:
        """logging block."""
        return self._values.get('logging')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The ID of the project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def requester_pays(self) -> typing.Optional[bool]:
        """Enables Requester Pays on a storage bucket."""
        return self._values.get('requester_pays')

    @builtins.property
    def retention_policy(self) -> typing.Optional[typing.List["StorageBucketRetentionPolicy"]]:
        """retention_policy block."""
        return self._values.get('retention_policy')

    @builtins.property
    def storage_class(self) -> typing.Optional[str]:
        """The Storage Class of the new bucket.

        Supported values include: STANDARD, MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE.
        """
        return self._values.get('storage_class')

    @builtins.property
    def versioning(self) -> typing.Optional[typing.List["StorageBucketVersioning"]]:
        """versioning block."""
        return self._values.get('versioning')

    @builtins.property
    def website(self) -> typing.Optional[typing.List["StorageBucketWebsite"]]:
        """website block."""
        return self._values.get('website')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketCors", jsii_struct_bases=[], name_mapping={'max_age_seconds': 'maxAgeSeconds', 'method': 'method', 'origin': 'origin', 'response_header': 'responseHeader'})
class StorageBucketCors():
    def __init__(self, *, max_age_seconds: typing.Optional[jsii.Number]=None, method: typing.Optional[typing.List[str]]=None, origin: typing.Optional[typing.List[str]]=None, response_header: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param max_age_seconds: The value, in seconds, to return in the Access-Control-Max-Age header used in preflight responses.
        :param method: The list of HTTP methods on which to include CORS response headers, (GET, OPTIONS, POST, etc) Note: "*" is permitted in the list of methods, and means "any method".
        :param origin: The list of Origins eligible to receive CORS response headers. Note: "*" is permitted in the list of origins, and means "any Origin".
        :param response_header: The list of HTTP headers other than the simple response headers to give permission for the user-agent to share across domains.
        """
        self._values = {
        }
        if max_age_seconds is not None: self._values["max_age_seconds"] = max_age_seconds
        if method is not None: self._values["method"] = method
        if origin is not None: self._values["origin"] = origin
        if response_header is not None: self._values["response_header"] = response_header

    @builtins.property
    def max_age_seconds(self) -> typing.Optional[jsii.Number]:
        """The value, in seconds, to return in the Access-Control-Max-Age header used in preflight responses."""
        return self._values.get('max_age_seconds')

    @builtins.property
    def method(self) -> typing.Optional[typing.List[str]]:
        """The list of HTTP methods on which to include CORS response headers, (GET, OPTIONS, POST, etc) Note: "*" is permitted in the list of methods, and means "any method"."""
        return self._values.get('method')

    @builtins.property
    def origin(self) -> typing.Optional[typing.List[str]]:
        """The list of Origins eligible to receive CORS response headers.

        Note: "*" is permitted in the list of origins, and means "any Origin".
        """
        return self._values.get('origin')

    @builtins.property
    def response_header(self) -> typing.Optional[typing.List[str]]:
        """The list of HTTP headers other than the simple response headers to give permission for the user-agent to share across domains."""
        return self._values.get('response_header')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketCors(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketEncryption", jsii_struct_bases=[], name_mapping={'default_kms_key_name': 'defaultKmsKeyName'})
class StorageBucketEncryption():
    def __init__(self, *, default_kms_key_name: str) -> None:
        """
        :param default_kms_key_name: A Cloud KMS key that will be used to encrypt objects inserted into this bucket, if no encryption method is specified. You must pay attention to whether the crypto key is available in the location that this bucket is created in. See the docs for more details.
        """
        self._values = {
            'default_kms_key_name': default_kms_key_name,
        }

    @builtins.property
    def default_kms_key_name(self) -> str:
        """A Cloud KMS key that will be used to encrypt objects inserted into this bucket, if no encryption method is specified.

        You must pay attention to whether the crypto key is available in the location that this bucket is created in. See the docs for more details.
        """
        return self._values.get('default_kms_key_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketEncryption(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageBucketIamBinding(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageBucketIamBinding"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["StorageBucketIamBindingCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: 
        :param members: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageBucketIamBindingConfig(bucket=bucket, members=members, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageBucketIamBinding, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> str:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: str) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="members")
    def members(self) -> typing.List[str]:
        return jsii.get(self, "members")

    @members.setter
    def members(self, value: typing.List[str]) -> None:
        jsii.set(self, "members", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["StorageBucketIamBindingCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["StorageBucketIamBindingCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketIamBindingCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class StorageBucketIamBindingCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketIamBindingCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketIamBindingConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'members': 'members', 'role': 'role', 'condition': 'condition'})
class StorageBucketIamBindingConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: str, members: typing.List[str], role: str, condition: typing.Optional[typing.List["StorageBucketIamBindingCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: 
        :param members: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'bucket': bucket,
            'members': members,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> str:
        return self._values.get('bucket')

    @builtins.property
    def members(self) -> typing.List[str]:
        return self._values.get('members')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["StorageBucketIamBindingCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketIamBindingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageBucketIamMember(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageBucketIamMember"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: str, member: str, role: str, condition: typing.Optional[typing.List["StorageBucketIamMemberCondition"]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: 
        :param member: 
        :param role: 
        :param condition: condition block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageBucketIamMemberConfig(bucket=bucket, member=member, role=role, condition=condition, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageBucketIamMember, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> str:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: str) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="member")
    def member(self) -> str:
        return jsii.get(self, "member")

    @member.setter
    def member(self, value: str) -> None:
        jsii.set(self, "member", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="condition")
    def condition(self) -> typing.Optional[typing.List["StorageBucketIamMemberCondition"]]:
        return jsii.get(self, "condition")

    @condition.setter
    def condition(self, value: typing.Optional[typing.List["StorageBucketIamMemberCondition"]]) -> None:
        jsii.set(self, "condition", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketIamMemberCondition", jsii_struct_bases=[], name_mapping={'expression': 'expression', 'title': 'title', 'description': 'description'})
class StorageBucketIamMemberCondition():
    def __init__(self, *, expression: str, title: str, description: typing.Optional[str]=None) -> None:
        """
        :param expression: 
        :param title: 
        :param description: 
        """
        self._values = {
            'expression': expression,
            'title': title,
        }
        if description is not None: self._values["description"] = description

    @builtins.property
    def expression(self) -> str:
        return self._values.get('expression')

    @builtins.property
    def title(self) -> str:
        return self._values.get('title')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        return self._values.get('description')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketIamMemberCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketIamMemberConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'member': 'member', 'role': 'role', 'condition': 'condition'})
class StorageBucketIamMemberConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: str, member: str, role: str, condition: typing.Optional[typing.List["StorageBucketIamMemberCondition"]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: 
        :param member: 
        :param role: 
        :param condition: condition block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'bucket': bucket,
            'member': member,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if condition is not None: self._values["condition"] = condition

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> str:
        return self._values.get('bucket')

    @builtins.property
    def member(self) -> str:
        return self._values.get('member')

    @builtins.property
    def role(self) -> str:
        return self._values.get('role')

    @builtins.property
    def condition(self) -> typing.Optional[typing.List["StorageBucketIamMemberCondition"]]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketIamMemberConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageBucketIamPolicy(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageBucketIamPolicy"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: str, policy_data: str, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: 
        :param policy_data: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageBucketIamPolicyConfig(bucket=bucket, policy_data=policy_data, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageBucketIamPolicy, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="etag")
    def etag(self) -> str:
        return jsii.get(self, "etag")

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> str:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: str) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="policyData")
    def policy_data(self) -> str:
        return jsii.get(self, "policyData")

    @policy_data.setter
    def policy_data(self, value: str) -> None:
        jsii.set(self, "policyData", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketIamPolicyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'policy_data': 'policyData'})
class StorageBucketIamPolicyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: str, policy_data: str) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: 
        :param policy_data: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'bucket': bucket,
            'policy_data': policy_data,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> str:
        return self._values.get('bucket')

    @builtins.property
    def policy_data(self) -> str:
        return self._values.get('policy_data')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketIamPolicyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketLifecycleRule", jsii_struct_bases=[], name_mapping={'action': 'action', 'condition': 'condition'})
class StorageBucketLifecycleRule():
    def __init__(self, *, action: typing.List["StorageBucketLifecycleRuleAction"], condition: typing.List["StorageBucketLifecycleRuleCondition"]) -> None:
        """
        :param action: action block.
        :param condition: condition block.
        """
        self._values = {
            'action': action,
            'condition': condition,
        }

    @builtins.property
    def action(self) -> typing.List["StorageBucketLifecycleRuleAction"]:
        """action block."""
        return self._values.get('action')

    @builtins.property
    def condition(self) -> typing.List["StorageBucketLifecycleRuleCondition"]:
        """condition block."""
        return self._values.get('condition')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketLifecycleRule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketLifecycleRuleAction", jsii_struct_bases=[], name_mapping={'type': 'type', 'storage_class': 'storageClass'})
class StorageBucketLifecycleRuleAction():
    def __init__(self, *, type: str, storage_class: typing.Optional[str]=None) -> None:
        """
        :param type: The type of the action of this Lifecycle Rule. Supported values include: Delete and SetStorageClass.
        :param storage_class: The target Storage Class of objects affected by this Lifecycle Rule. Supported values include: MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE.
        """
        self._values = {
            'type': type,
        }
        if storage_class is not None: self._values["storage_class"] = storage_class

    @builtins.property
    def type(self) -> str:
        """The type of the action of this Lifecycle Rule.

        Supported values include: Delete and SetStorageClass.
        """
        return self._values.get('type')

    @builtins.property
    def storage_class(self) -> typing.Optional[str]:
        """The target Storage Class of objects affected by this Lifecycle Rule.

        Supported values include: MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE.
        """
        return self._values.get('storage_class')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketLifecycleRuleAction(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketLifecycleRuleCondition", jsii_struct_bases=[], name_mapping={'age': 'age', 'created_before': 'createdBefore', 'is_live': 'isLive', 'matches_storage_class': 'matchesStorageClass', 'num_newer_versions': 'numNewerVersions', 'with_state': 'withState'})
class StorageBucketLifecycleRuleCondition():
    def __init__(self, *, age: typing.Optional[jsii.Number]=None, created_before: typing.Optional[str]=None, is_live: typing.Optional[bool]=None, matches_storage_class: typing.Optional[typing.List[str]]=None, num_newer_versions: typing.Optional[jsii.Number]=None, with_state: typing.Optional[str]=None) -> None:
        """
        :param age: Minimum age of an object in days to satisfy this condition.
        :param created_before: Creation date of an object in RFC 3339 (e.g. 2017-06-13) to satisfy this condition.
        :param is_live: 
        :param matches_storage_class: Storage Class of objects to satisfy this condition. Supported values include: MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE, STANDARD, DURABLE_REDUCED_AVAILABILITY.
        :param num_newer_versions: Relevant only for versioned objects. The number of newer versions of an object to satisfy this condition.
        :param with_state: Match to live and/or archived objects. Unversioned buckets have only live objects. Supported values include: "LIVE", "ARCHIVED", "ANY".
        """
        self._values = {
        }
        if age is not None: self._values["age"] = age
        if created_before is not None: self._values["created_before"] = created_before
        if is_live is not None: self._values["is_live"] = is_live
        if matches_storage_class is not None: self._values["matches_storage_class"] = matches_storage_class
        if num_newer_versions is not None: self._values["num_newer_versions"] = num_newer_versions
        if with_state is not None: self._values["with_state"] = with_state

    @builtins.property
    def age(self) -> typing.Optional[jsii.Number]:
        """Minimum age of an object in days to satisfy this condition."""
        return self._values.get('age')

    @builtins.property
    def created_before(self) -> typing.Optional[str]:
        """Creation date of an object in RFC 3339 (e.g. 2017-06-13) to satisfy this condition."""
        return self._values.get('created_before')

    @builtins.property
    def is_live(self) -> typing.Optional[bool]:
        return self._values.get('is_live')

    @builtins.property
    def matches_storage_class(self) -> typing.Optional[typing.List[str]]:
        """Storage Class of objects to satisfy this condition.

        Supported values include: MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE, STANDARD, DURABLE_REDUCED_AVAILABILITY.
        """
        return self._values.get('matches_storage_class')

    @builtins.property
    def num_newer_versions(self) -> typing.Optional[jsii.Number]:
        """Relevant only for versioned objects.

        The number of newer versions of an object to satisfy this condition.
        """
        return self._values.get('num_newer_versions')

    @builtins.property
    def with_state(self) -> typing.Optional[str]:
        """Match to live and/or archived objects.

        Unversioned buckets have only live objects. Supported values include: "LIVE", "ARCHIVED", "ANY".
        """
        return self._values.get('with_state')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketLifecycleRuleCondition(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketLogging", jsii_struct_bases=[], name_mapping={'log_bucket': 'logBucket', 'log_object_prefix': 'logObjectPrefix'})
class StorageBucketLogging():
    def __init__(self, *, log_bucket: str, log_object_prefix: typing.Optional[str]=None) -> None:
        """
        :param log_bucket: The bucket that will receive log objects.
        :param log_object_prefix: The object prefix for log objects. If it's not provided, by default GCS sets this to this bucket's name.
        """
        self._values = {
            'log_bucket': log_bucket,
        }
        if log_object_prefix is not None: self._values["log_object_prefix"] = log_object_prefix

    @builtins.property
    def log_bucket(self) -> str:
        """The bucket that will receive log objects."""
        return self._values.get('log_bucket')

    @builtins.property
    def log_object_prefix(self) -> typing.Optional[str]:
        """The object prefix for log objects.

        If it's not provided, by default GCS sets this to this bucket's name.
        """
        return self._values.get('log_object_prefix')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketLogging(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageBucketObject(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageBucketObject"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: str, name: str, cache_control: typing.Optional[str]=None, content: typing.Optional[str]=None, content_disposition: typing.Optional[str]=None, content_encoding: typing.Optional[str]=None, content_language: typing.Optional[str]=None, content_type: typing.Optional[str]=None, detect_md5_hash: typing.Optional[str]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, source: typing.Optional[str]=None, storage_class: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: The name of the containing bucket.
        :param name: The name of the object. If you're interpolating the name of this object, see output_name instead.
        :param cache_control: Cache-Control directive to specify caching behavior of object data. If omitted and object is accessible to all anonymous users, the default will be public, max-age=3600
        :param content: Data as string to be uploaded. Must be defined if source is not. Note: The content field is marked as sensitive. To view the raw contents of the object, please define an output.
        :param content_disposition: Content-Disposition of the object data.
        :param content_encoding: Content-Encoding of the object data.
        :param content_language: Content-Language of the object data.
        :param content_type: Content-Type of the object data. Defaults to "application/octet-stream" or "text/plain; charset=utf-8".
        :param detect_md5_hash: 
        :param metadata: User-provided metadata, in key/value pairs.
        :param source: A path to the data you want to upload. Must be defined if content is not.
        :param storage_class: The StorageClass of the new bucket object. Supported values include: MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE. If not provided, this defaults to the bucket's default storage class or to a standard class.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageBucketObjectConfig(bucket=bucket, name=name, cache_control=cache_control, content=content, content_disposition=content_disposition, content_encoding=content_encoding, content_language=content_language, content_type=content_type, detect_md5_hash=detect_md5_hash, metadata=metadata, source=source, storage_class=storage_class, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageBucketObject, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="crc32C")
    def crc32_c(self) -> str:
        return jsii.get(self, "crc32C")

    @builtins.property
    @jsii.member(jsii_name="md5Hash")
    def md5_hash(self) -> str:
        return jsii.get(self, "md5Hash")

    @builtins.property
    @jsii.member(jsii_name="mediaLink")
    def media_link(self) -> str:
        return jsii.get(self, "mediaLink")

    @builtins.property
    @jsii.member(jsii_name="outputName")
    def output_name(self) -> str:
        return jsii.get(self, "outputName")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> str:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: str) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="cacheControl")
    def cache_control(self) -> typing.Optional[str]:
        return jsii.get(self, "cacheControl")

    @cache_control.setter
    def cache_control(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "cacheControl", value)

    @builtins.property
    @jsii.member(jsii_name="content")
    def content(self) -> typing.Optional[str]:
        return jsii.get(self, "content")

    @content.setter
    def content(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "content", value)

    @builtins.property
    @jsii.member(jsii_name="contentDisposition")
    def content_disposition(self) -> typing.Optional[str]:
        return jsii.get(self, "contentDisposition")

    @content_disposition.setter
    def content_disposition(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "contentDisposition", value)

    @builtins.property
    @jsii.member(jsii_name="contentEncoding")
    def content_encoding(self) -> typing.Optional[str]:
        return jsii.get(self, "contentEncoding")

    @content_encoding.setter
    def content_encoding(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "contentEncoding", value)

    @builtins.property
    @jsii.member(jsii_name="contentLanguage")
    def content_language(self) -> typing.Optional[str]:
        return jsii.get(self, "contentLanguage")

    @content_language.setter
    def content_language(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "contentLanguage", value)

    @builtins.property
    @jsii.member(jsii_name="contentType")
    def content_type(self) -> typing.Optional[str]:
        return jsii.get(self, "contentType")

    @content_type.setter
    def content_type(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "contentType", value)

    @builtins.property
    @jsii.member(jsii_name="detectMd5Hash")
    def detect_md5_hash(self) -> typing.Optional[str]:
        return jsii.get(self, "detectMd5Hash")

    @detect_md5_hash.setter
    def detect_md5_hash(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "detectMd5Hash", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="metadata")
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "metadata")

    @metadata.setter
    def metadata(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "metadata", value)

    @builtins.property
    @jsii.member(jsii_name="source")
    def source(self) -> typing.Optional[str]:
        return jsii.get(self, "source")

    @source.setter
    def source(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "source", value)

    @builtins.property
    @jsii.member(jsii_name="storageClass")
    def storage_class(self) -> typing.Optional[str]:
        return jsii.get(self, "storageClass")

    @storage_class.setter
    def storage_class(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "storageClass", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketObjectConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'name': 'name', 'cache_control': 'cacheControl', 'content': 'content', 'content_disposition': 'contentDisposition', 'content_encoding': 'contentEncoding', 'content_language': 'contentLanguage', 'content_type': 'contentType', 'detect_md5_hash': 'detectMd5Hash', 'metadata': 'metadata', 'source': 'source', 'storage_class': 'storageClass'})
class StorageBucketObjectConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: str, name: str, cache_control: typing.Optional[str]=None, content: typing.Optional[str]=None, content_disposition: typing.Optional[str]=None, content_encoding: typing.Optional[str]=None, content_language: typing.Optional[str]=None, content_type: typing.Optional[str]=None, detect_md5_hash: typing.Optional[str]=None, metadata: typing.Optional[typing.Mapping[str, str]]=None, source: typing.Optional[str]=None, storage_class: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: The name of the containing bucket.
        :param name: The name of the object. If you're interpolating the name of this object, see output_name instead.
        :param cache_control: Cache-Control directive to specify caching behavior of object data. If omitted and object is accessible to all anonymous users, the default will be public, max-age=3600
        :param content: Data as string to be uploaded. Must be defined if source is not. Note: The content field is marked as sensitive. To view the raw contents of the object, please define an output.
        :param content_disposition: Content-Disposition of the object data.
        :param content_encoding: Content-Encoding of the object data.
        :param content_language: Content-Language of the object data.
        :param content_type: Content-Type of the object data. Defaults to "application/octet-stream" or "text/plain; charset=utf-8".
        :param detect_md5_hash: 
        :param metadata: User-provided metadata, in key/value pairs.
        :param source: A path to the data you want to upload. Must be defined if content is not.
        :param storage_class: The StorageClass of the new bucket object. Supported values include: MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE. If not provided, this defaults to the bucket's default storage class or to a standard class.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'bucket': bucket,
            'name': name,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if cache_control is not None: self._values["cache_control"] = cache_control
        if content is not None: self._values["content"] = content
        if content_disposition is not None: self._values["content_disposition"] = content_disposition
        if content_encoding is not None: self._values["content_encoding"] = content_encoding
        if content_language is not None: self._values["content_language"] = content_language
        if content_type is not None: self._values["content_type"] = content_type
        if detect_md5_hash is not None: self._values["detect_md5_hash"] = detect_md5_hash
        if metadata is not None: self._values["metadata"] = metadata
        if source is not None: self._values["source"] = source
        if storage_class is not None: self._values["storage_class"] = storage_class

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> str:
        """The name of the containing bucket."""
        return self._values.get('bucket')

    @builtins.property
    def name(self) -> str:
        """The name of the object.

        If you're interpolating the name of this object, see output_name instead.
        """
        return self._values.get('name')

    @builtins.property
    def cache_control(self) -> typing.Optional[str]:
        """Cache-Control directive to specify caching behavior of object data.

        If omitted and object is accessible to all anonymous users, the default will be public, max-age=3600
        """
        return self._values.get('cache_control')

    @builtins.property
    def content(self) -> typing.Optional[str]:
        """Data as string to be uploaded.

        Must be defined if source is not. Note: The content field is marked as sensitive. To view the raw contents of the object, please define an output.
        """
        return self._values.get('content')

    @builtins.property
    def content_disposition(self) -> typing.Optional[str]:
        """Content-Disposition of the object data."""
        return self._values.get('content_disposition')

    @builtins.property
    def content_encoding(self) -> typing.Optional[str]:
        """Content-Encoding of the object data."""
        return self._values.get('content_encoding')

    @builtins.property
    def content_language(self) -> typing.Optional[str]:
        """Content-Language of the object data."""
        return self._values.get('content_language')

    @builtins.property
    def content_type(self) -> typing.Optional[str]:
        """Content-Type of the object data.

        Defaults to "application/octet-stream" or "text/plain; charset=utf-8".
        """
        return self._values.get('content_type')

    @builtins.property
    def detect_md5_hash(self) -> typing.Optional[str]:
        return self._values.get('detect_md5_hash')

    @builtins.property
    def metadata(self) -> typing.Optional[typing.Mapping[str, str]]:
        """User-provided metadata, in key/value pairs."""
        return self._values.get('metadata')

    @builtins.property
    def source(self) -> typing.Optional[str]:
        """A path to the data you want to upload.

        Must be defined if content is not.
        """
        return self._values.get('source')

    @builtins.property
    def storage_class(self) -> typing.Optional[str]:
        """The StorageClass of the new bucket object.

        Supported values include: MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE. If not provided, this defaults to the bucket's default storage class or to a standard class.
        """
        return self._values.get('storage_class')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketObjectConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketRetentionPolicy", jsii_struct_bases=[], name_mapping={'retention_period': 'retentionPeriod', 'is_locked': 'isLocked'})
class StorageBucketRetentionPolicy():
    def __init__(self, *, retention_period: jsii.Number, is_locked: typing.Optional[bool]=None) -> None:
        """
        :param retention_period: The period of time, in seconds, that objects in the bucket must be retained and cannot be deleted, overwritten, or archived. The value must be less than 3,155,760,000 seconds.
        :param is_locked: If set to true, the bucket will be locked and permanently restrict edits to the bucket's retention policy. Caution: Locking a bucket is an irreversible action.
        """
        self._values = {
            'retention_period': retention_period,
        }
        if is_locked is not None: self._values["is_locked"] = is_locked

    @builtins.property
    def retention_period(self) -> jsii.Number:
        """The period of time, in seconds, that objects in the bucket must be retained and cannot be deleted, overwritten, or archived.

        The value must be less than 3,155,760,000 seconds.
        """
        return self._values.get('retention_period')

    @builtins.property
    def is_locked(self) -> typing.Optional[bool]:
        """If set to true, the bucket will be locked and permanently restrict edits to the bucket's retention policy.

        Caution: Locking a bucket is an irreversible action.
        """
        return self._values.get('is_locked')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketRetentionPolicy(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketVersioning", jsii_struct_bases=[], name_mapping={'enabled': 'enabled'})
class StorageBucketVersioning():
    def __init__(self, *, enabled: bool) -> None:
        """
        :param enabled: While set to true, versioning is fully enabled for this bucket.
        """
        self._values = {
            'enabled': enabled,
        }

    @builtins.property
    def enabled(self) -> bool:
        """While set to true, versioning is fully enabled for this bucket."""
        return self._values.get('enabled')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketVersioning(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageBucketWebsite", jsii_struct_bases=[], name_mapping={'main_page_suffix': 'mainPageSuffix', 'not_found_page': 'notFoundPage'})
class StorageBucketWebsite():
    def __init__(self, *, main_page_suffix: typing.Optional[str]=None, not_found_page: typing.Optional[str]=None) -> None:
        """
        :param main_page_suffix: Behaves as the bucket's directory index where missing objects are treated as potential directories.
        :param not_found_page: The custom object to return when a requested resource is not found.
        """
        self._values = {
        }
        if main_page_suffix is not None: self._values["main_page_suffix"] = main_page_suffix
        if not_found_page is not None: self._values["not_found_page"] = not_found_page

    @builtins.property
    def main_page_suffix(self) -> typing.Optional[str]:
        """Behaves as the bucket's directory index where missing objects are treated as potential directories."""
        return self._values.get('main_page_suffix')

    @builtins.property
    def not_found_page(self) -> typing.Optional[str]:
        """The custom object to return when a requested resource is not found."""
        return self._values.get('not_found_page')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageBucketWebsite(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageDefaultObjectAccessControl(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageDefaultObjectAccessControl"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: str, entity: str, role: str, object: typing.Optional[str]=None, timeouts: typing.Optional["StorageDefaultObjectAccessControlTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: The name of the bucket.
        :param entity: The entity holding the permission, in one of the following forms: user-{{userId}} user-{{email}} (such as "user-liz@example.com") group-{{groupId}} group-{{email}} (such as "group-example@googlegroups.com") domain-{{domain}} (such as "domain-example.com") project-team-{{projectId}} allUsers allAuthenticatedUsers.
        :param role: The access permission for the entity. Possible values: ["OWNER", "READER"]
        :param object: The name of the object, if applied to an object.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageDefaultObjectAccessControlConfig(bucket=bucket, entity=entity, role=role, object=object, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageDefaultObjectAccessControl, self, [scope, id, config])

    @jsii.member(jsii_name="projectTeam")
    def project_team(self, index: str) -> "StorageDefaultObjectAccessControlProjectTeam":
        """
        :param index: -
        """
        return jsii.invoke(self, "projectTeam", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="domain")
    def domain(self) -> str:
        return jsii.get(self, "domain")

    @builtins.property
    @jsii.member(jsii_name="email")
    def email(self) -> str:
        return jsii.get(self, "email")

    @builtins.property
    @jsii.member(jsii_name="entityId")
    def entity_id(self) -> str:
        return jsii.get(self, "entityId")

    @builtins.property
    @jsii.member(jsii_name="generation")
    def generation(self) -> jsii.Number:
        return jsii.get(self, "generation")

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> str:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: str) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="entity")
    def entity(self) -> str:
        return jsii.get(self, "entity")

    @entity.setter
    def entity(self, value: str) -> None:
        jsii.set(self, "entity", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="object")
    def object(self) -> typing.Optional[str]:
        return jsii.get(self, "object")

    @object.setter
    def object(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "object", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["StorageDefaultObjectAccessControlTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["StorageDefaultObjectAccessControlTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageDefaultObjectAccessControlConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'entity': 'entity', 'role': 'role', 'object': 'object', 'timeouts': 'timeouts'})
class StorageDefaultObjectAccessControlConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: str, entity: str, role: str, object: typing.Optional[str]=None, timeouts: typing.Optional["StorageDefaultObjectAccessControlTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: The name of the bucket.
        :param entity: The entity holding the permission, in one of the following forms: user-{{userId}} user-{{email}} (such as "user-liz@example.com") group-{{groupId}} group-{{email}} (such as "group-example@googlegroups.com") domain-{{domain}} (such as "domain-example.com") project-team-{{projectId}} allUsers allAuthenticatedUsers.
        :param role: The access permission for the entity. Possible values: ["OWNER", "READER"]
        :param object: The name of the object, if applied to an object.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = StorageDefaultObjectAccessControlTimeouts(**timeouts)
        self._values = {
            'bucket': bucket,
            'entity': entity,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if object is not None: self._values["object"] = object
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> str:
        """The name of the bucket."""
        return self._values.get('bucket')

    @builtins.property
    def entity(self) -> str:
        """The entity holding the permission, in one of the following forms: user-{{userId}} user-{{email}} (such as "user-liz@example.com") group-{{groupId}} group-{{email}} (such as "group-example@googlegroups.com") domain-{{domain}} (such as "domain-example.com") project-team-{{projectId}} allUsers allAuthenticatedUsers."""
        return self._values.get('entity')

    @builtins.property
    def role(self) -> str:
        """The access permission for the entity.

        Possible values: ["OWNER", "READER"]
        """
        return self._values.get('role')

    @builtins.property
    def object(self) -> typing.Optional[str]:
        """The name of the object, if applied to an object."""
        return self._values.get('object')

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageDefaultObjectAccessControlTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageDefaultObjectAccessControlConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageDefaultObjectAccessControlProjectTeam(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageDefaultObjectAccessControlProjectTeam"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(StorageDefaultObjectAccessControlProjectTeam, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="projectNumber")
    def project_number(self) -> str:
        return jsii.get(self, "projectNumber")

    @builtins.property
    @jsii.member(jsii_name="team")
    def team(self) -> str:
        return jsii.get(self, "team")


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageDefaultObjectAccessControlTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class StorageDefaultObjectAccessControlTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageDefaultObjectAccessControlTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageDefaultObjectAcl(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageDefaultObjectAcl"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: str, role_entity: typing.Optional[typing.List[str]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: 
        :param role_entity: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageDefaultObjectAclConfig(bucket=bucket, role_entity=role_entity, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageDefaultObjectAcl, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> str:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: str) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="roleEntity")
    def role_entity(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "roleEntity")

    @role_entity.setter
    def role_entity(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "roleEntity", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageDefaultObjectAclConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'role_entity': 'roleEntity'})
class StorageDefaultObjectAclConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: str, role_entity: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: 
        :param role_entity: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'bucket': bucket,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if role_entity is not None: self._values["role_entity"] = role_entity

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> str:
        return self._values.get('bucket')

    @builtins.property
    def role_entity(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('role_entity')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageDefaultObjectAclConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageHmacKey(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageHmacKey"):
    def __init__(self, scope: constructs.Construct, id: str, *, service_account_email: str, project: typing.Optional[str]=None, state: typing.Optional[str]=None, timeouts: typing.Optional["StorageHmacKeyTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param service_account_email: The email address of the key's associated service account.
        :param project: 
        :param state: The state of the key. Can be set to one of ACTIVE, INACTIVE. Default value: "ACTIVE" Possible values: ["ACTIVE", "INACTIVE"]
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageHmacKeyConfig(service_account_email=service_account_email, project=project, state=state, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageHmacKey, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="accessId")
    def access_id(self) -> str:
        return jsii.get(self, "accessId")

    @builtins.property
    @jsii.member(jsii_name="secret")
    def secret(self) -> str:
        return jsii.get(self, "secret")

    @builtins.property
    @jsii.member(jsii_name="timeCreated")
    def time_created(self) -> str:
        return jsii.get(self, "timeCreated")

    @builtins.property
    @jsii.member(jsii_name="updated")
    def updated(self) -> str:
        return jsii.get(self, "updated")

    @builtins.property
    @jsii.member(jsii_name="serviceAccountEmail")
    def service_account_email(self) -> str:
        return jsii.get(self, "serviceAccountEmail")

    @service_account_email.setter
    def service_account_email(self, value: str) -> None:
        jsii.set(self, "serviceAccountEmail", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="state")
    def state(self) -> typing.Optional[str]:
        return jsii.get(self, "state")

    @state.setter
    def state(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "state", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["StorageHmacKeyTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["StorageHmacKeyTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageHmacKeyConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'service_account_email': 'serviceAccountEmail', 'project': 'project', 'state': 'state', 'timeouts': 'timeouts'})
class StorageHmacKeyConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, service_account_email: str, project: typing.Optional[str]=None, state: typing.Optional[str]=None, timeouts: typing.Optional["StorageHmacKeyTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param service_account_email: The email address of the key's associated service account.
        :param project: 
        :param state: The state of the key. Can be set to one of ACTIVE, INACTIVE. Default value: "ACTIVE" Possible values: ["ACTIVE", "INACTIVE"]
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = StorageHmacKeyTimeouts(**timeouts)
        self._values = {
            'service_account_email': service_account_email,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if state is not None: self._values["state"] = state
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def service_account_email(self) -> str:
        """The email address of the key's associated service account."""
        return self._values.get('service_account_email')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def state(self) -> typing.Optional[str]:
        """The state of the key.

        Can be set to one of ACTIVE, INACTIVE. Default value: "ACTIVE" Possible values: ["ACTIVE", "INACTIVE"]
        """
        return self._values.get('state')

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageHmacKeyTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageHmacKeyConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageHmacKeyTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class StorageHmacKeyTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageHmacKeyTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageNotification(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageNotification"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: str, payload_format: str, topic: str, custom_attributes: typing.Optional[typing.Mapping[str, str]]=None, event_types: typing.Optional[typing.List[str]]=None, object_name_prefix: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: The name of the bucket.
        :param payload_format: The desired content of the Payload. One of "JSON_API_V1" or "NONE".
        :param topic: The Cloud PubSub topic to which this subscription publishes. Expects either the topic name, assumed to belong to the default GCP provider project, or the project-level name, i.e. projects/my-gcp-project/topics/my-topic or my-topic. If the project is not set in the provider, you will need to use the project-level name.
        :param custom_attributes: A set of key/value attribute pairs to attach to each Cloud PubSub message published for this notification subscription.
        :param event_types: List of event type filters for this notification config. If not specified, Cloud Storage will send notifications for all event types. The valid types are: "OBJECT_FINALIZE", "OBJECT_METADATA_UPDATE", "OBJECT_DELETE", "OBJECT_ARCHIVE"
        :param object_name_prefix: Specifies a prefix path filter for this notification config. Cloud Storage will only send notifications for objects in this bucket whose names begin with the specified prefix.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageNotificationConfig(bucket=bucket, payload_format=payload_format, topic=topic, custom_attributes=custom_attributes, event_types=event_types, object_name_prefix=object_name_prefix, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageNotification, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="notificationId")
    def notification_id(self) -> str:
        return jsii.get(self, "notificationId")

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> str:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: str) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="payloadFormat")
    def payload_format(self) -> str:
        return jsii.get(self, "payloadFormat")

    @payload_format.setter
    def payload_format(self, value: str) -> None:
        jsii.set(self, "payloadFormat", value)

    @builtins.property
    @jsii.member(jsii_name="topic")
    def topic(self) -> str:
        return jsii.get(self, "topic")

    @topic.setter
    def topic(self, value: str) -> None:
        jsii.set(self, "topic", value)

    @builtins.property
    @jsii.member(jsii_name="customAttributes")
    def custom_attributes(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "customAttributes")

    @custom_attributes.setter
    def custom_attributes(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "customAttributes", value)

    @builtins.property
    @jsii.member(jsii_name="eventTypes")
    def event_types(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "eventTypes")

    @event_types.setter
    def event_types(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "eventTypes", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="objectNamePrefix")
    def object_name_prefix(self) -> typing.Optional[str]:
        return jsii.get(self, "objectNamePrefix")

    @object_name_prefix.setter
    def object_name_prefix(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "objectNamePrefix", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageNotificationConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'payload_format': 'payloadFormat', 'topic': 'topic', 'custom_attributes': 'customAttributes', 'event_types': 'eventTypes', 'object_name_prefix': 'objectNamePrefix'})
class StorageNotificationConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: str, payload_format: str, topic: str, custom_attributes: typing.Optional[typing.Mapping[str, str]]=None, event_types: typing.Optional[typing.List[str]]=None, object_name_prefix: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: The name of the bucket.
        :param payload_format: The desired content of the Payload. One of "JSON_API_V1" or "NONE".
        :param topic: The Cloud PubSub topic to which this subscription publishes. Expects either the topic name, assumed to belong to the default GCP provider project, or the project-level name, i.e. projects/my-gcp-project/topics/my-topic or my-topic. If the project is not set in the provider, you will need to use the project-level name.
        :param custom_attributes: A set of key/value attribute pairs to attach to each Cloud PubSub message published for this notification subscription.
        :param event_types: List of event type filters for this notification config. If not specified, Cloud Storage will send notifications for all event types. The valid types are: "OBJECT_FINALIZE", "OBJECT_METADATA_UPDATE", "OBJECT_DELETE", "OBJECT_ARCHIVE"
        :param object_name_prefix: Specifies a prefix path filter for this notification config. Cloud Storage will only send notifications for objects in this bucket whose names begin with the specified prefix.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'bucket': bucket,
            'payload_format': payload_format,
            'topic': topic,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if custom_attributes is not None: self._values["custom_attributes"] = custom_attributes
        if event_types is not None: self._values["event_types"] = event_types
        if object_name_prefix is not None: self._values["object_name_prefix"] = object_name_prefix

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> str:
        """The name of the bucket."""
        return self._values.get('bucket')

    @builtins.property
    def payload_format(self) -> str:
        """The desired content of the Payload.

        One of "JSON_API_V1" or "NONE".
        """
        return self._values.get('payload_format')

    @builtins.property
    def topic(self) -> str:
        """The Cloud PubSub topic to which this subscription publishes.

        Expects either the  topic name, assumed to belong to the default GCP provider project, or the project-level name,  i.e. projects/my-gcp-project/topics/my-topic or my-topic. If the project is not set in the provider, you will need to use the project-level name.
        """
        return self._values.get('topic')

    @builtins.property
    def custom_attributes(self) -> typing.Optional[typing.Mapping[str, str]]:
        """A set of key/value attribute pairs to attach to each Cloud PubSub message published for this notification subscription."""
        return self._values.get('custom_attributes')

    @builtins.property
    def event_types(self) -> typing.Optional[typing.List[str]]:
        """List of event type filters for this notification config.

        If not specified, Cloud Storage will send notifications for all event types. The valid types are: "OBJECT_FINALIZE", "OBJECT_METADATA_UPDATE", "OBJECT_DELETE", "OBJECT_ARCHIVE"
        """
        return self._values.get('event_types')

    @builtins.property
    def object_name_prefix(self) -> typing.Optional[str]:
        """Specifies a prefix path filter for this notification config.

        Cloud Storage will only send notifications for objects in this bucket whose names begin with the specified prefix.
        """
        return self._values.get('object_name_prefix')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageNotificationConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageObjectAccessControl(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageObjectAccessControl"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: str, entity: str, object: str, role: str, timeouts: typing.Optional["StorageObjectAccessControlTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: The name of the bucket.
        :param entity: The entity holding the permission, in one of the following forms: user-{{userId}} user-{{email}} (such as "user-liz@example.com") group-{{groupId}} group-{{email}} (such as "group-example@googlegroups.com") domain-{{domain}} (such as "domain-example.com") project-team-{{projectId}} allUsers allAuthenticatedUsers.
        :param object: The name of the object to apply the access control to.
        :param role: The access permission for the entity. Possible values: ["OWNER", "READER"]
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageObjectAccessControlConfig(bucket=bucket, entity=entity, object=object, role=role, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageObjectAccessControl, self, [scope, id, config])

    @jsii.member(jsii_name="projectTeam")
    def project_team(self, index: str) -> "StorageObjectAccessControlProjectTeam":
        """
        :param index: -
        """
        return jsii.invoke(self, "projectTeam", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="domain")
    def domain(self) -> str:
        return jsii.get(self, "domain")

    @builtins.property
    @jsii.member(jsii_name="email")
    def email(self) -> str:
        return jsii.get(self, "email")

    @builtins.property
    @jsii.member(jsii_name="entityId")
    def entity_id(self) -> str:
        return jsii.get(self, "entityId")

    @builtins.property
    @jsii.member(jsii_name="generation")
    def generation(self) -> jsii.Number:
        return jsii.get(self, "generation")

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> str:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: str) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="entity")
    def entity(self) -> str:
        return jsii.get(self, "entity")

    @entity.setter
    def entity(self, value: str) -> None:
        jsii.set(self, "entity", value)

    @builtins.property
    @jsii.member(jsii_name="object")
    def object(self) -> str:
        return jsii.get(self, "object")

    @object.setter
    def object(self, value: str) -> None:
        jsii.set(self, "object", value)

    @builtins.property
    @jsii.member(jsii_name="role")
    def role(self) -> str:
        return jsii.get(self, "role")

    @role.setter
    def role(self, value: str) -> None:
        jsii.set(self, "role", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["StorageObjectAccessControlTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["StorageObjectAccessControlTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageObjectAccessControlConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'entity': 'entity', 'object': 'object', 'role': 'role', 'timeouts': 'timeouts'})
class StorageObjectAccessControlConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: str, entity: str, object: str, role: str, timeouts: typing.Optional["StorageObjectAccessControlTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: The name of the bucket.
        :param entity: The entity holding the permission, in one of the following forms: user-{{userId}} user-{{email}} (such as "user-liz@example.com") group-{{groupId}} group-{{email}} (such as "group-example@googlegroups.com") domain-{{domain}} (such as "domain-example.com") project-team-{{projectId}} allUsers allAuthenticatedUsers.
        :param object: The name of the object to apply the access control to.
        :param role: The access permission for the entity. Possible values: ["OWNER", "READER"]
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = StorageObjectAccessControlTimeouts(**timeouts)
        self._values = {
            'bucket': bucket,
            'entity': entity,
            'object': object,
            'role': role,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> str:
        """The name of the bucket."""
        return self._values.get('bucket')

    @builtins.property
    def entity(self) -> str:
        """The entity holding the permission, in one of the following forms: user-{{userId}} user-{{email}} (such as "user-liz@example.com") group-{{groupId}} group-{{email}} (such as "group-example@googlegroups.com") domain-{{domain}} (such as "domain-example.com") project-team-{{projectId}} allUsers allAuthenticatedUsers."""
        return self._values.get('entity')

    @builtins.property
    def object(self) -> str:
        """The name of the object to apply the access control to."""
        return self._values.get('object')

    @builtins.property
    def role(self) -> str:
        """The access permission for the entity.

        Possible values: ["OWNER", "READER"]
        """
        return self._values.get('role')

    @builtins.property
    def timeouts(self) -> typing.Optional["StorageObjectAccessControlTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageObjectAccessControlConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageObjectAccessControlProjectTeam(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageObjectAccessControlProjectTeam"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(StorageObjectAccessControlProjectTeam, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="projectNumber")
    def project_number(self) -> str:
        return jsii.get(self, "projectNumber")

    @builtins.property
    @jsii.member(jsii_name="team")
    def team(self) -> str:
        return jsii.get(self, "team")


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageObjectAccessControlTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class StorageObjectAccessControlTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageObjectAccessControlTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageObjectAcl(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageObjectAcl"):
    def __init__(self, scope: constructs.Construct, id: str, *, bucket: str, object: str, predefined_acl: typing.Optional[str]=None, role_entity: typing.Optional[typing.List[str]]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param bucket: 
        :param object: 
        :param predefined_acl: 
        :param role_entity: 
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageObjectAclConfig(bucket=bucket, object=object, predefined_acl=predefined_acl, role_entity=role_entity, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageObjectAcl, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="bucket")
    def bucket(self) -> str:
        return jsii.get(self, "bucket")

    @bucket.setter
    def bucket(self, value: str) -> None:
        jsii.set(self, "bucket", value)

    @builtins.property
    @jsii.member(jsii_name="object")
    def object(self) -> str:
        return jsii.get(self, "object")

    @object.setter
    def object(self, value: str) -> None:
        jsii.set(self, "object", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="predefinedAcl")
    def predefined_acl(self) -> typing.Optional[str]:
        return jsii.get(self, "predefinedAcl")

    @predefined_acl.setter
    def predefined_acl(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "predefinedAcl", value)

    @builtins.property
    @jsii.member(jsii_name="roleEntity")
    def role_entity(self) -> typing.Optional[typing.List[str]]:
        return jsii.get(self, "roleEntity")

    @role_entity.setter
    def role_entity(self, value: typing.Optional[typing.List[str]]) -> None:
        jsii.set(self, "roleEntity", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageObjectAclConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'bucket': 'bucket', 'object': 'object', 'predefined_acl': 'predefinedAcl', 'role_entity': 'roleEntity'})
class StorageObjectAclConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, bucket: str, object: str, predefined_acl: typing.Optional[str]=None, role_entity: typing.Optional[typing.List[str]]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param bucket: 
        :param object: 
        :param predefined_acl: 
        :param role_entity: 
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'bucket': bucket,
            'object': object,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if predefined_acl is not None: self._values["predefined_acl"] = predefined_acl
        if role_entity is not None: self._values["role_entity"] = role_entity

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def bucket(self) -> str:
        return self._values.get('bucket')

    @builtins.property
    def object(self) -> str:
        return self._values.get('object')

    @builtins.property
    def predefined_acl(self) -> typing.Optional[str]:
        return self._values.get('predefined_acl')

    @builtins.property
    def role_entity(self) -> typing.Optional[typing.List[str]]:
        return self._values.get('role_entity')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageObjectAclConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class StorageTransferJob(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.StorageTransferJob"):
    def __init__(self, scope: constructs.Construct, id: str, *, description: str, schedule: typing.List["StorageTransferJobSchedule"], transfer_spec: typing.List["StorageTransferJobTransferSpec"], project: typing.Optional[str]=None, status: typing.Optional[str]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param description: Unique description to identify the Transfer Job.
        :param schedule: schedule block.
        :param transfer_spec: transfer_spec block.
        :param project: The project in which the resource belongs. If it is not provided, the provider project is used.
        :param status: Status of the job. Default: ENABLED. NOTE: The effect of the new job status takes place during a subsequent job run. For example, if you change the job status from ENABLED to DISABLED, and an operation spawned by the transfer is running, the status change would not affect the current operation.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = StorageTransferJobConfig(description=description, schedule=schedule, transfer_spec=transfer_spec, project=project, status=status, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(StorageTransferJob, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="creationTime")
    def creation_time(self) -> str:
        return jsii.get(self, "creationTime")

    @builtins.property
    @jsii.member(jsii_name="deletionTime")
    def deletion_time(self) -> str:
        return jsii.get(self, "deletionTime")

    @builtins.property
    @jsii.member(jsii_name="lastModificationTime")
    def last_modification_time(self) -> str:
        return jsii.get(self, "lastModificationTime")

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> str:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: str) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="schedule")
    def schedule(self) -> typing.List["StorageTransferJobSchedule"]:
        return jsii.get(self, "schedule")

    @schedule.setter
    def schedule(self, value: typing.List["StorageTransferJobSchedule"]) -> None:
        jsii.set(self, "schedule", value)

    @builtins.property
    @jsii.member(jsii_name="transferSpec")
    def transfer_spec(self) -> typing.List["StorageTransferJobTransferSpec"]:
        return jsii.get(self, "transferSpec")

    @transfer_spec.setter
    def transfer_spec(self, value: typing.List["StorageTransferJobTransferSpec"]) -> None:
        jsii.set(self, "transferSpec", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="status")
    def status(self) -> typing.Optional[str]:
        return jsii.get(self, "status")

    @status.setter
    def status(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "status", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'description': 'description', 'schedule': 'schedule', 'transfer_spec': 'transferSpec', 'project': 'project', 'status': 'status'})
class StorageTransferJobConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, description: str, schedule: typing.List["StorageTransferJobSchedule"], transfer_spec: typing.List["StorageTransferJobTransferSpec"], project: typing.Optional[str]=None, status: typing.Optional[str]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param description: Unique description to identify the Transfer Job.
        :param schedule: schedule block.
        :param transfer_spec: transfer_spec block.
        :param project: The project in which the resource belongs. If it is not provided, the provider project is used.
        :param status: Status of the job. Default: ENABLED. NOTE: The effect of the new job status takes place during a subsequent job run. For example, if you change the job status from ENABLED to DISABLED, and an operation spawned by the transfer is running, the status change would not affect the current operation.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        self._values = {
            'description': description,
            'schedule': schedule,
            'transfer_spec': transfer_spec,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if project is not None: self._values["project"] = project
        if status is not None: self._values["status"] = status

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def description(self) -> str:
        """Unique description to identify the Transfer Job."""
        return self._values.get('description')

    @builtins.property
    def schedule(self) -> typing.List["StorageTransferJobSchedule"]:
        """schedule block."""
        return self._values.get('schedule')

    @builtins.property
    def transfer_spec(self) -> typing.List["StorageTransferJobTransferSpec"]:
        """transfer_spec block."""
        return self._values.get('transfer_spec')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        """The project in which the resource belongs.

        If it is not provided, the provider project is used.
        """
        return self._values.get('project')

    @builtins.property
    def status(self) -> typing.Optional[str]:
        """Status of the job.

        Default: ENABLED. NOTE: The effect of the new job status takes place during a subsequent job run. For example, if you change the job status from ENABLED to DISABLED, and an operation spawned by the transfer is running, the status change would not affect the current operation.
        """
        return self._values.get('status')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobSchedule", jsii_struct_bases=[], name_mapping={'schedule_start_date': 'scheduleStartDate', 'schedule_end_date': 'scheduleEndDate', 'start_time_of_day': 'startTimeOfDay'})
class StorageTransferJobSchedule():
    def __init__(self, *, schedule_start_date: typing.List["StorageTransferJobScheduleScheduleStartDate"], schedule_end_date: typing.Optional[typing.List["StorageTransferJobScheduleScheduleEndDate"]]=None, start_time_of_day: typing.Optional[typing.List["StorageTransferJobScheduleStartTimeOfDay"]]=None) -> None:
        """
        :param schedule_start_date: schedule_start_date block.
        :param schedule_end_date: schedule_end_date block.
        :param start_time_of_day: start_time_of_day block.
        """
        self._values = {
            'schedule_start_date': schedule_start_date,
        }
        if schedule_end_date is not None: self._values["schedule_end_date"] = schedule_end_date
        if start_time_of_day is not None: self._values["start_time_of_day"] = start_time_of_day

    @builtins.property
    def schedule_start_date(self) -> typing.List["StorageTransferJobScheduleScheduleStartDate"]:
        """schedule_start_date block."""
        return self._values.get('schedule_start_date')

    @builtins.property
    def schedule_end_date(self) -> typing.Optional[typing.List["StorageTransferJobScheduleScheduleEndDate"]]:
        """schedule_end_date block."""
        return self._values.get('schedule_end_date')

    @builtins.property
    def start_time_of_day(self) -> typing.Optional[typing.List["StorageTransferJobScheduleStartTimeOfDay"]]:
        """start_time_of_day block."""
        return self._values.get('start_time_of_day')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobSchedule(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobScheduleScheduleEndDate", jsii_struct_bases=[], name_mapping={'day': 'day', 'month': 'month', 'year': 'year'})
class StorageTransferJobScheduleScheduleEndDate():
    def __init__(self, *, day: jsii.Number, month: jsii.Number, year: jsii.Number) -> None:
        """
        :param day: Day of month. Must be from 1 to 31 and valid for the year and month.
        :param month: Month of year. Must be from 1 to 12.
        :param year: Year of date. Must be from 1 to 9999.
        """
        self._values = {
            'day': day,
            'month': month,
            'year': year,
        }

    @builtins.property
    def day(self) -> jsii.Number:
        """Day of month.

        Must be from 1 to 31 and valid for the year and month.
        """
        return self._values.get('day')

    @builtins.property
    def month(self) -> jsii.Number:
        """Month of year.

        Must be from 1 to 12.
        """
        return self._values.get('month')

    @builtins.property
    def year(self) -> jsii.Number:
        """Year of date.

        Must be from 1 to 9999.
        """
        return self._values.get('year')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobScheduleScheduleEndDate(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobScheduleScheduleStartDate", jsii_struct_bases=[], name_mapping={'day': 'day', 'month': 'month', 'year': 'year'})
class StorageTransferJobScheduleScheduleStartDate():
    def __init__(self, *, day: jsii.Number, month: jsii.Number, year: jsii.Number) -> None:
        """
        :param day: Day of month. Must be from 1 to 31 and valid for the year and month.
        :param month: Month of year. Must be from 1 to 12.
        :param year: Year of date. Must be from 1 to 9999.
        """
        self._values = {
            'day': day,
            'month': month,
            'year': year,
        }

    @builtins.property
    def day(self) -> jsii.Number:
        """Day of month.

        Must be from 1 to 31 and valid for the year and month.
        """
        return self._values.get('day')

    @builtins.property
    def month(self) -> jsii.Number:
        """Month of year.

        Must be from 1 to 12.
        """
        return self._values.get('month')

    @builtins.property
    def year(self) -> jsii.Number:
        """Year of date.

        Must be from 1 to 9999.
        """
        return self._values.get('year')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobScheduleScheduleStartDate(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobScheduleStartTimeOfDay", jsii_struct_bases=[], name_mapping={'hours': 'hours', 'minutes': 'minutes', 'nanos': 'nanos', 'seconds': 'seconds'})
class StorageTransferJobScheduleStartTimeOfDay():
    def __init__(self, *, hours: jsii.Number, minutes: jsii.Number, nanos: jsii.Number, seconds: jsii.Number) -> None:
        """
        :param hours: Hours of day in 24 hour format. Should be from 0 to 23.
        :param minutes: Minutes of hour of day. Must be from 0 to 59.
        :param nanos: Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.
        :param seconds: Seconds of minutes of the time. Must normally be from 0 to 59.
        """
        self._values = {
            'hours': hours,
            'minutes': minutes,
            'nanos': nanos,
            'seconds': seconds,
        }

    @builtins.property
    def hours(self) -> jsii.Number:
        """Hours of day in 24 hour format.

        Should be from 0 to 23.
        """
        return self._values.get('hours')

    @builtins.property
    def minutes(self) -> jsii.Number:
        """Minutes of hour of day.

        Must be from 0 to 59.
        """
        return self._values.get('minutes')

    @builtins.property
    def nanos(self) -> jsii.Number:
        """Fractions of seconds in nanoseconds.

        Must be from 0 to 999,999,999.
        """
        return self._values.get('nanos')

    @builtins.property
    def seconds(self) -> jsii.Number:
        """Seconds of minutes of the time.

        Must normally be from 0 to 59.
        """
        return self._values.get('seconds')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobScheduleStartTimeOfDay(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobTransferSpec", jsii_struct_bases=[], name_mapping={'aws_s3_data_source': 'awsS3DataSource', 'gcs_data_sink': 'gcsDataSink', 'gcs_data_source': 'gcsDataSource', 'http_data_source': 'httpDataSource', 'object_conditions': 'objectConditions', 'transfer_options': 'transferOptions'})
class StorageTransferJobTransferSpec():
    def __init__(self, *, aws_s3_data_source: typing.Optional[typing.List["StorageTransferJobTransferSpecAwsS3DataSource"]]=None, gcs_data_sink: typing.Optional[typing.List["StorageTransferJobTransferSpecGcsDataSink"]]=None, gcs_data_source: typing.Optional[typing.List["StorageTransferJobTransferSpecGcsDataSource"]]=None, http_data_source: typing.Optional[typing.List["StorageTransferJobTransferSpecHttpDataSource"]]=None, object_conditions: typing.Optional[typing.List["StorageTransferJobTransferSpecObjectConditions"]]=None, transfer_options: typing.Optional[typing.List["StorageTransferJobTransferSpecTransferOptions"]]=None) -> None:
        """
        :param aws_s3_data_source: aws_s3_data_source block.
        :param gcs_data_sink: gcs_data_sink block.
        :param gcs_data_source: gcs_data_source block.
        :param http_data_source: http_data_source block.
        :param object_conditions: object_conditions block.
        :param transfer_options: transfer_options block.
        """
        self._values = {
        }
        if aws_s3_data_source is not None: self._values["aws_s3_data_source"] = aws_s3_data_source
        if gcs_data_sink is not None: self._values["gcs_data_sink"] = gcs_data_sink
        if gcs_data_source is not None: self._values["gcs_data_source"] = gcs_data_source
        if http_data_source is not None: self._values["http_data_source"] = http_data_source
        if object_conditions is not None: self._values["object_conditions"] = object_conditions
        if transfer_options is not None: self._values["transfer_options"] = transfer_options

    @builtins.property
    def aws_s3_data_source(self) -> typing.Optional[typing.List["StorageTransferJobTransferSpecAwsS3DataSource"]]:
        """aws_s3_data_source block."""
        return self._values.get('aws_s3_data_source')

    @builtins.property
    def gcs_data_sink(self) -> typing.Optional[typing.List["StorageTransferJobTransferSpecGcsDataSink"]]:
        """gcs_data_sink block."""
        return self._values.get('gcs_data_sink')

    @builtins.property
    def gcs_data_source(self) -> typing.Optional[typing.List["StorageTransferJobTransferSpecGcsDataSource"]]:
        """gcs_data_source block."""
        return self._values.get('gcs_data_source')

    @builtins.property
    def http_data_source(self) -> typing.Optional[typing.List["StorageTransferJobTransferSpecHttpDataSource"]]:
        """http_data_source block."""
        return self._values.get('http_data_source')

    @builtins.property
    def object_conditions(self) -> typing.Optional[typing.List["StorageTransferJobTransferSpecObjectConditions"]]:
        """object_conditions block."""
        return self._values.get('object_conditions')

    @builtins.property
    def transfer_options(self) -> typing.Optional[typing.List["StorageTransferJobTransferSpecTransferOptions"]]:
        """transfer_options block."""
        return self._values.get('transfer_options')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobTransferSpec(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobTransferSpecAwsS3DataSource", jsii_struct_bases=[], name_mapping={'aws_access_key': 'awsAccessKey', 'bucket_name': 'bucketName'})
class StorageTransferJobTransferSpecAwsS3DataSource():
    def __init__(self, *, aws_access_key: typing.List["StorageTransferJobTransferSpecAwsS3DataSourceAwsAccessKey"], bucket_name: str) -> None:
        """
        :param aws_access_key: aws_access_key block.
        :param bucket_name: S3 Bucket name.
        """
        self._values = {
            'aws_access_key': aws_access_key,
            'bucket_name': bucket_name,
        }

    @builtins.property
    def aws_access_key(self) -> typing.List["StorageTransferJobTransferSpecAwsS3DataSourceAwsAccessKey"]:
        """aws_access_key block."""
        return self._values.get('aws_access_key')

    @builtins.property
    def bucket_name(self) -> str:
        """S3 Bucket name."""
        return self._values.get('bucket_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobTransferSpecAwsS3DataSource(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobTransferSpecAwsS3DataSourceAwsAccessKey", jsii_struct_bases=[], name_mapping={'access_key_id': 'accessKeyId', 'secret_access_key': 'secretAccessKey'})
class StorageTransferJobTransferSpecAwsS3DataSourceAwsAccessKey():
    def __init__(self, *, access_key_id: str, secret_access_key: str) -> None:
        """
        :param access_key_id: AWS Key ID.
        :param secret_access_key: AWS Secret Access Key.
        """
        self._values = {
            'access_key_id': access_key_id,
            'secret_access_key': secret_access_key,
        }

    @builtins.property
    def access_key_id(self) -> str:
        """AWS Key ID."""
        return self._values.get('access_key_id')

    @builtins.property
    def secret_access_key(self) -> str:
        """AWS Secret Access Key."""
        return self._values.get('secret_access_key')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobTransferSpecAwsS3DataSourceAwsAccessKey(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobTransferSpecGcsDataSink", jsii_struct_bases=[], name_mapping={'bucket_name': 'bucketName'})
class StorageTransferJobTransferSpecGcsDataSink():
    def __init__(self, *, bucket_name: str) -> None:
        """
        :param bucket_name: Google Cloud Storage bucket name.
        """
        self._values = {
            'bucket_name': bucket_name,
        }

    @builtins.property
    def bucket_name(self) -> str:
        """Google Cloud Storage bucket name."""
        return self._values.get('bucket_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobTransferSpecGcsDataSink(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobTransferSpecGcsDataSource", jsii_struct_bases=[], name_mapping={'bucket_name': 'bucketName'})
class StorageTransferJobTransferSpecGcsDataSource():
    def __init__(self, *, bucket_name: str) -> None:
        """
        :param bucket_name: Google Cloud Storage bucket name.
        """
        self._values = {
            'bucket_name': bucket_name,
        }

    @builtins.property
    def bucket_name(self) -> str:
        """Google Cloud Storage bucket name."""
        return self._values.get('bucket_name')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobTransferSpecGcsDataSource(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobTransferSpecHttpDataSource", jsii_struct_bases=[], name_mapping={'list_url': 'listUrl'})
class StorageTransferJobTransferSpecHttpDataSource():
    def __init__(self, *, list_url: str) -> None:
        """
        :param list_url: The URL that points to the file that stores the object list entries. This file must allow public access. Currently, only URLs with HTTP and HTTPS schemes are supported.
        """
        self._values = {
            'list_url': list_url,
        }

    @builtins.property
    def list_url(self) -> str:
        """The URL that points to the file that stores the object list entries.

        This file must allow public access. Currently, only URLs with HTTP and HTTPS schemes are supported.
        """
        return self._values.get('list_url')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobTransferSpecHttpDataSource(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobTransferSpecObjectConditions", jsii_struct_bases=[], name_mapping={'exclude_prefixes': 'excludePrefixes', 'include_prefixes': 'includePrefixes', 'max_time_elapsed_since_last_modification': 'maxTimeElapsedSinceLastModification', 'min_time_elapsed_since_last_modification': 'minTimeElapsedSinceLastModification'})
class StorageTransferJobTransferSpecObjectConditions():
    def __init__(self, *, exclude_prefixes: typing.Optional[typing.List[str]]=None, include_prefixes: typing.Optional[typing.List[str]]=None, max_time_elapsed_since_last_modification: typing.Optional[str]=None, min_time_elapsed_since_last_modification: typing.Optional[str]=None) -> None:
        """
        :param exclude_prefixes: exclude_prefixes must follow the requirements described for include_prefixes.
        :param include_prefixes: If include_refixes is specified, objects that satisfy the object conditions must have names that start with one of the include_prefixes and that do not start with any of the exclude_prefixes. If include_prefixes is not specified, all objects except those that have names starting with one of the exclude_prefixes must satisfy the object conditions.
        :param max_time_elapsed_since_last_modification: A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s".
        :param min_time_elapsed_since_last_modification: A duration in seconds with up to nine fractional digits, terminated by 's'. Example: "3.5s".
        """
        self._values = {
        }
        if exclude_prefixes is not None: self._values["exclude_prefixes"] = exclude_prefixes
        if include_prefixes is not None: self._values["include_prefixes"] = include_prefixes
        if max_time_elapsed_since_last_modification is not None: self._values["max_time_elapsed_since_last_modification"] = max_time_elapsed_since_last_modification
        if min_time_elapsed_since_last_modification is not None: self._values["min_time_elapsed_since_last_modification"] = min_time_elapsed_since_last_modification

    @builtins.property
    def exclude_prefixes(self) -> typing.Optional[typing.List[str]]:
        """exclude_prefixes must follow the requirements described for include_prefixes."""
        return self._values.get('exclude_prefixes')

    @builtins.property
    def include_prefixes(self) -> typing.Optional[typing.List[str]]:
        """If include_refixes is specified, objects that satisfy the object conditions must have names that start with one of the include_prefixes and that do not start with any of the exclude_prefixes.

        If include_prefixes is not specified, all objects except those that have names starting with one of the exclude_prefixes must satisfy the object conditions.
        """
        return self._values.get('include_prefixes')

    @builtins.property
    def max_time_elapsed_since_last_modification(self) -> typing.Optional[str]:
        """A duration in seconds with up to nine fractional digits, terminated by 's'.

        Example: "3.5s".
        """
        return self._values.get('max_time_elapsed_since_last_modification')

    @builtins.property
    def min_time_elapsed_since_last_modification(self) -> typing.Optional[str]:
        """A duration in seconds with up to nine fractional digits, terminated by 's'.

        Example: "3.5s".
        """
        return self._values.get('min_time_elapsed_since_last_modification')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobTransferSpecObjectConditions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.StorageTransferJobTransferSpecTransferOptions", jsii_struct_bases=[], name_mapping={'delete_objects_from_source_after_transfer': 'deleteObjectsFromSourceAfterTransfer', 'delete_objects_unique_in_sink': 'deleteObjectsUniqueInSink', 'overwrite_objects_already_existing_in_sink': 'overwriteObjectsAlreadyExistingInSink'})
class StorageTransferJobTransferSpecTransferOptions():
    def __init__(self, *, delete_objects_from_source_after_transfer: typing.Optional[bool]=None, delete_objects_unique_in_sink: typing.Optional[bool]=None, overwrite_objects_already_existing_in_sink: typing.Optional[bool]=None) -> None:
        """
        :param delete_objects_from_source_after_transfer: Whether objects should be deleted from the source after they are transferred to the sink. Note that this option and delete_objects_unique_in_sink are mutually exclusive.
        :param delete_objects_unique_in_sink: Whether objects that exist only in the sink should be deleted. Note that this option and delete_objects_from_source_after_transfer are mutually exclusive.
        :param overwrite_objects_already_existing_in_sink: Whether overwriting objects that already exist in the sink is allowed.
        """
        self._values = {
        }
        if delete_objects_from_source_after_transfer is not None: self._values["delete_objects_from_source_after_transfer"] = delete_objects_from_source_after_transfer
        if delete_objects_unique_in_sink is not None: self._values["delete_objects_unique_in_sink"] = delete_objects_unique_in_sink
        if overwrite_objects_already_existing_in_sink is not None: self._values["overwrite_objects_already_existing_in_sink"] = overwrite_objects_already_existing_in_sink

    @builtins.property
    def delete_objects_from_source_after_transfer(self) -> typing.Optional[bool]:
        """Whether objects should be deleted from the source after they are transferred to the sink.

        Note that this option and delete_objects_unique_in_sink are mutually exclusive.
        """
        return self._values.get('delete_objects_from_source_after_transfer')

    @builtins.property
    def delete_objects_unique_in_sink(self) -> typing.Optional[bool]:
        """Whether objects that exist only in the sink should be deleted.

        Note that this option and delete_objects_from_source_after_transfer are mutually exclusive.
        """
        return self._values.get('delete_objects_unique_in_sink')

    @builtins.property
    def overwrite_objects_already_existing_in_sink(self) -> typing.Optional[bool]:
        """Whether overwriting objects that already exist in the sink is allowed."""
        return self._values.get('overwrite_objects_already_existing_in_sink')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'StorageTransferJobTransferSpecTransferOptions(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class TpuNode(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.TpuNode"):
    def __init__(self, scope: constructs.Construct, id: str, *, accelerator_type: str, cidr_block: str, name: str, tensorflow_version: str, zone: str, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, network: typing.Optional[str]=None, project: typing.Optional[str]=None, scheduling_config: typing.Optional[typing.List["TpuNodeSchedulingConfig"]]=None, timeouts: typing.Optional["TpuNodeTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param accelerator_type: The type of hardware accelerators associated with this node.
        :param cidr_block: The CIDR block that the TPU node will use when selecting an IP address. This CIDR block must be a /29 block; the Compute Engine networks API forbids a smaller block, and using a larger block would be wasteful (a node can only consume one IP address). Errors will occur if the CIDR block has already been used for a currently existing TPU node, the CIDR block conflicts with any subnetworks in the user's provided network, or the provided network is peered with another network that is using that CIDR block.
        :param name: The immutable name of the TPU.
        :param tensorflow_version: The version of Tensorflow running in the Node.
        :param zone: The GCP location for the TPU.
        :param description: The user-supplied description of the TPU. Maximum of 512 characters.
        :param labels: Resource labels to represent user provided metadata.
        :param network: The name of a network to peer the TPU node to. It must be a preexisting Compute Engine network inside of the project on which this API has been activated. If none is provided, "default" will be used.
        :param project: 
        :param scheduling_config: scheduling_config block.
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = TpuNodeConfig(accelerator_type=accelerator_type, cidr_block=cidr_block, name=name, tensorflow_version=tensorflow_version, zone=zone, description=description, labels=labels, network=network, project=project, scheduling_config=scheduling_config, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(TpuNode, self, [scope, id, config])

    @jsii.member(jsii_name="networkEndpoints")
    def network_endpoints(self, index: str) -> "TpuNodeNetworkEndpoints":
        """
        :param index: -
        """
        return jsii.invoke(self, "networkEndpoints", [index])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="serviceAccount")
    def service_account(self) -> str:
        return jsii.get(self, "serviceAccount")

    @builtins.property
    @jsii.member(jsii_name="acceleratorType")
    def accelerator_type(self) -> str:
        return jsii.get(self, "acceleratorType")

    @accelerator_type.setter
    def accelerator_type(self, value: str) -> None:
        jsii.set(self, "acceleratorType", value)

    @builtins.property
    @jsii.member(jsii_name="cidrBlock")
    def cidr_block(self) -> str:
        return jsii.get(self, "cidrBlock")

    @cidr_block.setter
    def cidr_block(self, value: str) -> None:
        jsii.set(self, "cidrBlock", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="tensorflowVersion")
    def tensorflow_version(self) -> str:
        return jsii.get(self, "tensorflowVersion")

    @tensorflow_version.setter
    def tensorflow_version(self, value: str) -> None:
        jsii.set(self, "tensorflowVersion", value)

    @builtins.property
    @jsii.member(jsii_name="zone")
    def zone(self) -> str:
        return jsii.get(self, "zone")

    @zone.setter
    def zone(self, value: str) -> None:
        jsii.set(self, "zone", value)

    @builtins.property
    @jsii.member(jsii_name="description")
    def description(self) -> typing.Optional[str]:
        return jsii.get(self, "description")

    @description.setter
    def description(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "description", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="labels")
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        return jsii.get(self, "labels")

    @labels.setter
    def labels(self, value: typing.Optional[typing.Mapping[str, str]]) -> None:
        jsii.set(self, "labels", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> typing.Optional[str]:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="schedulingConfig")
    def scheduling_config(self) -> typing.Optional[typing.List["TpuNodeSchedulingConfig"]]:
        return jsii.get(self, "schedulingConfig")

    @scheduling_config.setter
    def scheduling_config(self, value: typing.Optional[typing.List["TpuNodeSchedulingConfig"]]) -> None:
        jsii.set(self, "schedulingConfig", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["TpuNodeTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["TpuNodeTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.TpuNodeConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'accelerator_type': 'acceleratorType', 'cidr_block': 'cidrBlock', 'name': 'name', 'tensorflow_version': 'tensorflowVersion', 'zone': 'zone', 'description': 'description', 'labels': 'labels', 'network': 'network', 'project': 'project', 'scheduling_config': 'schedulingConfig', 'timeouts': 'timeouts'})
class TpuNodeConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, accelerator_type: str, cidr_block: str, name: str, tensorflow_version: str, zone: str, description: typing.Optional[str]=None, labels: typing.Optional[typing.Mapping[str, str]]=None, network: typing.Optional[str]=None, project: typing.Optional[str]=None, scheduling_config: typing.Optional[typing.List["TpuNodeSchedulingConfig"]]=None, timeouts: typing.Optional["TpuNodeTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param accelerator_type: The type of hardware accelerators associated with this node.
        :param cidr_block: The CIDR block that the TPU node will use when selecting an IP address. This CIDR block must be a /29 block; the Compute Engine networks API forbids a smaller block, and using a larger block would be wasteful (a node can only consume one IP address). Errors will occur if the CIDR block has already been used for a currently existing TPU node, the CIDR block conflicts with any subnetworks in the user's provided network, or the provided network is peered with another network that is using that CIDR block.
        :param name: The immutable name of the TPU.
        :param tensorflow_version: The version of Tensorflow running in the Node.
        :param zone: The GCP location for the TPU.
        :param description: The user-supplied description of the TPU. Maximum of 512 characters.
        :param labels: Resource labels to represent user provided metadata.
        :param network: The name of a network to peer the TPU node to. It must be a preexisting Compute Engine network inside of the project on which this API has been activated. If none is provided, "default" will be used.
        :param project: 
        :param scheduling_config: scheduling_config block.
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = TpuNodeTimeouts(**timeouts)
        self._values = {
            'accelerator_type': accelerator_type,
            'cidr_block': cidr_block,
            'name': name,
            'tensorflow_version': tensorflow_version,
            'zone': zone,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if description is not None: self._values["description"] = description
        if labels is not None: self._values["labels"] = labels
        if network is not None: self._values["network"] = network
        if project is not None: self._values["project"] = project
        if scheduling_config is not None: self._values["scheduling_config"] = scheduling_config
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def accelerator_type(self) -> str:
        """The type of hardware accelerators associated with this node."""
        return self._values.get('accelerator_type')

    @builtins.property
    def cidr_block(self) -> str:
        """The CIDR block that the TPU node will use when selecting an IP address.

        This CIDR block must be a /29 block; the Compute Engine
        networks API forbids a smaller block, and using a larger block would
        be wasteful (a node can only consume one IP address).

        Errors will occur if the CIDR block has already been used for a
        currently existing TPU node, the CIDR block conflicts with any
        subnetworks in the user's provided network, or the provided network
        is peered with another network that is using that CIDR block.
        """
        return self._values.get('cidr_block')

    @builtins.property
    def name(self) -> str:
        """The immutable name of the TPU."""
        return self._values.get('name')

    @builtins.property
    def tensorflow_version(self) -> str:
        """The version of Tensorflow running in the Node."""
        return self._values.get('tensorflow_version')

    @builtins.property
    def zone(self) -> str:
        """The GCP location for the TPU."""
        return self._values.get('zone')

    @builtins.property
    def description(self) -> typing.Optional[str]:
        """The user-supplied description of the TPU.

        Maximum of 512 characters.
        """
        return self._values.get('description')

    @builtins.property
    def labels(self) -> typing.Optional[typing.Mapping[str, str]]:
        """Resource labels to represent user provided metadata."""
        return self._values.get('labels')

    @builtins.property
    def network(self) -> typing.Optional[str]:
        """The name of a network to peer the TPU node to.

        It must be a
        preexisting Compute Engine network inside of the project on which
        this API has been activated. If none is provided, "default" will be
        used.
        """
        return self._values.get('network')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def scheduling_config(self) -> typing.Optional[typing.List["TpuNodeSchedulingConfig"]]:
        """scheduling_config block."""
        return self._values.get('scheduling_config')

    @builtins.property
    def timeouts(self) -> typing.Optional["TpuNodeTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'TpuNodeConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class TpuNodeNetworkEndpoints(cdktf.ComplexComputedList, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.TpuNodeNetworkEndpoints"):
    def __init__(self, terraform_resource: cdktf.ITerraformResource, terraform_attribute: str, index: str) -> None:
        """
        :param terraform_resource: -
        :param terraform_attribute: -
        :param index: -

        stability
        :stability: experimental
        """
        jsii.create(TpuNodeNetworkEndpoints, self, [terraform_resource, terraform_attribute, index])

    @builtins.property
    @jsii.member(jsii_name="ipAddress")
    def ip_address(self) -> str:
        return jsii.get(self, "ipAddress")

    @builtins.property
    @jsii.member(jsii_name="port")
    def port(self) -> jsii.Number:
        return jsii.get(self, "port")


@jsii.data_type(jsii_type="@cdktf/provider-google.TpuNodeSchedulingConfig", jsii_struct_bases=[], name_mapping={'preemptible': 'preemptible'})
class TpuNodeSchedulingConfig():
    def __init__(self, *, preemptible: bool) -> None:
        """
        :param preemptible: Defines whether the TPU instance is preemptible.
        """
        self._values = {
            'preemptible': preemptible,
        }

    @builtins.property
    def preemptible(self) -> bool:
        """Defines whether the TPU instance is preemptible."""
        return self._values.get('preemptible')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'TpuNodeSchedulingConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.TpuNodeTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete', 'update': 'update'})
class TpuNodeTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None, update: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        :param update: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete
        if update is not None: self._values["update"] = update

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    @builtins.property
    def update(self) -> typing.Optional[str]:
        return self._values.get('update')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'TpuNodeTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


class VpcAccessConnector(cdktf.TerraformResource, metaclass=jsii.JSIIMeta, jsii_type="@cdktf/provider-google.VpcAccessConnector"):
    def __init__(self, scope: constructs.Construct, id: str, *, ip_cidr_range: str, name: str, network: str, region: str, max_throughput: typing.Optional[jsii.Number]=None, min_throughput: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["VpcAccessConnectorTimeouts"]=None, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None) -> None:
        """
        :param scope: -
        :param id: -
        :param ip_cidr_range: The range of internal addresses that follows RFC 4632 notation. Example: '10.132.0.0/28'.
        :param name: The name of the resource (Max 25 characters).
        :param network: Name of a VPC network.
        :param region: Region where the VPC Access connector resides.
        :param max_throughput: Maximum throughput of the connector in Mbps, must be greater than 'min_throughput'. Default is 1000.
        :param min_throughput: Minimum throughput of the connector in Mbps. Default and min is 200.
        :param project: 
        :param timeouts: timeouts block.
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        """
        config = VpcAccessConnectorConfig(ip_cidr_range=ip_cidr_range, name=name, network=network, region=region, max_throughput=max_throughput, min_throughput=min_throughput, project=project, timeouts=timeouts, count=count, depends_on=depends_on, lifecycle=lifecycle, provider=provider)

        jsii.create(VpcAccessConnector, self, [scope, id, config])

    @jsii.member(jsii_name="synthesizeAttributes")
    def synthesize_attributes(self) -> typing.Mapping[str, typing.Any]:
        return jsii.invoke(self, "synthesizeAttributes", [])

    @builtins.property
    @jsii.member(jsii_name="selfLink")
    def self_link(self) -> str:
        return jsii.get(self, "selfLink")

    @builtins.property
    @jsii.member(jsii_name="state")
    def state(self) -> str:
        return jsii.get(self, "state")

    @builtins.property
    @jsii.member(jsii_name="ipCidrRange")
    def ip_cidr_range(self) -> str:
        return jsii.get(self, "ipCidrRange")

    @ip_cidr_range.setter
    def ip_cidr_range(self, value: str) -> None:
        jsii.set(self, "ipCidrRange", value)

    @builtins.property
    @jsii.member(jsii_name="name")
    def name(self) -> str:
        return jsii.get(self, "name")

    @name.setter
    def name(self, value: str) -> None:
        jsii.set(self, "name", value)

    @builtins.property
    @jsii.member(jsii_name="network")
    def network(self) -> str:
        return jsii.get(self, "network")

    @network.setter
    def network(self, value: str) -> None:
        jsii.set(self, "network", value)

    @builtins.property
    @jsii.member(jsii_name="region")
    def region(self) -> str:
        return jsii.get(self, "region")

    @region.setter
    def region(self, value: str) -> None:
        jsii.set(self, "region", value)

    @builtins.property
    @jsii.member(jsii_name="id")
    def id(self) -> typing.Optional[str]:
        return jsii.get(self, "id")

    @id.setter
    def id(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "id", value)

    @builtins.property
    @jsii.member(jsii_name="maxThroughput")
    def max_throughput(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "maxThroughput")

    @max_throughput.setter
    def max_throughput(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "maxThroughput", value)

    @builtins.property
    @jsii.member(jsii_name="minThroughput")
    def min_throughput(self) -> typing.Optional[jsii.Number]:
        return jsii.get(self, "minThroughput")

    @min_throughput.setter
    def min_throughput(self, value: typing.Optional[jsii.Number]) -> None:
        jsii.set(self, "minThroughput", value)

    @builtins.property
    @jsii.member(jsii_name="project")
    def project(self) -> typing.Optional[str]:
        return jsii.get(self, "project")

    @project.setter
    def project(self, value: typing.Optional[str]) -> None:
        jsii.set(self, "project", value)

    @builtins.property
    @jsii.member(jsii_name="timeouts")
    def timeouts(self) -> typing.Optional["VpcAccessConnectorTimeouts"]:
        return jsii.get(self, "timeouts")

    @timeouts.setter
    def timeouts(self, value: typing.Optional["VpcAccessConnectorTimeouts"]) -> None:
        jsii.set(self, "timeouts", value)


@jsii.data_type(jsii_type="@cdktf/provider-google.VpcAccessConnectorConfig", jsii_struct_bases=[cdktf.TerraformMetaArguments], name_mapping={'count': 'count', 'depends_on': 'dependsOn', 'lifecycle': 'lifecycle', 'provider': 'provider', 'ip_cidr_range': 'ipCidrRange', 'name': 'name', 'network': 'network', 'region': 'region', 'max_throughput': 'maxThroughput', 'min_throughput': 'minThroughput', 'project': 'project', 'timeouts': 'timeouts'})
class VpcAccessConnectorConfig(cdktf.TerraformMetaArguments):
    def __init__(self, *, count: typing.Optional[jsii.Number]=None, depends_on: typing.Optional[typing.List[cdktf.TerraformResource]]=None, lifecycle: typing.Optional[cdktf.TerraformResourceLifecycle]=None, provider: typing.Optional[cdktf.TerraformProvider]=None, ip_cidr_range: str, name: str, network: str, region: str, max_throughput: typing.Optional[jsii.Number]=None, min_throughput: typing.Optional[jsii.Number]=None, project: typing.Optional[str]=None, timeouts: typing.Optional["VpcAccessConnectorTimeouts"]=None) -> None:
        """
        :param count: 
        :param depends_on: 
        :param lifecycle: 
        :param provider: 
        :param ip_cidr_range: The range of internal addresses that follows RFC 4632 notation. Example: '10.132.0.0/28'.
        :param name: The name of the resource (Max 25 characters).
        :param network: Name of a VPC network.
        :param region: Region where the VPC Access connector resides.
        :param max_throughput: Maximum throughput of the connector in Mbps, must be greater than 'min_throughput'. Default is 1000.
        :param min_throughput: Minimum throughput of the connector in Mbps. Default and min is 200.
        :param project: 
        :param timeouts: timeouts block.
        """
        if isinstance(lifecycle, dict): lifecycle = cdktf.TerraformResourceLifecycle(**lifecycle)
        if isinstance(timeouts, dict): timeouts = VpcAccessConnectorTimeouts(**timeouts)
        self._values = {
            'ip_cidr_range': ip_cidr_range,
            'name': name,
            'network': network,
            'region': region,
        }
        if count is not None: self._values["count"] = count
        if depends_on is not None: self._values["depends_on"] = depends_on
        if lifecycle is not None: self._values["lifecycle"] = lifecycle
        if provider is not None: self._values["provider"] = provider
        if max_throughput is not None: self._values["max_throughput"] = max_throughput
        if min_throughput is not None: self._values["min_throughput"] = min_throughput
        if project is not None: self._values["project"] = project
        if timeouts is not None: self._values["timeouts"] = timeouts

    @builtins.property
    def count(self) -> typing.Optional[jsii.Number]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('count')

    @builtins.property
    def depends_on(self) -> typing.Optional[typing.List[cdktf.TerraformResource]]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('depends_on')

    @builtins.property
    def lifecycle(self) -> typing.Optional[cdktf.TerraformResourceLifecycle]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('lifecycle')

    @builtins.property
    def provider(self) -> typing.Optional[cdktf.TerraformProvider]:
        """
        stability
        :stability: experimental
        """
        return self._values.get('provider')

    @builtins.property
    def ip_cidr_range(self) -> str:
        """The range of internal addresses that follows RFC 4632 notation.

        Example: '10.132.0.0/28'.
        """
        return self._values.get('ip_cidr_range')

    @builtins.property
    def name(self) -> str:
        """The name of the resource (Max 25 characters)."""
        return self._values.get('name')

    @builtins.property
    def network(self) -> str:
        """Name of a VPC network."""
        return self._values.get('network')

    @builtins.property
    def region(self) -> str:
        """Region where the VPC Access connector resides."""
        return self._values.get('region')

    @builtins.property
    def max_throughput(self) -> typing.Optional[jsii.Number]:
        """Maximum throughput of the connector in Mbps, must be greater than 'min_throughput'.

        Default is 1000.
        """
        return self._values.get('max_throughput')

    @builtins.property
    def min_throughput(self) -> typing.Optional[jsii.Number]:
        """Minimum throughput of the connector in Mbps.

        Default and min is 200.
        """
        return self._values.get('min_throughput')

    @builtins.property
    def project(self) -> typing.Optional[str]:
        return self._values.get('project')

    @builtins.property
    def timeouts(self) -> typing.Optional["VpcAccessConnectorTimeouts"]:
        """timeouts block."""
        return self._values.get('timeouts')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'VpcAccessConnectorConfig(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


@jsii.data_type(jsii_type="@cdktf/provider-google.VpcAccessConnectorTimeouts", jsii_struct_bases=[], name_mapping={'create': 'create', 'delete': 'delete'})
class VpcAccessConnectorTimeouts():
    def __init__(self, *, create: typing.Optional[str]=None, delete: typing.Optional[str]=None) -> None:
        """
        :param create: 
        :param delete: 
        """
        self._values = {
        }
        if create is not None: self._values["create"] = create
        if delete is not None: self._values["delete"] = delete

    @builtins.property
    def create(self) -> typing.Optional[str]:
        return self._values.get('create')

    @builtins.property
    def delete(self) -> typing.Optional[str]:
        return self._values.get('delete')

    def __eq__(self, rhs) -> bool:
        return isinstance(rhs, self.__class__) and rhs._values == self._values

    def __ne__(self, rhs) -> bool:
        return not (rhs == self)

    def __repr__(self) -> str:
        return 'VpcAccessConnectorTimeouts(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items())


__all__ = [
    "AccessContextManagerAccessLevel",
    "AccessContextManagerAccessLevelBasic",
    "AccessContextManagerAccessLevelBasicConditions",
    "AccessContextManagerAccessLevelBasicConditionsDevicePolicy",
    "AccessContextManagerAccessLevelBasicConditionsDevicePolicyOsConstraints",
    "AccessContextManagerAccessLevelConfig",
    "AccessContextManagerAccessLevelCustom",
    "AccessContextManagerAccessLevelCustomExpr",
    "AccessContextManagerAccessLevelTimeouts",
    "AccessContextManagerAccessPolicy",
    "AccessContextManagerAccessPolicyConfig",
    "AccessContextManagerAccessPolicyTimeouts",
    "AccessContextManagerServicePerimeter",
    "AccessContextManagerServicePerimeterConfig",
    "AccessContextManagerServicePerimeterResource",
    "AccessContextManagerServicePerimeterResourceConfig",
    "AccessContextManagerServicePerimeterResourceTimeouts",
    "AccessContextManagerServicePerimeterSpec",
    "AccessContextManagerServicePerimeterSpecVpcAccessibleServices",
    "AccessContextManagerServicePerimeterStatus",
    "AccessContextManagerServicePerimeterStatusVpcAccessibleServices",
    "AccessContextManagerServicePerimeterTimeouts",
    "ActiveDirectoryDomain",
    "ActiveDirectoryDomainConfig",
    "ActiveDirectoryDomainTimeouts",
    "AppEngineApplication",
    "AppEngineApplicationConfig",
    "AppEngineApplicationFeatureSettings",
    "AppEngineApplicationIap",
    "AppEngineApplicationTimeouts",
    "AppEngineApplicationUrlDispatchRule",
    "AppEngineApplicationUrlDispatchRules",
    "AppEngineApplicationUrlDispatchRulesConfig",
    "AppEngineApplicationUrlDispatchRulesDispatchRules",
    "AppEngineApplicationUrlDispatchRulesTimeouts",
    "AppEngineDomainMapping",
    "AppEngineDomainMappingConfig",
    "AppEngineDomainMappingResourceRecords",
    "AppEngineDomainMappingSslSettings",
    "AppEngineDomainMappingTimeouts",
    "AppEngineFirewallRule",
    "AppEngineFirewallRuleConfig",
    "AppEngineFirewallRuleTimeouts",
    "AppEngineFlexibleAppVersion",
    "AppEngineFlexibleAppVersionApiConfig",
    "AppEngineFlexibleAppVersionAutomaticScaling",
    "AppEngineFlexibleAppVersionAutomaticScalingCpuUtilization",
    "AppEngineFlexibleAppVersionAutomaticScalingDiskUtilization",
    "AppEngineFlexibleAppVersionAutomaticScalingNetworkUtilization",
    "AppEngineFlexibleAppVersionAutomaticScalingRequestUtilization",
    "AppEngineFlexibleAppVersionConfig",
    "AppEngineFlexibleAppVersionDeployment",
    "AppEngineFlexibleAppVersionDeploymentCloudBuildOptions",
    "AppEngineFlexibleAppVersionDeploymentContainer",
    "AppEngineFlexibleAppVersionDeploymentFiles",
    "AppEngineFlexibleAppVersionDeploymentZip",
    "AppEngineFlexibleAppVersionEndpointsApiService",
    "AppEngineFlexibleAppVersionEntrypoint",
    "AppEngineFlexibleAppVersionHandlers",
    "AppEngineFlexibleAppVersionHandlersScript",
    "AppEngineFlexibleAppVersionHandlersStaticFiles",
    "AppEngineFlexibleAppVersionLivenessCheck",
    "AppEngineFlexibleAppVersionManualScaling",
    "AppEngineFlexibleAppVersionNetwork",
    "AppEngineFlexibleAppVersionReadinessCheck",
    "AppEngineFlexibleAppVersionResources",
    "AppEngineFlexibleAppVersionResourcesVolumes",
    "AppEngineFlexibleAppVersionTimeouts",
    "AppEngineFlexibleAppVersionVpcAccessConnector",
    "AppEngineServiceSplitTraffic",
    "AppEngineServiceSplitTrafficConfig",
    "AppEngineServiceSplitTrafficSplit",
    "AppEngineServiceSplitTrafficTimeouts",
    "AppEngineStandardAppVersion",
    "AppEngineStandardAppVersionAutomaticScaling",
    "AppEngineStandardAppVersionAutomaticScalingStandardSchedulerSettings",
    "AppEngineStandardAppVersionBasicScaling",
    "AppEngineStandardAppVersionConfig",
    "AppEngineStandardAppVersionDeployment",
    "AppEngineStandardAppVersionDeploymentFiles",
    "AppEngineStandardAppVersionDeploymentZip",
    "AppEngineStandardAppVersionEntrypoint",
    "AppEngineStandardAppVersionHandlers",
    "AppEngineStandardAppVersionHandlersScript",
    "AppEngineStandardAppVersionHandlersStaticFiles",
    "AppEngineStandardAppVersionLibraries",
    "AppEngineStandardAppVersionManualScaling",
    "AppEngineStandardAppVersionTimeouts",
    "BigqueryDataTransferConfig",
    "BigqueryDataTransferConfigConfig",
    "BigqueryDataTransferConfigTimeouts",
    "BigqueryDataset",
    "BigqueryDatasetAccess",
    "BigqueryDatasetAccessA",
    "BigqueryDatasetAccessAConfig",
    "BigqueryDatasetAccessTimeouts",
    "BigqueryDatasetAccessView",
    "BigqueryDatasetAccessViewA",
    "BigqueryDatasetConfig",
    "BigqueryDatasetDefaultEncryptionConfiguration",
    "BigqueryDatasetIamBinding",
    "BigqueryDatasetIamBindingCondition",
    "BigqueryDatasetIamBindingConfig",
    "BigqueryDatasetIamMember",
    "BigqueryDatasetIamMemberCondition",
    "BigqueryDatasetIamMemberConfig",
    "BigqueryDatasetIamPolicy",
    "BigqueryDatasetIamPolicyConfig",
    "BigqueryDatasetTimeouts",
    "BigqueryJob",
    "BigqueryJobConfig",
    "BigqueryJobCopy",
    "BigqueryJobCopyDestinationEncryptionConfiguration",
    "BigqueryJobCopyDestinationTable",
    "BigqueryJobCopySourceTables",
    "BigqueryJobExtract",
    "BigqueryJobExtractSourceModel",
    "BigqueryJobExtractSourceTable",
    "BigqueryJobLoad",
    "BigqueryJobLoadDestinationEncryptionConfiguration",
    "BigqueryJobLoadDestinationTable",
    "BigqueryJobLoadTimePartitioning",
    "BigqueryJobQuery",
    "BigqueryJobQueryDefaultDataset",
    "BigqueryJobQueryDestinationEncryptionConfiguration",
    "BigqueryJobQueryDestinationTable",
    "BigqueryJobQueryScriptOptions",
    "BigqueryJobQueryUserDefinedFunctionResources",
    "BigqueryJobTimeouts",
    "BigqueryTable",
    "BigqueryTableConfig",
    "BigqueryTableEncryptionConfiguration",
    "BigqueryTableExternalDataConfiguration",
    "BigqueryTableExternalDataConfigurationCsvOptions",
    "BigqueryTableExternalDataConfigurationGoogleSheetsOptions",
    "BigqueryTableExternalDataConfigurationHivePartitioningOptions",
    "BigqueryTableRangePartitioning",
    "BigqueryTableRangePartitioningRange",
    "BigqueryTableTimePartitioning",
    "BigqueryTableView",
    "BigtableAppProfile",
    "BigtableAppProfileConfig",
    "BigtableAppProfileSingleClusterRouting",
    "BigtableAppProfileTimeouts",
    "BigtableGcPolicy",
    "BigtableGcPolicyConfig",
    "BigtableGcPolicyMaxAge",
    "BigtableGcPolicyMaxVersion",
    "BigtableInstance",
    "BigtableInstanceCluster",
    "BigtableInstanceConfig",
    "BigtableInstanceIamBinding",
    "BigtableInstanceIamBindingCondition",
    "BigtableInstanceIamBindingConfig",
    "BigtableInstanceIamMember",
    "BigtableInstanceIamMemberCondition",
    "BigtableInstanceIamMemberConfig",
    "BigtableInstanceIamPolicy",
    "BigtableInstanceIamPolicyConfig",
    "BigtableTable",
    "BigtableTableColumnFamily",
    "BigtableTableConfig",
    "BillingAccountIamBinding",
    "BillingAccountIamBindingCondition",
    "BillingAccountIamBindingConfig",
    "BillingAccountIamMember",
    "BillingAccountIamMemberCondition",
    "BillingAccountIamMemberConfig",
    "BillingAccountIamPolicy",
    "BillingAccountIamPolicyConfig",
    "BinaryAuthorizationAttestor",
    "BinaryAuthorizationAttestorAttestationAuthorityNote",
    "BinaryAuthorizationAttestorAttestationAuthorityNotePublicKeys",
    "BinaryAuthorizationAttestorAttestationAuthorityNotePublicKeysPkixPublicKey",
    "BinaryAuthorizationAttestorConfig",
    "BinaryAuthorizationAttestorIamBinding",
    "BinaryAuthorizationAttestorIamBindingCondition",
    "BinaryAuthorizationAttestorIamBindingConfig",
    "BinaryAuthorizationAttestorIamMember",
    "BinaryAuthorizationAttestorIamMemberCondition",
    "BinaryAuthorizationAttestorIamMemberConfig",
    "BinaryAuthorizationAttestorIamPolicy",
    "BinaryAuthorizationAttestorIamPolicyConfig",
    "BinaryAuthorizationAttestorTimeouts",
    "BinaryAuthorizationPolicy",
    "BinaryAuthorizationPolicyAdmissionWhitelistPatterns",
    "BinaryAuthorizationPolicyClusterAdmissionRules",
    "BinaryAuthorizationPolicyConfig",
    "BinaryAuthorizationPolicyDefaultAdmissionRule",
    "BinaryAuthorizationPolicyTimeouts",
    "CloudAssetFolderFeed",
    "CloudAssetFolderFeedConfig",
    "CloudAssetFolderFeedFeedOutputConfig",
    "CloudAssetFolderFeedFeedOutputConfigPubsubDestination",
    "CloudAssetFolderFeedTimeouts",
    "CloudAssetOrganizationFeed",
    "CloudAssetOrganizationFeedConfig",
    "CloudAssetOrganizationFeedFeedOutputConfig",
    "CloudAssetOrganizationFeedFeedOutputConfigPubsubDestination",
    "CloudAssetOrganizationFeedTimeouts",
    "CloudAssetProjectFeed",
    "CloudAssetProjectFeedConfig",
    "CloudAssetProjectFeedFeedOutputConfig",
    "CloudAssetProjectFeedFeedOutputConfigPubsubDestination",
    "CloudAssetProjectFeedTimeouts",
    "CloudRunDomainMapping",
    "CloudRunDomainMappingConfig",
    "CloudRunDomainMappingMetadata",
    "CloudRunDomainMappingSpec",
    "CloudRunDomainMappingStatus",
    "CloudRunDomainMappingStatusConditions",
    "CloudRunDomainMappingStatusResourceRecords",
    "CloudRunDomainMappingTimeouts",
    "CloudRunService",
    "CloudRunServiceConfig",
    "CloudRunServiceIamBinding",
    "CloudRunServiceIamBindingCondition",
    "CloudRunServiceIamBindingConfig",
    "CloudRunServiceIamMember",
    "CloudRunServiceIamMemberCondition",
    "CloudRunServiceIamMemberConfig",
    "CloudRunServiceIamPolicy",
    "CloudRunServiceIamPolicyConfig",
    "CloudRunServiceMetadata",
    "CloudRunServiceStatus",
    "CloudRunServiceStatusConditions",
    "CloudRunServiceTemplate",
    "CloudRunServiceTemplateMetadata",
    "CloudRunServiceTemplateSpec",
    "CloudRunServiceTemplateSpecContainers",
    "CloudRunServiceTemplateSpecContainersEnv",
    "CloudRunServiceTemplateSpecContainersEnvFrom",
    "CloudRunServiceTemplateSpecContainersEnvFromConfigMapRef",
    "CloudRunServiceTemplateSpecContainersEnvFromConfigMapRefLocalObjectReference",
    "CloudRunServiceTemplateSpecContainersEnvFromSecretRef",
    "CloudRunServiceTemplateSpecContainersEnvFromSecretRefLocalObjectReference",
    "CloudRunServiceTemplateSpecContainersPorts",
    "CloudRunServiceTemplateSpecContainersResources",
    "CloudRunServiceTimeouts",
    "CloudRunServiceTraffic",
    "CloudSchedulerJob",
    "CloudSchedulerJobAppEngineHttpTarget",
    "CloudSchedulerJobAppEngineHttpTargetAppEngineRouting",
    "CloudSchedulerJobConfig",
    "CloudSchedulerJobHttpTarget",
    "CloudSchedulerJobHttpTargetOauthToken",
    "CloudSchedulerJobHttpTargetOidcToken",
    "CloudSchedulerJobPubsubTarget",
    "CloudSchedulerJobRetryConfig",
    "CloudSchedulerJobTimeouts",
    "CloudTasksQueue",
    "CloudTasksQueueAppEngineRoutingOverride",
    "CloudTasksQueueConfig",
    "CloudTasksQueueRateLimits",
    "CloudTasksQueueRetryConfig",
    "CloudTasksQueueTimeouts",
    "CloudbuildTrigger",
    "CloudbuildTriggerBuild",
    "CloudbuildTriggerBuildSecret",
    "CloudbuildTriggerBuildSource",
    "CloudbuildTriggerBuildSourceRepoSource",
    "CloudbuildTriggerBuildSourceStorageSource",
    "CloudbuildTriggerBuildStep",
    "CloudbuildTriggerBuildStepVolumes",
    "CloudbuildTriggerConfig",
    "CloudbuildTriggerTimeouts",
    "CloudbuildTriggerTriggerTemplate",
    "CloudfunctionsFunction",
    "CloudfunctionsFunctionConfig",
    "CloudfunctionsFunctionEventTrigger",
    "CloudfunctionsFunctionEventTriggerFailurePolicy",
    "CloudfunctionsFunctionIamBinding",
    "CloudfunctionsFunctionIamBindingCondition",
    "CloudfunctionsFunctionIamBindingConfig",
    "CloudfunctionsFunctionIamMember",
    "CloudfunctionsFunctionIamMemberCondition",
    "CloudfunctionsFunctionIamMemberConfig",
    "CloudfunctionsFunctionIamPolicy",
    "CloudfunctionsFunctionIamPolicyConfig",
    "CloudfunctionsFunctionSourceRepository",
    "CloudfunctionsFunctionTimeouts",
    "CloudiotDevice",
    "CloudiotDeviceConfig",
    "CloudiotDeviceConfigA",
    "CloudiotDeviceCredentials",
    "CloudiotDeviceCredentialsPublicKey",
    "CloudiotDeviceGatewayConfig",
    "CloudiotDeviceLastErrorStatus",
    "CloudiotDeviceState",
    "CloudiotDeviceTimeouts",
    "CloudiotRegistry",
    "CloudiotRegistryConfig",
    "CloudiotRegistryCredentials",
    "CloudiotRegistryEventNotificationConfigs",
    "CloudiotRegistryTimeouts",
    "ComposerEnvironment",
    "ComposerEnvironmentConfig",
    "ComposerEnvironmentConfigA",
    "ComposerEnvironmentConfigNodeConfig",
    "ComposerEnvironmentConfigNodeConfigIpAllocationPolicy",
    "ComposerEnvironmentConfigPrivateEnvironmentConfig",
    "ComposerEnvironmentConfigSoftwareConfig",
    "ComposerEnvironmentTimeouts",
    "ComputeAddress",
    "ComputeAddressConfig",
    "ComputeAddressTimeouts",
    "ComputeAttachedDisk",
    "ComputeAttachedDiskConfig",
    "ComputeAttachedDiskTimeouts",
    "ComputeAutoscaler",
    "ComputeAutoscalerAutoscalingPolicy",
    "ComputeAutoscalerAutoscalingPolicyCpuUtilization",
    "ComputeAutoscalerAutoscalingPolicyLoadBalancingUtilization",
    "ComputeAutoscalerAutoscalingPolicyMetric",
    "ComputeAutoscalerConfig",
    "ComputeAutoscalerTimeouts",
    "ComputeBackendBucket",
    "ComputeBackendBucketCdnPolicy",
    "ComputeBackendBucketConfig",
    "ComputeBackendBucketSignedUrlKey",
    "ComputeBackendBucketSignedUrlKeyConfig",
    "ComputeBackendBucketSignedUrlKeyTimeouts",
    "ComputeBackendBucketTimeouts",
    "ComputeBackendService",
    "ComputeBackendServiceBackend",
    "ComputeBackendServiceCdnPolicy",
    "ComputeBackendServiceCdnPolicyCacheKeyPolicy",
    "ComputeBackendServiceCircuitBreakers",
    "ComputeBackendServiceConfig",
    "ComputeBackendServiceConsistentHash",
    "ComputeBackendServiceConsistentHashHttpCookie",
    "ComputeBackendServiceConsistentHashHttpCookieTtl",
    "ComputeBackendServiceIap",
    "ComputeBackendServiceLogConfig",
    "ComputeBackendServiceOutlierDetection",
    "ComputeBackendServiceOutlierDetectionBaseEjectionTime",
    "ComputeBackendServiceOutlierDetectionInterval",
    "ComputeBackendServiceSignedUrlKey",
    "ComputeBackendServiceSignedUrlKeyConfig",
    "ComputeBackendServiceSignedUrlKeyTimeouts",
    "ComputeBackendServiceTimeouts",
    "ComputeDisk",
    "ComputeDiskConfig",
    "ComputeDiskDiskEncryptionKey",
    "ComputeDiskResourcePolicyAttachment",
    "ComputeDiskResourcePolicyAttachmentConfig",
    "ComputeDiskResourcePolicyAttachmentTimeouts",
    "ComputeDiskSourceImageEncryptionKey",
    "ComputeDiskSourceSnapshotEncryptionKey",
    "ComputeDiskTimeouts",
    "ComputeFirewall",
    "ComputeFirewallAllow",
    "ComputeFirewallConfig",
    "ComputeFirewallDeny",
    "ComputeFirewallLogConfig",
    "ComputeFirewallTimeouts",
    "ComputeForwardingRule",
    "ComputeForwardingRuleConfig",
    "ComputeForwardingRuleTimeouts",
    "ComputeGlobalAddress",
    "ComputeGlobalAddressConfig",
    "ComputeGlobalAddressTimeouts",
    "ComputeGlobalForwardingRule",
    "ComputeGlobalForwardingRuleConfig",
    "ComputeGlobalForwardingRuleMetadataFilters",
    "ComputeGlobalForwardingRuleMetadataFiltersFilterLabels",
    "ComputeGlobalForwardingRuleTimeouts",
    "ComputeGlobalNetworkEndpoint",
    "ComputeGlobalNetworkEndpointConfig",
    "ComputeGlobalNetworkEndpointGroup",
    "ComputeGlobalNetworkEndpointGroupConfig",
    "ComputeGlobalNetworkEndpointGroupTimeouts",
    "ComputeGlobalNetworkEndpointTimeouts",
    "ComputeHealthCheck",
    "ComputeHealthCheckConfig",
    "ComputeHealthCheckHttp2HealthCheck",
    "ComputeHealthCheckHttpHealthCheck",
    "ComputeHealthCheckHttpsHealthCheck",
    "ComputeHealthCheckSslHealthCheck",
    "ComputeHealthCheckTcpHealthCheck",
    "ComputeHealthCheckTimeouts",
    "ComputeHttpHealthCheck",
    "ComputeHttpHealthCheckConfig",
    "ComputeHttpHealthCheckTimeouts",
    "ComputeHttpsHealthCheck",
    "ComputeHttpsHealthCheckConfig",
    "ComputeHttpsHealthCheckTimeouts",
    "ComputeImage",
    "ComputeImageConfig",
    "ComputeImageGuestOsFeatures",
    "ComputeImageRawDisk",
    "ComputeImageTimeouts",
    "ComputeInstance",
    "ComputeInstanceAttachedDisk",
    "ComputeInstanceBootDisk",
    "ComputeInstanceBootDiskInitializeParams",
    "ComputeInstanceConfig",
    "ComputeInstanceFromTemplate",
    "ComputeInstanceFromTemplateAttachedDisk",
    "ComputeInstanceFromTemplateBootDisk",
    "ComputeInstanceFromTemplateBootDiskInitializeParams",
    "ComputeInstanceFromTemplateConfig",
    "ComputeInstanceFromTemplateGuestAccelerator",
    "ComputeInstanceFromTemplateNetworkInterface",
    "ComputeInstanceFromTemplateNetworkInterfaceAccessConfig",
    "ComputeInstanceFromTemplateNetworkInterfaceAliasIpRange",
    "ComputeInstanceFromTemplateScheduling",
    "ComputeInstanceFromTemplateSchedulingNodeAffinities",
    "ComputeInstanceFromTemplateScratchDisk",
    "ComputeInstanceFromTemplateServiceAccount",
    "ComputeInstanceFromTemplateShieldedInstanceConfig",
    "ComputeInstanceFromTemplateTimeouts",
    "ComputeInstanceGroup",
    "ComputeInstanceGroupConfig",
    "ComputeInstanceGroupManager",
    "ComputeInstanceGroupManagerAutoHealingPolicies",
    "ComputeInstanceGroupManagerConfig",
    "ComputeInstanceGroupManagerNamedPort",
    "ComputeInstanceGroupManagerTimeouts",
    "ComputeInstanceGroupManagerUpdatePolicy",
    "ComputeInstanceGroupManagerVersion",
    "ComputeInstanceGroupManagerVersionTargetSize",
    "ComputeInstanceGroupNamedPort",
    "ComputeInstanceGroupNamedPortA",
    "ComputeInstanceGroupNamedPortAConfig",
    "ComputeInstanceGroupNamedPortTimeouts",
    "ComputeInstanceGroupTimeouts",
    "ComputeInstanceGuestAccelerator",
    "ComputeInstanceIamBinding",
    "ComputeInstanceIamBindingCondition",
    "ComputeInstanceIamBindingConfig",
    "ComputeInstanceIamMember",
    "ComputeInstanceIamMemberCondition",
    "ComputeInstanceIamMemberConfig",
    "ComputeInstanceIamPolicy",
    "ComputeInstanceIamPolicyConfig",
    "ComputeInstanceNetworkInterface",
    "ComputeInstanceNetworkInterfaceAccessConfig",
    "ComputeInstanceNetworkInterfaceAliasIpRange",
    "ComputeInstanceScheduling",
    "ComputeInstanceSchedulingNodeAffinities",
    "ComputeInstanceScratchDisk",
    "ComputeInstanceServiceAccount",
    "ComputeInstanceShieldedInstanceConfig",
    "ComputeInstanceTemplate",
    "ComputeInstanceTemplateConfig",
    "ComputeInstanceTemplateDisk",
    "ComputeInstanceTemplateDiskDiskEncryptionKey",
    "ComputeInstanceTemplateGuestAccelerator",
    "ComputeInstanceTemplateNetworkInterface",
    "ComputeInstanceTemplateNetworkInterfaceAccessConfig",
    "ComputeInstanceTemplateNetworkInterfaceAliasIpRange",
    "ComputeInstanceTemplateScheduling",
    "ComputeInstanceTemplateSchedulingNodeAffinities",
    "ComputeInstanceTemplateServiceAccount",
    "ComputeInstanceTemplateShieldedInstanceConfig",
    "ComputeInstanceTemplateTimeouts",
    "ComputeInstanceTimeouts",
    "ComputeInterconnectAttachment",
    "ComputeInterconnectAttachmentConfig",
    "ComputeInterconnectAttachmentPrivateInterconnectInfo",
    "ComputeInterconnectAttachmentTimeouts",
    "ComputeNetwork",
    "ComputeNetworkConfig",
    "ComputeNetworkEndpoint",
    "ComputeNetworkEndpointConfig",
    "ComputeNetworkEndpointGroup",
    "ComputeNetworkEndpointGroupConfig",
    "ComputeNetworkEndpointGroupTimeouts",
    "ComputeNetworkEndpointTimeouts",
    "ComputeNetworkPeering",
    "ComputeNetworkPeeringConfig",
    "ComputeNetworkPeeringRoutesConfig",
    "ComputeNetworkPeeringRoutesConfigConfig",
    "ComputeNetworkPeeringRoutesConfigTimeouts",
    "ComputeNetworkPeeringTimeouts",
    "ComputeNetworkTimeouts",
    "ComputeNodeGroup",
    "ComputeNodeGroupConfig",
    "ComputeNodeGroupTimeouts",
    "ComputeNodeTemplate",
    "ComputeNodeTemplateConfig",
    "ComputeNodeTemplateNodeTypeFlexibility",
    "ComputeNodeTemplateTimeouts",
    "ComputeProjectDefaultNetworkTier",
    "ComputeProjectDefaultNetworkTierConfig",
    "ComputeProjectDefaultNetworkTierTimeouts",
    "ComputeProjectMetadata",
    "ComputeProjectMetadataConfig",
    "ComputeProjectMetadataItem",
    "ComputeProjectMetadataItemConfig",
    "ComputeProjectMetadataItemTimeouts",
    "ComputeProjectMetadataTimeouts",
    "ComputeRegionAutoscaler",
    "ComputeRegionAutoscalerAutoscalingPolicy",
    "ComputeRegionAutoscalerAutoscalingPolicyCpuUtilization",
    "ComputeRegionAutoscalerAutoscalingPolicyLoadBalancingUtilization",
    "ComputeRegionAutoscalerAutoscalingPolicyMetric",
    "ComputeRegionAutoscalerConfig",
    "ComputeRegionAutoscalerTimeouts",
    "ComputeRegionBackendService",
    "ComputeRegionBackendServiceBackend",
    "ComputeRegionBackendServiceCircuitBreakers",
    "ComputeRegionBackendServiceConfig",
    "ComputeRegionBackendServiceConsistentHash",
    "ComputeRegionBackendServiceConsistentHashHttpCookie",
    "ComputeRegionBackendServiceConsistentHashHttpCookieTtl",
    "ComputeRegionBackendServiceFailoverPolicy",
    "ComputeRegionBackendServiceLogConfig",
    "ComputeRegionBackendServiceOutlierDetection",
    "ComputeRegionBackendServiceOutlierDetectionBaseEjectionTime",
    "ComputeRegionBackendServiceOutlierDetectionInterval",
    "ComputeRegionBackendServiceTimeouts",
    "ComputeRegionDisk",
    "ComputeRegionDiskConfig",
    "ComputeRegionDiskDiskEncryptionKey",
    "ComputeRegionDiskResourcePolicyAttachment",
    "ComputeRegionDiskResourcePolicyAttachmentConfig",
    "ComputeRegionDiskResourcePolicyAttachmentTimeouts",
    "ComputeRegionDiskSourceSnapshotEncryptionKey",
    "ComputeRegionDiskTimeouts",
    "ComputeRegionHealthCheck",
    "ComputeRegionHealthCheckConfig",
    "ComputeRegionHealthCheckHttp2HealthCheck",
    "ComputeRegionHealthCheckHttpHealthCheck",
    "ComputeRegionHealthCheckHttpsHealthCheck",
    "ComputeRegionHealthCheckSslHealthCheck",
    "ComputeRegionHealthCheckTcpHealthCheck",
    "ComputeRegionHealthCheckTimeouts",
    "ComputeRegionInstanceGroupManager",
    "ComputeRegionInstanceGroupManagerAutoHealingPolicies",
    "ComputeRegionInstanceGroupManagerConfig",
    "ComputeRegionInstanceGroupManagerNamedPort",
    "ComputeRegionInstanceGroupManagerTimeouts",
    "ComputeRegionInstanceGroupManagerUpdatePolicy",
    "ComputeRegionInstanceGroupManagerVersion",
    "ComputeRegionInstanceGroupManagerVersionTargetSize",
    "ComputeRegionSslCertificate",
    "ComputeRegionSslCertificateConfig",
    "ComputeRegionSslCertificateTimeouts",
    "ComputeRegionTargetHttpProxy",
    "ComputeRegionTargetHttpProxyConfig",
    "ComputeRegionTargetHttpProxyTimeouts",
    "ComputeRegionTargetHttpsProxy",
    "ComputeRegionTargetHttpsProxyConfig",
    "ComputeRegionTargetHttpsProxyTimeouts",
    "ComputeRegionUrlMap",
    "ComputeRegionUrlMapConfig",
    "ComputeRegionUrlMapDefaultUrlRedirect",
    "ComputeRegionUrlMapHostRule",
    "ComputeRegionUrlMapPathMatcher",
    "ComputeRegionUrlMapPathMatcherDefaultUrlRedirect",
    "ComputeRegionUrlMapPathMatcherPathRule",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteAction",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionCorsPolicy",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicy",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbort",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelay",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelay",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicy",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionRetryPolicy",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeout",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionTimeout",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionUrlRewrite",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServices",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderAction",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd",
    "ComputeRegionUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd",
    "ComputeRegionUrlMapPathMatcherPathRuleUrlRedirect",
    "ComputeRegionUrlMapPathMatcherRouteRules",
    "ComputeRegionUrlMapPathMatcherRouteRulesHeaderAction",
    "ComputeRegionUrlMapPathMatcherRouteRulesHeaderActionRequestHeadersToAdd",
    "ComputeRegionUrlMapPathMatcherRouteRulesHeaderActionResponseHeadersToAdd",
    "ComputeRegionUrlMapPathMatcherRouteRulesMatchRules",
    "ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesHeaderMatches",
    "ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesHeaderMatchesRangeMatch",
    "ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesMetadataFilters",
    "ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesMetadataFiltersFilterLabels",
    "ComputeRegionUrlMapPathMatcherRouteRulesMatchRulesQueryParameterMatches",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteAction",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionCorsPolicy",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicy",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyAbort",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelay",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelayFixedDelay",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRequestMirrorPolicy",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRetryPolicy",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionRetryPolicyPerTryTimeout",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionTimeout",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionUrlRewrite",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServices",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderAction",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd",
    "ComputeRegionUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd",
    "ComputeRegionUrlMapPathMatcherRouteRulesUrlRedirect",
    "ComputeRegionUrlMapTest",
    "ComputeRegionUrlMapTimeouts",
    "ComputeReservation",
    "ComputeReservationConfig",
    "ComputeReservationSpecificReservation",
    "ComputeReservationSpecificReservationInstanceProperties",
    "ComputeReservationSpecificReservationInstancePropertiesGuestAccelerators",
    "ComputeReservationSpecificReservationInstancePropertiesLocalSsds",
    "ComputeReservationTimeouts",
    "ComputeResourcePolicy",
    "ComputeResourcePolicyConfig",
    "ComputeResourcePolicyGroupPlacementPolicy",
    "ComputeResourcePolicySnapshotSchedulePolicy",
    "ComputeResourcePolicySnapshotSchedulePolicyRetentionPolicy",
    "ComputeResourcePolicySnapshotSchedulePolicySchedule",
    "ComputeResourcePolicySnapshotSchedulePolicyScheduleDailySchedule",
    "ComputeResourcePolicySnapshotSchedulePolicyScheduleHourlySchedule",
    "ComputeResourcePolicySnapshotSchedulePolicyScheduleWeeklySchedule",
    "ComputeResourcePolicySnapshotSchedulePolicyScheduleWeeklyScheduleDayOfWeeks",
    "ComputeResourcePolicySnapshotSchedulePolicySnapshotProperties",
    "ComputeResourcePolicyTimeouts",
    "ComputeRoute",
    "ComputeRouteConfig",
    "ComputeRouteTimeouts",
    "ComputeRouter",
    "ComputeRouterBgp",
    "ComputeRouterBgpAdvertisedIpRanges",
    "ComputeRouterConfig",
    "ComputeRouterInterface",
    "ComputeRouterInterfaceConfig",
    "ComputeRouterInterfaceTimeouts",
    "ComputeRouterNat",
    "ComputeRouterNatConfig",
    "ComputeRouterNatLogConfig",
    "ComputeRouterNatSubnetwork",
    "ComputeRouterNatTimeouts",
    "ComputeRouterPeer",
    "ComputeRouterPeerAdvertisedIpRanges",
    "ComputeRouterPeerConfig",
    "ComputeRouterPeerTimeouts",
    "ComputeRouterTimeouts",
    "ComputeSecurityPolicy",
    "ComputeSecurityPolicyConfig",
    "ComputeSecurityPolicyRule",
    "ComputeSecurityPolicyRuleMatch",
    "ComputeSecurityPolicyRuleMatchConfig",
    "ComputeSecurityPolicyRuleMatchExpr",
    "ComputeSecurityPolicyTimeouts",
    "ComputeSharedVpcHostProject",
    "ComputeSharedVpcHostProjectConfig",
    "ComputeSharedVpcHostProjectTimeouts",
    "ComputeSharedVpcServiceProject",
    "ComputeSharedVpcServiceProjectConfig",
    "ComputeSharedVpcServiceProjectTimeouts",
    "ComputeSnapshot",
    "ComputeSnapshotConfig",
    "ComputeSnapshotSnapshotEncryptionKey",
    "ComputeSnapshotSourceDiskEncryptionKey",
    "ComputeSnapshotTimeouts",
    "ComputeSslCertificate",
    "ComputeSslCertificateConfig",
    "ComputeSslCertificateTimeouts",
    "ComputeSslPolicy",
    "ComputeSslPolicyConfig",
    "ComputeSslPolicyTimeouts",
    "ComputeSubnetwork",
    "ComputeSubnetworkConfig",
    "ComputeSubnetworkIamBinding",
    "ComputeSubnetworkIamBindingCondition",
    "ComputeSubnetworkIamBindingConfig",
    "ComputeSubnetworkIamMember",
    "ComputeSubnetworkIamMemberCondition",
    "ComputeSubnetworkIamMemberConfig",
    "ComputeSubnetworkIamPolicy",
    "ComputeSubnetworkIamPolicyConfig",
    "ComputeSubnetworkLogConfig",
    "ComputeSubnetworkSecondaryIpRange",
    "ComputeSubnetworkTimeouts",
    "ComputeTargetHttpProxy",
    "ComputeTargetHttpProxyConfig",
    "ComputeTargetHttpProxyTimeouts",
    "ComputeTargetHttpsProxy",
    "ComputeTargetHttpsProxyConfig",
    "ComputeTargetHttpsProxyTimeouts",
    "ComputeTargetInstance",
    "ComputeTargetInstanceConfig",
    "ComputeTargetInstanceTimeouts",
    "ComputeTargetPool",
    "ComputeTargetPoolConfig",
    "ComputeTargetPoolTimeouts",
    "ComputeTargetSslProxy",
    "ComputeTargetSslProxyConfig",
    "ComputeTargetSslProxyTimeouts",
    "ComputeTargetTcpProxy",
    "ComputeTargetTcpProxyConfig",
    "ComputeTargetTcpProxyTimeouts",
    "ComputeUrlMap",
    "ComputeUrlMapConfig",
    "ComputeUrlMapDefaultRouteAction",
    "ComputeUrlMapDefaultRouteActionCorsPolicy",
    "ComputeUrlMapDefaultRouteActionFaultInjectionPolicy",
    "ComputeUrlMapDefaultRouteActionFaultInjectionPolicyAbort",
    "ComputeUrlMapDefaultRouteActionFaultInjectionPolicyDelay",
    "ComputeUrlMapDefaultRouteActionFaultInjectionPolicyDelayFixedDelay",
    "ComputeUrlMapDefaultRouteActionRequestMirrorPolicy",
    "ComputeUrlMapDefaultRouteActionRetryPolicy",
    "ComputeUrlMapDefaultRouteActionRetryPolicyPerTryTimeout",
    "ComputeUrlMapDefaultRouteActionTimeout",
    "ComputeUrlMapDefaultRouteActionUrlRewrite",
    "ComputeUrlMapDefaultRouteActionWeightedBackendServices",
    "ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderAction",
    "ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd",
    "ComputeUrlMapDefaultRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd",
    "ComputeUrlMapDefaultUrlRedirect",
    "ComputeUrlMapHeaderAction",
    "ComputeUrlMapHeaderActionRequestHeadersToAdd",
    "ComputeUrlMapHeaderActionResponseHeadersToAdd",
    "ComputeUrlMapHostRule",
    "ComputeUrlMapPathMatcher",
    "ComputeUrlMapPathMatcherDefaultRouteAction",
    "ComputeUrlMapPathMatcherDefaultRouteActionCorsPolicy",
    "ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicy",
    "ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyAbort",
    "ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyDelay",
    "ComputeUrlMapPathMatcherDefaultRouteActionFaultInjectionPolicyDelayFixedDelay",
    "ComputeUrlMapPathMatcherDefaultRouteActionRequestMirrorPolicy",
    "ComputeUrlMapPathMatcherDefaultRouteActionRetryPolicy",
    "ComputeUrlMapPathMatcherDefaultRouteActionRetryPolicyPerTryTimeout",
    "ComputeUrlMapPathMatcherDefaultRouteActionTimeout",
    "ComputeUrlMapPathMatcherDefaultRouteActionUrlRewrite",
    "ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServices",
    "ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderAction",
    "ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd",
    "ComputeUrlMapPathMatcherDefaultRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd",
    "ComputeUrlMapPathMatcherDefaultUrlRedirect",
    "ComputeUrlMapPathMatcherHeaderAction",
    "ComputeUrlMapPathMatcherHeaderActionRequestHeadersToAdd",
    "ComputeUrlMapPathMatcherHeaderActionResponseHeadersToAdd",
    "ComputeUrlMapPathMatcherPathRule",
    "ComputeUrlMapPathMatcherPathRuleRouteAction",
    "ComputeUrlMapPathMatcherPathRuleRouteActionCorsPolicy",
    "ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicy",
    "ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyAbort",
    "ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelay",
    "ComputeUrlMapPathMatcherPathRuleRouteActionFaultInjectionPolicyDelayFixedDelay",
    "ComputeUrlMapPathMatcherPathRuleRouteActionRequestMirrorPolicy",
    "ComputeUrlMapPathMatcherPathRuleRouteActionRetryPolicy",
    "ComputeUrlMapPathMatcherPathRuleRouteActionRetryPolicyPerTryTimeout",
    "ComputeUrlMapPathMatcherPathRuleRouteActionTimeout",
    "ComputeUrlMapPathMatcherPathRuleRouteActionUrlRewrite",
    "ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServices",
    "ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderAction",
    "ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd",
    "ComputeUrlMapPathMatcherPathRuleRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd",
    "ComputeUrlMapPathMatcherPathRuleUrlRedirect",
    "ComputeUrlMapPathMatcherRouteRules",
    "ComputeUrlMapPathMatcherRouteRulesHeaderAction",
    "ComputeUrlMapPathMatcherRouteRulesHeaderActionRequestHeadersToAdd",
    "ComputeUrlMapPathMatcherRouteRulesHeaderActionResponseHeadersToAdd",
    "ComputeUrlMapPathMatcherRouteRulesMatchRules",
    "ComputeUrlMapPathMatcherRouteRulesMatchRulesHeaderMatches",
    "ComputeUrlMapPathMatcherRouteRulesMatchRulesHeaderMatchesRangeMatch",
    "ComputeUrlMapPathMatcherRouteRulesMatchRulesMetadataFilters",
    "ComputeUrlMapPathMatcherRouteRulesMatchRulesMetadataFiltersFilterLabels",
    "ComputeUrlMapPathMatcherRouteRulesMatchRulesQueryParameterMatches",
    "ComputeUrlMapPathMatcherRouteRulesRouteAction",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionCorsPolicy",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicy",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyAbort",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelay",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionFaultInjectionPolicyDelayFixedDelay",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionRequestMirrorPolicy",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionRetryPolicy",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionRetryPolicyPerTryTimeout",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionTimeout",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionUrlRewrite",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServices",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderAction",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionRequestHeadersToAdd",
    "ComputeUrlMapPathMatcherRouteRulesRouteActionWeightedBackendServicesHeaderActionResponseHeadersToAdd",
    "ComputeUrlMapPathMatcherRouteRulesUrlRedirect",
    "ComputeUrlMapTest",
    "ComputeUrlMapTimeouts",
    "ComputeVpnGateway",
    "ComputeVpnGatewayConfig",
    "ComputeVpnGatewayTimeouts",
    "ComputeVpnTunnel",
    "ComputeVpnTunnelConfig",
    "ComputeVpnTunnelTimeouts",
    "ContainerAnalysisNote",
    "ContainerAnalysisNoteAttestationAuthority",
    "ContainerAnalysisNoteAttestationAuthorityHint",
    "ContainerAnalysisNoteConfig",
    "ContainerAnalysisNoteRelatedUrl",
    "ContainerAnalysisNoteTimeouts",
    "ContainerAnalysisOccurrence",
    "ContainerAnalysisOccurrenceAttestation",
    "ContainerAnalysisOccurrenceAttestationSignatures",
    "ContainerAnalysisOccurrenceConfig",
    "ContainerAnalysisOccurrenceTimeouts",
    "ContainerCluster",
    "ContainerClusterAddonsConfig",
    "ContainerClusterAddonsConfigCloudrunConfig",
    "ContainerClusterAddonsConfigHorizontalPodAutoscaling",
    "ContainerClusterAddonsConfigHttpLoadBalancing",
    "ContainerClusterAddonsConfigKubernetesDashboard",
    "ContainerClusterAddonsConfigNetworkPolicyConfig",
    "ContainerClusterAuthenticatorGroupsConfig",
    "ContainerClusterClusterAutoscaling",
    "ContainerClusterClusterAutoscalingAutoProvisioningDefaults",
    "ContainerClusterClusterAutoscalingResourceLimits",
    "ContainerClusterConfig",
    "ContainerClusterDatabaseEncryption",
    "ContainerClusterIpAllocationPolicy",
    "ContainerClusterMaintenancePolicy",
    "ContainerClusterMaintenancePolicyDailyMaintenanceWindow",
    "ContainerClusterMaintenancePolicyRecurringWindow",
    "ContainerClusterMasterAuth",
    "ContainerClusterMasterAuthClientCertificateConfig",
    "ContainerClusterMasterAuthorizedNetworksConfig",
    "ContainerClusterMasterAuthorizedNetworksConfigCidrBlocks",
    "ContainerClusterNetworkPolicy",
    "ContainerClusterNodeConfig",
    "ContainerClusterNodeConfigGuestAccelerator",
    "ContainerClusterNodeConfigSandboxConfig",
    "ContainerClusterNodeConfigShieldedInstanceConfig",
    "ContainerClusterNodeConfigTaint",
    "ContainerClusterNodeConfigWorkloadMetadataConfig",
    "ContainerClusterNodePool",
    "ContainerClusterNodePoolAutoscaling",
    "ContainerClusterNodePoolManagement",
    "ContainerClusterNodePoolNodeConfig",
    "ContainerClusterNodePoolNodeConfigGuestAccelerator",
    "ContainerClusterNodePoolNodeConfigSandboxConfig",
    "ContainerClusterNodePoolNodeConfigShieldedInstanceConfig",
    "ContainerClusterNodePoolNodeConfigTaint",
    "ContainerClusterNodePoolNodeConfigWorkloadMetadataConfig",
    "ContainerClusterNodePoolUpgradeSettings",
    "ContainerClusterPodSecurityPolicyConfig",
    "ContainerClusterPrivateClusterConfig",
    "ContainerClusterReleaseChannel",
    "ContainerClusterResourceUsageExportConfig",
    "ContainerClusterResourceUsageExportConfigBigqueryDestination",
    "ContainerClusterTimeouts",
    "ContainerClusterVerticalPodAutoscaling",
    "ContainerClusterWorkloadIdentityConfig",
    "ContainerNodePool",
    "ContainerNodePoolAutoscaling",
    "ContainerNodePoolConfig",
    "ContainerNodePoolManagement",
    "ContainerNodePoolNodeConfig",
    "ContainerNodePoolNodeConfigGuestAccelerator",
    "ContainerNodePoolNodeConfigSandboxConfig",
    "ContainerNodePoolNodeConfigShieldedInstanceConfig",
    "ContainerNodePoolNodeConfigTaint",
    "ContainerNodePoolNodeConfigWorkloadMetadataConfig",
    "ContainerNodePoolTimeouts",
    "ContainerNodePoolUpgradeSettings",
    "ContainerRegistry",
    "ContainerRegistryConfig",
    "DataCatalogEntry",
    "DataCatalogEntryBigqueryDateShardedSpec",
    "DataCatalogEntryBigqueryTableSpec",
    "DataCatalogEntryBigqueryTableSpecTableSpec",
    "DataCatalogEntryBigqueryTableSpecViewSpec",
    "DataCatalogEntryConfig",
    "DataCatalogEntryGcsFilesetSpec",
    "DataCatalogEntryGroup",
    "DataCatalogEntryGroupConfig",
    "DataCatalogEntryGroupIamBinding",
    "DataCatalogEntryGroupIamBindingCondition",
    "DataCatalogEntryGroupIamBindingConfig",
    "DataCatalogEntryGroupIamMember",
    "DataCatalogEntryGroupIamMemberCondition",
    "DataCatalogEntryGroupIamMemberConfig",
    "DataCatalogEntryGroupIamPolicy",
    "DataCatalogEntryGroupIamPolicyConfig",
    "DataCatalogEntryGroupTimeouts",
    "DataCatalogEntryTimeouts",
    "DataCatalogTag",
    "DataCatalogTagConfig",
    "DataCatalogTagFields",
    "DataCatalogTagTemplate",
    "DataCatalogTagTemplateConfig",
    "DataCatalogTagTemplateFields",
    "DataCatalogTagTemplateFieldsType",
    "DataCatalogTagTemplateFieldsTypeEnumType",
    "DataCatalogTagTemplateFieldsTypeEnumTypeAllowedValues",
    "DataCatalogTagTemplateTimeouts",
    "DataCatalogTagTimeouts",
    "DataGoogleActiveFolder",
    "DataGoogleActiveFolderConfig",
    "DataGoogleBigqueryDefaultServiceAccount",
    "DataGoogleBigqueryDefaultServiceAccountConfig",
    "DataGoogleBillingAccount",
    "DataGoogleBillingAccountConfig",
    "DataGoogleClientConfig",
    "DataGoogleClientConfigConfig",
    "DataGoogleClientOpenidUserinfo",
    "DataGoogleClientOpenidUserinfoConfig",
    "DataGoogleCloudfunctionsFunction",
    "DataGoogleCloudfunctionsFunctionConfig",
    "DataGoogleCloudfunctionsFunctionEventTrigger",
    "DataGoogleCloudfunctionsFunctionEventTriggerFailurePolicy",
    "DataGoogleCloudfunctionsFunctionSourceRepository",
    "DataGoogleComposerImageVersions",
    "DataGoogleComposerImageVersionsConfig",
    "DataGoogleComposerImageVersionsImageVersions",
    "DataGoogleComputeAddress",
    "DataGoogleComputeAddressConfig",
    "DataGoogleComputeBackendBucket",
    "DataGoogleComputeBackendBucketCdnPolicy",
    "DataGoogleComputeBackendBucketConfig",
    "DataGoogleComputeBackendService",
    "DataGoogleComputeBackendServiceBackend",
    "DataGoogleComputeBackendServiceCdnPolicy",
    "DataGoogleComputeBackendServiceCdnPolicyCacheKeyPolicy",
    "DataGoogleComputeBackendServiceCircuitBreakers",
    "DataGoogleComputeBackendServiceConfig",
    "DataGoogleComputeBackendServiceConsistentHash",
    "DataGoogleComputeBackendServiceConsistentHashHttpCookie",
    "DataGoogleComputeBackendServiceConsistentHashHttpCookieTtl",
    "DataGoogleComputeBackendServiceIap",
    "DataGoogleComputeBackendServiceLogConfig",
    "DataGoogleComputeBackendServiceOutlierDetection",
    "DataGoogleComputeBackendServiceOutlierDetectionBaseEjectionTime",
    "DataGoogleComputeBackendServiceOutlierDetectionInterval",
    "DataGoogleComputeDefaultServiceAccount",
    "DataGoogleComputeDefaultServiceAccountConfig",
    "DataGoogleComputeForwardingRule",
    "DataGoogleComputeForwardingRuleConfig",
    "DataGoogleComputeGlobalAddress",
    "DataGoogleComputeGlobalAddressConfig",
    "DataGoogleComputeImage",
    "DataGoogleComputeImageConfig",
    "DataGoogleComputeInstance",
    "DataGoogleComputeInstanceAttachedDisk",
    "DataGoogleComputeInstanceBootDisk",
    "DataGoogleComputeInstanceBootDiskInitializeParams",
    "DataGoogleComputeInstanceConfig",
    "DataGoogleComputeInstanceGroup",
    "DataGoogleComputeInstanceGroupConfig",
    "DataGoogleComputeInstanceGroupNamedPort",
    "DataGoogleComputeInstanceGuestAccelerator",
    "DataGoogleComputeInstanceNetworkInterface",
    "DataGoogleComputeInstanceNetworkInterfaceAccessConfig",
    "DataGoogleComputeInstanceNetworkInterfaceAliasIpRange",
    "DataGoogleComputeInstanceScheduling",
    "DataGoogleComputeInstanceSchedulingNodeAffinities",
    "DataGoogleComputeInstanceScratchDisk",
    "DataGoogleComputeInstanceSerialPort",
    "DataGoogleComputeInstanceSerialPortConfig",
    "DataGoogleComputeInstanceServiceAccount",
    "DataGoogleComputeInstanceShieldedInstanceConfig",
    "DataGoogleComputeLbIpRanges",
    "DataGoogleComputeLbIpRangesConfig",
    "DataGoogleComputeNetwork",
    "DataGoogleComputeNetworkConfig",
    "DataGoogleComputeNetworkEndpointGroup",
    "DataGoogleComputeNetworkEndpointGroupConfig",
    "DataGoogleComputeNodeTypes",
    "DataGoogleComputeNodeTypesConfig",
    "DataGoogleComputeRegionInstanceGroup",
    "DataGoogleComputeRegionInstanceGroupConfig",
    "DataGoogleComputeRegionInstanceGroupInstances",
    "DataGoogleComputeRegionInstanceGroupInstancesNamedPorts",
    "DataGoogleComputeRegions",
    "DataGoogleComputeRegionsConfig",
    "DataGoogleComputeRouter",
    "DataGoogleComputeRouterBgp",
    "DataGoogleComputeRouterBgpAdvertisedIpRanges",
    "DataGoogleComputeRouterConfig",
    "DataGoogleComputeSslCertificate",
    "DataGoogleComputeSslCertificateConfig",
    "DataGoogleComputeSslPolicy",
    "DataGoogleComputeSslPolicyConfig",
    "DataGoogleComputeSubnetwork",
    "DataGoogleComputeSubnetworkConfig",
    "DataGoogleComputeSubnetworkSecondaryIpRange",
    "DataGoogleComputeVpnGateway",
    "DataGoogleComputeVpnGatewayConfig",
    "DataGoogleComputeZones",
    "DataGoogleComputeZonesConfig",
    "DataGoogleContainerCluster",
    "DataGoogleContainerClusterAddonsConfig",
    "DataGoogleContainerClusterAddonsConfigCloudrunConfig",
    "DataGoogleContainerClusterAddonsConfigHorizontalPodAutoscaling",
    "DataGoogleContainerClusterAddonsConfigHttpLoadBalancing",
    "DataGoogleContainerClusterAddonsConfigKubernetesDashboard",
    "DataGoogleContainerClusterAddonsConfigNetworkPolicyConfig",
    "DataGoogleContainerClusterAuthenticatorGroupsConfig",
    "DataGoogleContainerClusterClusterAutoscaling",
    "DataGoogleContainerClusterClusterAutoscalingAutoProvisioningDefaults",
    "DataGoogleContainerClusterClusterAutoscalingResourceLimits",
    "DataGoogleContainerClusterConfig",
    "DataGoogleContainerClusterDatabaseEncryption",
    "DataGoogleContainerClusterIpAllocationPolicy",
    "DataGoogleContainerClusterMaintenancePolicy",
    "DataGoogleContainerClusterMaintenancePolicyDailyMaintenanceWindow",
    "DataGoogleContainerClusterMaintenancePolicyRecurringWindow",
    "DataGoogleContainerClusterMasterAuth",
    "DataGoogleContainerClusterMasterAuthClientCertificateConfig",
    "DataGoogleContainerClusterMasterAuthorizedNetworksConfig",
    "DataGoogleContainerClusterMasterAuthorizedNetworksConfigCidrBlocks",
    "DataGoogleContainerClusterNetworkPolicy",
    "DataGoogleContainerClusterNodeConfig",
    "DataGoogleContainerClusterNodeConfigGuestAccelerator",
    "DataGoogleContainerClusterNodeConfigSandboxConfig",
    "DataGoogleContainerClusterNodeConfigShieldedInstanceConfig",
    "DataGoogleContainerClusterNodeConfigTaint",
    "DataGoogleContainerClusterNodeConfigWorkloadMetadataConfig",
    "DataGoogleContainerClusterNodePool",
    "DataGoogleContainerClusterNodePoolAutoscaling",
    "DataGoogleContainerClusterNodePoolManagement",
    "DataGoogleContainerClusterNodePoolNodeConfig",
    "DataGoogleContainerClusterNodePoolNodeConfigGuestAccelerator",
    "DataGoogleContainerClusterNodePoolNodeConfigSandboxConfig",
    "DataGoogleContainerClusterNodePoolNodeConfigShieldedInstanceConfig",
    "DataGoogleContainerClusterNodePoolNodeConfigTaint",
    "DataGoogleContainerClusterNodePoolNodeConfigWorkloadMetadataConfig",
    "DataGoogleContainerClusterNodePoolUpgradeSettings",
    "DataGoogleContainerClusterPodSecurityPolicyConfig",
    "DataGoogleContainerClusterPrivateClusterConfig",
    "DataGoogleContainerClusterReleaseChannel",
    "DataGoogleContainerClusterResourceUsageExportConfig",
    "DataGoogleContainerClusterResourceUsageExportConfigBigqueryDestination",
    "DataGoogleContainerClusterVerticalPodAutoscaling",
    "DataGoogleContainerClusterWorkloadIdentityConfig",
    "DataGoogleContainerEngineVersions",
    "DataGoogleContainerEngineVersionsConfig",
    "DataGoogleContainerRegistryImage",
    "DataGoogleContainerRegistryImageConfig",
    "DataGoogleContainerRegistryRepository",
    "DataGoogleContainerRegistryRepositoryConfig",
    "DataGoogleDnsKeys",
    "DataGoogleDnsKeysConfig",
    "DataGoogleDnsKeysKeySigningKeys",
    "DataGoogleDnsKeysKeySigningKeysDigests",
    "DataGoogleDnsKeysZoneSigningKeys",
    "DataGoogleDnsKeysZoneSigningKeysDigests",
    "DataGoogleDnsManagedZone",
    "DataGoogleDnsManagedZoneConfig",
    "DataGoogleFolder",
    "DataGoogleFolderConfig",
    "DataGoogleFolderOrganizationPolicy",
    "DataGoogleFolderOrganizationPolicyBooleanPolicy",
    "DataGoogleFolderOrganizationPolicyConfig",
    "DataGoogleFolderOrganizationPolicyListPolicy",
    "DataGoogleFolderOrganizationPolicyListPolicyAllow",
    "DataGoogleFolderOrganizationPolicyListPolicyDeny",
    "DataGoogleFolderOrganizationPolicyRestorePolicy",
    "DataGoogleGameServicesGameServerDeploymentRollout",
    "DataGoogleGameServicesGameServerDeploymentRolloutConfig",
    "DataGoogleGameServicesGameServerDeploymentRolloutGameServerConfigOverrides",
    "DataGoogleGameServicesGameServerDeploymentRolloutGameServerConfigOverridesRealmsSelector",
    "DataGoogleIamPolicy",
    "DataGoogleIamPolicyAuditConfig",
    "DataGoogleIamPolicyAuditConfigAuditLogConfigs",
    "DataGoogleIamPolicyBinding",
    "DataGoogleIamPolicyBindingCondition",
    "DataGoogleIamPolicyConfig",
    "DataGoogleIamRole",
    "DataGoogleIamRoleConfig",
    "DataGoogleIamTestablePermissions",
    "DataGoogleIamTestablePermissionsConfig",
    "DataGoogleIamTestablePermissionsPermissions",
    "DataGoogleKmsCryptoKey",
    "DataGoogleKmsCryptoKeyConfig",
    "DataGoogleKmsCryptoKeyVersion",
    "DataGoogleKmsCryptoKeyVersionConfig",
    "DataGoogleKmsCryptoKeyVersionPublicKey",
    "DataGoogleKmsCryptoKeyVersionTemplate",
    "DataGoogleKmsKeyRing",
    "DataGoogleKmsKeyRingConfig",
    "DataGoogleKmsSecret",
    "DataGoogleKmsSecretCiphertext",
    "DataGoogleKmsSecretCiphertextConfig",
    "DataGoogleKmsSecretConfig",
    "DataGoogleMonitoringAppEngineService",
    "DataGoogleMonitoringAppEngineServiceConfig",
    "DataGoogleMonitoringAppEngineServiceTelemetry",
    "DataGoogleMonitoringNotificationChannel",
    "DataGoogleMonitoringNotificationChannelConfig",
    "DataGoogleMonitoringNotificationChannelSensitiveLabels",
    "DataGoogleMonitoringUptimeCheckIps",
    "DataGoogleMonitoringUptimeCheckIpsConfig",
    "DataGoogleMonitoringUptimeCheckIpsUptimeCheckIps",
    "DataGoogleNetblockIpRanges",
    "DataGoogleNetblockIpRangesConfig",
    "DataGoogleOrganization",
    "DataGoogleOrganizationConfig",
    "DataGoogleProject",
    "DataGoogleProjectConfig",
    "DataGoogleProjectOrganizationPolicy",
    "DataGoogleProjectOrganizationPolicyBooleanPolicy",
    "DataGoogleProjectOrganizationPolicyConfig",
    "DataGoogleProjectOrganizationPolicyListPolicy",
    "DataGoogleProjectOrganizationPolicyListPolicyAllow",
    "DataGoogleProjectOrganizationPolicyListPolicyDeny",
    "DataGoogleProjectOrganizationPolicyRestorePolicy",
    "DataGoogleProjects",
    "DataGoogleProjectsConfig",
    "DataGoogleProjectsProjects",
    "DataGoogleRedisInstance",
    "DataGoogleRedisInstanceConfig",
    "DataGoogleSecretManagerSecretVersion",
    "DataGoogleSecretManagerSecretVersionConfig",
    "DataGoogleServiceAccount",
    "DataGoogleServiceAccountAccessToken",
    "DataGoogleServiceAccountAccessTokenConfig",
    "DataGoogleServiceAccountConfig",
    "DataGoogleServiceAccountIdToken",
    "DataGoogleServiceAccountIdTokenConfig",
    "DataGoogleServiceAccountKey",
    "DataGoogleServiceAccountKeyConfig",
    "DataGoogleSqlCaCerts",
    "DataGoogleSqlCaCertsCerts",
    "DataGoogleSqlCaCertsConfig",
    "DataGoogleSqlDatabaseInstance",
    "DataGoogleSqlDatabaseInstanceConfig",
    "DataGoogleSqlDatabaseInstanceIpAddress",
    "DataGoogleSqlDatabaseInstanceReplicaConfiguration",
    "DataGoogleSqlDatabaseInstanceServerCaCert",
    "DataGoogleSqlDatabaseInstanceSettings",
    "DataGoogleSqlDatabaseInstanceSettingsBackupConfiguration",
    "DataGoogleSqlDatabaseInstanceSettingsDatabaseFlags",
    "DataGoogleSqlDatabaseInstanceSettingsIpConfiguration",
    "DataGoogleSqlDatabaseInstanceSettingsIpConfigurationAuthorizedNetworks",
    "DataGoogleSqlDatabaseInstanceSettingsLocationPreference",
    "DataGoogleSqlDatabaseInstanceSettingsMaintenanceWindow",
    "DataGoogleStorageBucketObject",
    "DataGoogleStorageBucketObjectConfig",
    "DataGoogleStorageObjectSignedUrl",
    "DataGoogleStorageObjectSignedUrlConfig",
    "DataGoogleStorageProjectServiceAccount",
    "DataGoogleStorageProjectServiceAccountConfig",
    "DataGoogleStorageTransferProjectServiceAccount",
    "DataGoogleStorageTransferProjectServiceAccountConfig",
    "DataGoogleTpuTensorflowVersions",
    "DataGoogleTpuTensorflowVersionsConfig",
    "DataflowJob",
    "DataflowJobConfig",
    "DataflowJobTimeouts",
    "DataprocAutoscalingPolicy",
    "DataprocAutoscalingPolicyBasicAlgorithm",
    "DataprocAutoscalingPolicyBasicAlgorithmYarnConfig",
    "DataprocAutoscalingPolicyConfig",
    "DataprocAutoscalingPolicySecondaryWorkerConfig",
    "DataprocAutoscalingPolicyTimeouts",
    "DataprocAutoscalingPolicyWorkerConfig",
    "DataprocCluster",
    "DataprocClusterClusterConfig",
    "DataprocClusterClusterConfigAutoscalingConfig",
    "DataprocClusterClusterConfigEncryptionConfig",
    "DataprocClusterClusterConfigGceClusterConfig",
    "DataprocClusterClusterConfigInitializationAction",
    "DataprocClusterClusterConfigMasterConfig",
    "DataprocClusterClusterConfigMasterConfigAccelerators",
    "DataprocClusterClusterConfigMasterConfigDiskConfig",
    "DataprocClusterClusterConfigPreemptibleWorkerConfig",
    "DataprocClusterClusterConfigPreemptibleWorkerConfigDiskConfig",
    "DataprocClusterClusterConfigSecurityConfig",
    "DataprocClusterClusterConfigSecurityConfigKerberosConfig",
    "DataprocClusterClusterConfigSoftwareConfig",
    "DataprocClusterClusterConfigWorkerConfig",
    "DataprocClusterClusterConfigWorkerConfigAccelerators",
    "DataprocClusterClusterConfigWorkerConfigDiskConfig",
    "DataprocClusterConfig",
    "DataprocClusterIamBinding",
    "DataprocClusterIamBindingCondition",
    "DataprocClusterIamBindingConfig",
    "DataprocClusterIamMember",
    "DataprocClusterIamMemberCondition",
    "DataprocClusterIamMemberConfig",
    "DataprocClusterIamPolicy",
    "DataprocClusterIamPolicyConfig",
    "DataprocClusterTimeouts",
    "DataprocJob",
    "DataprocJobConfig",
    "DataprocJobHadoopConfig",
    "DataprocJobHadoopConfigLoggingConfig",
    "DataprocJobHiveConfig",
    "DataprocJobIamBinding",
    "DataprocJobIamBindingCondition",
    "DataprocJobIamBindingConfig",
    "DataprocJobIamMember",
    "DataprocJobIamMemberCondition",
    "DataprocJobIamMemberConfig",
    "DataprocJobIamPolicy",
    "DataprocJobIamPolicyConfig",
    "DataprocJobPigConfig",
    "DataprocJobPigConfigLoggingConfig",
    "DataprocJobPlacement",
    "DataprocJobPysparkConfig",
    "DataprocJobPysparkConfigLoggingConfig",
    "DataprocJobReference",
    "DataprocJobScheduling",
    "DataprocJobSparkConfig",
    "DataprocJobSparkConfigLoggingConfig",
    "DataprocJobSparksqlConfig",
    "DataprocJobSparksqlConfigLoggingConfig",
    "DataprocJobStatus",
    "DataprocJobTimeouts",
    "DatastoreIndex",
    "DatastoreIndexConfig",
    "DatastoreIndexProperties",
    "DatastoreIndexTimeouts",
    "DeploymentManagerDeployment",
    "DeploymentManagerDeploymentConfig",
    "DeploymentManagerDeploymentLabels",
    "DeploymentManagerDeploymentTarget",
    "DeploymentManagerDeploymentTargetConfig",
    "DeploymentManagerDeploymentTargetImports",
    "DeploymentManagerDeploymentTimeouts",
    "DialogflowAgent",
    "DialogflowAgentConfig",
    "DialogflowAgentTimeouts",
    "DialogflowEntityType",
    "DialogflowEntityTypeConfig",
    "DialogflowEntityTypeEntities",
    "DialogflowEntityTypeTimeouts",
    "DialogflowIntent",
    "DialogflowIntentConfig",
    "DialogflowIntentFollowupIntentInfo",
    "DialogflowIntentTimeouts",
    "DnsManagedZone",
    "DnsManagedZoneConfig",
    "DnsManagedZoneDnssecConfig",
    "DnsManagedZoneDnssecConfigDefaultKeySpecs",
    "DnsManagedZoneForwardingConfig",
    "DnsManagedZoneForwardingConfigTargetNameServers",
    "DnsManagedZonePeeringConfig",
    "DnsManagedZonePeeringConfigTargetNetwork",
    "DnsManagedZonePrivateVisibilityConfig",
    "DnsManagedZonePrivateVisibilityConfigNetworks",
    "DnsManagedZoneTimeouts",
    "DnsPolicy",
    "DnsPolicyAlternativeNameServerConfig",
    "DnsPolicyAlternativeNameServerConfigTargetNameServers",
    "DnsPolicyConfig",
    "DnsPolicyNetworks",
    "DnsPolicyTimeouts",
    "DnsRecordSet",
    "DnsRecordSetConfig",
    "EndpointsService",
    "EndpointsServiceApis",
    "EndpointsServiceApisMethods",
    "EndpointsServiceConfig",
    "EndpointsServiceEndpoints",
    "EndpointsServiceIamBinding",
    "EndpointsServiceIamBindingCondition",
    "EndpointsServiceIamBindingConfig",
    "EndpointsServiceIamMember",
    "EndpointsServiceIamMemberCondition",
    "EndpointsServiceIamMemberConfig",
    "EndpointsServiceIamPolicy",
    "EndpointsServiceIamPolicyConfig",
    "EndpointsServiceTimeouts",
    "FilestoreInstance",
    "FilestoreInstanceConfig",
    "FilestoreInstanceFileShares",
    "FilestoreInstanceNetworks",
    "FilestoreInstanceTimeouts",
    "FirestoreIndex",
    "FirestoreIndexConfig",
    "FirestoreIndexFields",
    "FirestoreIndexTimeouts",
    "Folder",
    "FolderConfig",
    "FolderIamAuditConfig",
    "FolderIamAuditConfigAuditLogConfig",
    "FolderIamAuditConfigConfig",
    "FolderIamBinding",
    "FolderIamBindingCondition",
    "FolderIamBindingConfig",
    "FolderIamMember",
    "FolderIamMemberCondition",
    "FolderIamMemberConfig",
    "FolderIamPolicy",
    "FolderIamPolicyConfig",
    "FolderOrganizationPolicy",
    "FolderOrganizationPolicyBooleanPolicy",
    "FolderOrganizationPolicyConfig",
    "FolderOrganizationPolicyListPolicy",
    "FolderOrganizationPolicyListPolicyAllow",
    "FolderOrganizationPolicyListPolicyDeny",
    "FolderOrganizationPolicyRestorePolicy",
    "FolderOrganizationPolicyTimeouts",
    "FolderTimeouts",
    "GameServicesGameServerCluster",
    "GameServicesGameServerClusterConfig",
    "GameServicesGameServerClusterConnectionInfo",
    "GameServicesGameServerClusterConnectionInfoGkeClusterReference",
    "GameServicesGameServerClusterTimeouts",
    "GameServicesGameServerConfig",
    "GameServicesGameServerConfigConfig",
    "GameServicesGameServerConfigFleetConfigs",
    "GameServicesGameServerConfigScalingConfigs",
    "GameServicesGameServerConfigScalingConfigsSchedules",
    "GameServicesGameServerConfigScalingConfigsSelectors",
    "GameServicesGameServerConfigTimeouts",
    "GameServicesGameServerDeployment",
    "GameServicesGameServerDeploymentConfig",
    "GameServicesGameServerDeploymentRollout",
    "GameServicesGameServerDeploymentRolloutConfig",
    "GameServicesGameServerDeploymentRolloutGameServerConfigOverrides",
    "GameServicesGameServerDeploymentRolloutGameServerConfigOverridesRealmsSelector",
    "GameServicesGameServerDeploymentRolloutTimeouts",
    "GameServicesGameServerDeploymentTimeouts",
    "GameServicesRealm",
    "GameServicesRealmConfig",
    "GameServicesRealmTimeouts",
    "GoogleProvider",
    "GoogleProviderBatching",
    "GoogleProviderConfig",
    "HealthcareDataset",
    "HealthcareDatasetConfig",
    "HealthcareDatasetIamBinding",
    "HealthcareDatasetIamBindingCondition",
    "HealthcareDatasetIamBindingConfig",
    "HealthcareDatasetIamMember",
    "HealthcareDatasetIamMemberCondition",
    "HealthcareDatasetIamMemberConfig",
    "HealthcareDatasetIamPolicy",
    "HealthcareDatasetIamPolicyConfig",
    "HealthcareDatasetTimeouts",
    "HealthcareDicomStore",
    "HealthcareDicomStoreConfig",
    "HealthcareDicomStoreIamBinding",
    "HealthcareDicomStoreIamBindingCondition",
    "HealthcareDicomStoreIamBindingConfig",
    "HealthcareDicomStoreIamMember",
    "HealthcareDicomStoreIamMemberCondition",
    "HealthcareDicomStoreIamMemberConfig",
    "HealthcareDicomStoreIamPolicy",
    "HealthcareDicomStoreIamPolicyConfig",
    "HealthcareDicomStoreNotificationConfig",
    "HealthcareDicomStoreTimeouts",
    "HealthcareFhirStore",
    "HealthcareFhirStoreConfig",
    "HealthcareFhirStoreIamBinding",
    "HealthcareFhirStoreIamBindingCondition",
    "HealthcareFhirStoreIamBindingConfig",
    "HealthcareFhirStoreIamMember",
    "HealthcareFhirStoreIamMemberCondition",
    "HealthcareFhirStoreIamMemberConfig",
    "HealthcareFhirStoreIamPolicy",
    "HealthcareFhirStoreIamPolicyConfig",
    "HealthcareFhirStoreNotificationConfig",
    "HealthcareFhirStoreStreamConfigs",
    "HealthcareFhirStoreStreamConfigsBigqueryDestination",
    "HealthcareFhirStoreStreamConfigsBigqueryDestinationSchemaConfig",
    "HealthcareFhirStoreTimeouts",
    "HealthcareHl7V2Store",
    "HealthcareHl7V2StoreConfig",
    "HealthcareHl7V2StoreIamBinding",
    "HealthcareHl7V2StoreIamBindingCondition",
    "HealthcareHl7V2StoreIamBindingConfig",
    "HealthcareHl7V2StoreIamMember",
    "HealthcareHl7V2StoreIamMemberCondition",
    "HealthcareHl7V2StoreIamMemberConfig",
    "HealthcareHl7V2StoreIamPolicy",
    "HealthcareHl7V2StoreIamPolicyConfig",
    "HealthcareHl7V2StoreNotificationConfig",
    "HealthcareHl7V2StoreNotificationConfigs",
    "HealthcareHl7V2StoreParserConfig",
    "HealthcareHl7V2StoreTimeouts",
    "IapAppEngineServiceIamBinding",
    "IapAppEngineServiceIamBindingCondition",
    "IapAppEngineServiceIamBindingConfig",
    "IapAppEngineServiceIamMember",
    "IapAppEngineServiceIamMemberCondition",
    "IapAppEngineServiceIamMemberConfig",
    "IapAppEngineServiceIamPolicy",
    "IapAppEngineServiceIamPolicyConfig",
    "IapAppEngineVersionIamBinding",
    "IapAppEngineVersionIamBindingCondition",
    "IapAppEngineVersionIamBindingConfig",
    "IapAppEngineVersionIamMember",
    "IapAppEngineVersionIamMemberCondition",
    "IapAppEngineVersionIamMemberConfig",
    "IapAppEngineVersionIamPolicy",
    "IapAppEngineVersionIamPolicyConfig",
    "IapBrand",
    "IapBrandConfig",
    "IapBrandTimeouts",
    "IapClient",
    "IapClientConfig",
    "IapClientTimeouts",
    "IapTunnelInstanceIamBinding",
    "IapTunnelInstanceIamBindingCondition",
    "IapTunnelInstanceIamBindingConfig",
    "IapTunnelInstanceIamMember",
    "IapTunnelInstanceIamMemberCondition",
    "IapTunnelInstanceIamMemberConfig",
    "IapTunnelInstanceIamPolicy",
    "IapTunnelInstanceIamPolicyConfig",
    "IapWebBackendServiceIamBinding",
    "IapWebBackendServiceIamBindingCondition",
    "IapWebBackendServiceIamBindingConfig",
    "IapWebBackendServiceIamMember",
    "IapWebBackendServiceIamMemberCondition",
    "IapWebBackendServiceIamMemberConfig",
    "IapWebBackendServiceIamPolicy",
    "IapWebBackendServiceIamPolicyConfig",
    "IapWebIamBinding",
    "IapWebIamBindingCondition",
    "IapWebIamBindingConfig",
    "IapWebIamMember",
    "IapWebIamMemberCondition",
    "IapWebIamMemberConfig",
    "IapWebIamPolicy",
    "IapWebIamPolicyConfig",
    "IapWebTypeAppEngineIamBinding",
    "IapWebTypeAppEngineIamBindingCondition",
    "IapWebTypeAppEngineIamBindingConfig",
    "IapWebTypeAppEngineIamMember",
    "IapWebTypeAppEngineIamMemberCondition",
    "IapWebTypeAppEngineIamMemberConfig",
    "IapWebTypeAppEngineIamPolicy",
    "IapWebTypeAppEngineIamPolicyConfig",
    "IapWebTypeComputeIamBinding",
    "IapWebTypeComputeIamBindingCondition",
    "IapWebTypeComputeIamBindingConfig",
    "IapWebTypeComputeIamMember",
    "IapWebTypeComputeIamMemberCondition",
    "IapWebTypeComputeIamMemberConfig",
    "IapWebTypeComputeIamPolicy",
    "IapWebTypeComputeIamPolicyConfig",
    "IdentityPlatformDefaultSupportedIdpConfig",
    "IdentityPlatformDefaultSupportedIdpConfigConfig",
    "IdentityPlatformDefaultSupportedIdpConfigTimeouts",
    "IdentityPlatformInboundSamlConfig",
    "IdentityPlatformInboundSamlConfigConfig",
    "IdentityPlatformInboundSamlConfigIdpConfig",
    "IdentityPlatformInboundSamlConfigIdpConfigIdpCertificates",
    "IdentityPlatformInboundSamlConfigSpConfig",
    "IdentityPlatformInboundSamlConfigTimeouts",
    "IdentityPlatformOauthIdpConfig",
    "IdentityPlatformOauthIdpConfigConfig",
    "IdentityPlatformOauthIdpConfigTimeouts",
    "IdentityPlatformTenant",
    "IdentityPlatformTenantConfig",
    "IdentityPlatformTenantDefaultSupportedIdpConfig",
    "IdentityPlatformTenantDefaultSupportedIdpConfigConfig",
    "IdentityPlatformTenantDefaultSupportedIdpConfigTimeouts",
    "IdentityPlatformTenantInboundSamlConfig",
    "IdentityPlatformTenantInboundSamlConfigConfig",
    "IdentityPlatformTenantInboundSamlConfigIdpConfig",
    "IdentityPlatformTenantInboundSamlConfigIdpConfigIdpCertificates",
    "IdentityPlatformTenantInboundSamlConfigSpConfig",
    "IdentityPlatformTenantInboundSamlConfigTimeouts",
    "IdentityPlatformTenantOauthIdpConfig",
    "IdentityPlatformTenantOauthIdpConfigConfig",
    "IdentityPlatformTenantOauthIdpConfigTimeouts",
    "IdentityPlatformTenantTimeouts",
    "KmsCryptoKey",
    "KmsCryptoKeyConfig",
    "KmsCryptoKeyIamBinding",
    "KmsCryptoKeyIamBindingCondition",
    "KmsCryptoKeyIamBindingConfig",
    "KmsCryptoKeyIamMember",
    "KmsCryptoKeyIamMemberCondition",
    "KmsCryptoKeyIamMemberConfig",
    "KmsCryptoKeyIamPolicy",
    "KmsCryptoKeyIamPolicyConfig",
    "KmsCryptoKeyTimeouts",
    "KmsCryptoKeyVersionTemplate",
    "KmsKeyRing",
    "KmsKeyRingConfig",
    "KmsKeyRingIamBinding",
    "KmsKeyRingIamBindingCondition",
    "KmsKeyRingIamBindingConfig",
    "KmsKeyRingIamMember",
    "KmsKeyRingIamMemberCondition",
    "KmsKeyRingIamMemberConfig",
    "KmsKeyRingIamPolicy",
    "KmsKeyRingIamPolicyConfig",
    "KmsKeyRingImportJob",
    "KmsKeyRingImportJobAttestation",
    "KmsKeyRingImportJobConfig",
    "KmsKeyRingImportJobPublicKey",
    "KmsKeyRingImportJobTimeouts",
    "KmsKeyRingTimeouts",
    "KmsSecretCiphertext",
    "KmsSecretCiphertextConfig",
    "KmsSecretCiphertextTimeouts",
    "LoggingBillingAccountBucketConfig",
    "LoggingBillingAccountBucketConfigConfig",
    "LoggingBillingAccountExclusion",
    "LoggingBillingAccountExclusionConfig",
    "LoggingBillingAccountSink",
    "LoggingBillingAccountSinkBigqueryOptions",
    "LoggingBillingAccountSinkConfig",
    "LoggingFolderBucketConfig",
    "LoggingFolderBucketConfigConfig",
    "LoggingFolderExclusion",
    "LoggingFolderExclusionConfig",
    "LoggingFolderSink",
    "LoggingFolderSinkBigqueryOptions",
    "LoggingFolderSinkConfig",
    "LoggingMetric",
    "LoggingMetricBucketOptions",
    "LoggingMetricBucketOptionsExplicitBuckets",
    "LoggingMetricBucketOptionsExponentialBuckets",
    "LoggingMetricBucketOptionsLinearBuckets",
    "LoggingMetricConfig",
    "LoggingMetricMetricDescriptor",
    "LoggingMetricMetricDescriptorLabels",
    "LoggingMetricTimeouts",
    "LoggingOrganizationBucketConfig",
    "LoggingOrganizationBucketConfigConfig",
    "LoggingOrganizationExclusion",
    "LoggingOrganizationExclusionConfig",
    "LoggingOrganizationSink",
    "LoggingOrganizationSinkBigqueryOptions",
    "LoggingOrganizationSinkConfig",
    "LoggingProjectBucketConfig",
    "LoggingProjectBucketConfigConfig",
    "LoggingProjectExclusion",
    "LoggingProjectExclusionConfig",
    "LoggingProjectSink",
    "LoggingProjectSinkBigqueryOptions",
    "LoggingProjectSinkConfig",
    "MlEngineModel",
    "MlEngineModelConfig",
    "MlEngineModelDefaultVersion",
    "MlEngineModelTimeouts",
    "MonitoringAlertPolicy",
    "MonitoringAlertPolicyConditions",
    "MonitoringAlertPolicyConditionsConditionAbsent",
    "MonitoringAlertPolicyConditionsConditionAbsentAggregations",
    "MonitoringAlertPolicyConditionsConditionAbsentTrigger",
    "MonitoringAlertPolicyConditionsConditionThreshold",
    "MonitoringAlertPolicyConditionsConditionThresholdAggregations",
    "MonitoringAlertPolicyConditionsConditionThresholdDenominatorAggregations",
    "MonitoringAlertPolicyConditionsConditionThresholdTrigger",
    "MonitoringAlertPolicyConfig",
    "MonitoringAlertPolicyCreationRecord",
    "MonitoringAlertPolicyDocumentation",
    "MonitoringAlertPolicyTimeouts",
    "MonitoringCustomService",
    "MonitoringCustomServiceConfig",
    "MonitoringCustomServiceTelemetry",
    "MonitoringCustomServiceTimeouts",
    "MonitoringDashboard",
    "MonitoringDashboardConfig",
    "MonitoringDashboardTimeouts",
    "MonitoringGroup",
    "MonitoringGroupConfig",
    "MonitoringGroupTimeouts",
    "MonitoringMetricDescriptor",
    "MonitoringMetricDescriptorConfig",
    "MonitoringMetricDescriptorLabels",
    "MonitoringMetricDescriptorMetadata",
    "MonitoringMetricDescriptorTimeouts",
    "MonitoringNotificationChannel",
    "MonitoringNotificationChannelConfig",
    "MonitoringNotificationChannelSensitiveLabels",
    "MonitoringNotificationChannelTimeouts",
    "MonitoringSlo",
    "MonitoringSloBasicSli",
    "MonitoringSloBasicSliLatency",
    "MonitoringSloConfig",
    "MonitoringSloRequestBasedSli",
    "MonitoringSloRequestBasedSliDistributionCut",
    "MonitoringSloRequestBasedSliDistributionCutRange",
    "MonitoringSloRequestBasedSliGoodTotalRatio",
    "MonitoringSloTimeouts",
    "MonitoringSloWindowsBasedSli",
    "MonitoringSloWindowsBasedSliGoodTotalRatioThreshold",
    "MonitoringSloWindowsBasedSliGoodTotalRatioThresholdBasicSliPerformance",
    "MonitoringSloWindowsBasedSliGoodTotalRatioThresholdBasicSliPerformanceLatency",
    "MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformance",
    "MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceDistributionCut",
    "MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceDistributionCutRange",
    "MonitoringSloWindowsBasedSliGoodTotalRatioThresholdPerformanceGoodTotalRatio",
    "MonitoringSloWindowsBasedSliMetricMeanInRange",
    "MonitoringSloWindowsBasedSliMetricMeanInRangeRange",
    "MonitoringSloWindowsBasedSliMetricSumInRange",
    "MonitoringSloWindowsBasedSliMetricSumInRangeRange",
    "MonitoringUptimeCheckConfig",
    "MonitoringUptimeCheckConfigConfig",
    "MonitoringUptimeCheckConfigContentMatchers",
    "MonitoringUptimeCheckConfigHttpCheck",
    "MonitoringUptimeCheckConfigHttpCheckAuthInfo",
    "MonitoringUptimeCheckConfigInternalCheckers",
    "MonitoringUptimeCheckConfigMonitoredResource",
    "MonitoringUptimeCheckConfigResourceGroup",
    "MonitoringUptimeCheckConfigTcpCheck",
    "MonitoringUptimeCheckConfigTimeouts",
    "NetworkManagementConnectivityTest",
    "NetworkManagementConnectivityTestConfig",
    "NetworkManagementConnectivityTestDestination",
    "NetworkManagementConnectivityTestSource",
    "NetworkManagementConnectivityTestTimeouts",
    "OrganizationIamAuditConfig",
    "OrganizationIamAuditConfigAuditLogConfig",
    "OrganizationIamAuditConfigConfig",
    "OrganizationIamBinding",
    "OrganizationIamBindingCondition",
    "OrganizationIamBindingConfig",
    "OrganizationIamCustomRole",
    "OrganizationIamCustomRoleConfig",
    "OrganizationIamMember",
    "OrganizationIamMemberCondition",
    "OrganizationIamMemberConfig",
    "OrganizationIamPolicy",
    "OrganizationIamPolicyConfig",
    "OrganizationPolicy",
    "OrganizationPolicyBooleanPolicy",
    "OrganizationPolicyConfig",
    "OrganizationPolicyListPolicy",
    "OrganizationPolicyListPolicyAllow",
    "OrganizationPolicyListPolicyDeny",
    "OrganizationPolicyRestorePolicy",
    "OrganizationPolicyTimeouts",
    "OsConfigPatchDeployment",
    "OsConfigPatchDeploymentConfig",
    "OsConfigPatchDeploymentInstanceFilter",
    "OsConfigPatchDeploymentInstanceFilterGroupLabels",
    "OsConfigPatchDeploymentOneTimeSchedule",
    "OsConfigPatchDeploymentPatchConfig",
    "OsConfigPatchDeploymentPatchConfigApt",
    "OsConfigPatchDeploymentPatchConfigGoo",
    "OsConfigPatchDeploymentPatchConfigPostStep",
    "OsConfigPatchDeploymentPatchConfigPostStepLinuxExecStepConfig",
    "OsConfigPatchDeploymentPatchConfigPostStepLinuxExecStepConfigGcsObject",
    "OsConfigPatchDeploymentPatchConfigPostStepWindowsExecStepConfig",
    "OsConfigPatchDeploymentPatchConfigPostStepWindowsExecStepConfigGcsObject",
    "OsConfigPatchDeploymentPatchConfigPreStep",
    "OsConfigPatchDeploymentPatchConfigPreStepLinuxExecStepConfig",
    "OsConfigPatchDeploymentPatchConfigPreStepLinuxExecStepConfigGcsObject",
    "OsConfigPatchDeploymentPatchConfigPreStepWindowsExecStepConfig",
    "OsConfigPatchDeploymentPatchConfigPreStepWindowsExecStepConfigGcsObject",
    "OsConfigPatchDeploymentPatchConfigWindowsUpdate",
    "OsConfigPatchDeploymentPatchConfigYum",
    "OsConfigPatchDeploymentPatchConfigZypper",
    "OsConfigPatchDeploymentRecurringSchedule",
    "OsConfigPatchDeploymentRecurringScheduleMonthly",
    "OsConfigPatchDeploymentRecurringScheduleMonthlyWeekDayOfMonth",
    "OsConfigPatchDeploymentRecurringScheduleTimeOfDay",
    "OsConfigPatchDeploymentRecurringScheduleTimeZone",
    "OsConfigPatchDeploymentRecurringScheduleWeekly",
    "OsConfigPatchDeploymentTimeouts",
    "OsLoginSshPublicKey",
    "OsLoginSshPublicKeyConfig",
    "OsLoginSshPublicKeyTimeouts",
    "Project",
    "ProjectConfig",
    "ProjectIamAuditConfig",
    "ProjectIamAuditConfigAuditLogConfig",
    "ProjectIamAuditConfigConfig",
    "ProjectIamBinding",
    "ProjectIamBindingCondition",
    "ProjectIamBindingConfig",
    "ProjectIamCustomRole",
    "ProjectIamCustomRoleConfig",
    "ProjectIamMember",
    "ProjectIamMemberCondition",
    "ProjectIamMemberConfig",
    "ProjectIamPolicy",
    "ProjectIamPolicyConfig",
    "ProjectOrganizationPolicy",
    "ProjectOrganizationPolicyBooleanPolicy",
    "ProjectOrganizationPolicyConfig",
    "ProjectOrganizationPolicyListPolicy",
    "ProjectOrganizationPolicyListPolicyAllow",
    "ProjectOrganizationPolicyListPolicyDeny",
    "ProjectOrganizationPolicyRestorePolicy",
    "ProjectOrganizationPolicyTimeouts",
    "ProjectService",
    "ProjectServiceConfig",
    "ProjectServiceTimeouts",
    "ProjectTimeouts",
    "ProjectUsageExportBucket",
    "ProjectUsageExportBucketConfig",
    "ProjectUsageExportBucketTimeouts",
    "PubsubSubscription",
    "PubsubSubscriptionConfig",
    "PubsubSubscriptionDeadLetterPolicy",
    "PubsubSubscriptionExpirationPolicy",
    "PubsubSubscriptionIamBinding",
    "PubsubSubscriptionIamBindingCondition",
    "PubsubSubscriptionIamBindingConfig",
    "PubsubSubscriptionIamMember",
    "PubsubSubscriptionIamMemberCondition",
    "PubsubSubscriptionIamMemberConfig",
    "PubsubSubscriptionIamPolicy",
    "PubsubSubscriptionIamPolicyConfig",
    "PubsubSubscriptionPushConfig",
    "PubsubSubscriptionPushConfigOidcToken",
    "PubsubSubscriptionTimeouts",
    "PubsubTopic",
    "PubsubTopicConfig",
    "PubsubTopicIamBinding",
    "PubsubTopicIamBindingCondition",
    "PubsubTopicIamBindingConfig",
    "PubsubTopicIamMember",
    "PubsubTopicIamMemberCondition",
    "PubsubTopicIamMemberConfig",
    "PubsubTopicIamPolicy",
    "PubsubTopicIamPolicyConfig",
    "PubsubTopicMessageStoragePolicy",
    "PubsubTopicTimeouts",
    "RedisInstance",
    "RedisInstanceConfig",
    "RedisInstanceTimeouts",
    "ResourceManagerLien",
    "ResourceManagerLienConfig",
    "ResourceManagerLienTimeouts",
    "RuntimeconfigConfig",
    "RuntimeconfigConfigConfig",
    "RuntimeconfigConfigIamBinding",
    "RuntimeconfigConfigIamBindingCondition",
    "RuntimeconfigConfigIamBindingConfig",
    "RuntimeconfigConfigIamMember",
    "RuntimeconfigConfigIamMemberCondition",
    "RuntimeconfigConfigIamMemberConfig",
    "RuntimeconfigConfigIamPolicy",
    "RuntimeconfigConfigIamPolicyConfig",
    "RuntimeconfigVariable",
    "RuntimeconfigVariableConfig",
    "SccSource",
    "SccSourceConfig",
    "SccSourceTimeouts",
    "SecretManagerSecret",
    "SecretManagerSecretConfig",
    "SecretManagerSecretIamBinding",
    "SecretManagerSecretIamBindingCondition",
    "SecretManagerSecretIamBindingConfig",
    "SecretManagerSecretIamMember",
    "SecretManagerSecretIamMemberCondition",
    "SecretManagerSecretIamMemberConfig",
    "SecretManagerSecretIamPolicy",
    "SecretManagerSecretIamPolicyConfig",
    "SecretManagerSecretReplication",
    "SecretManagerSecretReplicationUserManaged",
    "SecretManagerSecretReplicationUserManagedReplicas",
    "SecretManagerSecretTimeouts",
    "SecretManagerSecretVersion",
    "SecretManagerSecretVersionConfig",
    "SecretManagerSecretVersionTimeouts",
    "ServiceAccount",
    "ServiceAccountConfig",
    "ServiceAccountIamBinding",
    "ServiceAccountIamBindingCondition",
    "ServiceAccountIamBindingConfig",
    "ServiceAccountIamMember",
    "ServiceAccountIamMemberCondition",
    "ServiceAccountIamMemberConfig",
    "ServiceAccountIamPolicy",
    "ServiceAccountIamPolicyConfig",
    "ServiceAccountKey",
    "ServiceAccountKeyConfig",
    "ServiceAccountTimeouts",
    "ServiceNetworkingConnection",
    "ServiceNetworkingConnectionConfig",
    "ServiceNetworkingConnectionTimeouts",
    "SourcerepoRepository",
    "SourcerepoRepositoryConfig",
    "SourcerepoRepositoryIamBinding",
    "SourcerepoRepositoryIamBindingCondition",
    "SourcerepoRepositoryIamBindingConfig",
    "SourcerepoRepositoryIamMember",
    "SourcerepoRepositoryIamMemberCondition",
    "SourcerepoRepositoryIamMemberConfig",
    "SourcerepoRepositoryIamPolicy",
    "SourcerepoRepositoryIamPolicyConfig",
    "SourcerepoRepositoryPubsubConfigs",
    "SourcerepoRepositoryTimeouts",
    "SpannerDatabase",
    "SpannerDatabaseConfig",
    "SpannerDatabaseIamBinding",
    "SpannerDatabaseIamBindingCondition",
    "SpannerDatabaseIamBindingConfig",
    "SpannerDatabaseIamMember",
    "SpannerDatabaseIamMemberCondition",
    "SpannerDatabaseIamMemberConfig",
    "SpannerDatabaseIamPolicy",
    "SpannerDatabaseIamPolicyConfig",
    "SpannerDatabaseTimeouts",
    "SpannerInstance",
    "SpannerInstanceConfig",
    "SpannerInstanceIamBinding",
    "SpannerInstanceIamBindingCondition",
    "SpannerInstanceIamBindingConfig",
    "SpannerInstanceIamMember",
    "SpannerInstanceIamMemberCondition",
    "SpannerInstanceIamMemberConfig",
    "SpannerInstanceIamPolicy",
    "SpannerInstanceIamPolicyConfig",
    "SpannerInstanceTimeouts",
    "SqlDatabase",
    "SqlDatabaseConfig",
    "SqlDatabaseInstance",
    "SqlDatabaseInstanceConfig",
    "SqlDatabaseInstanceIpAddress",
    "SqlDatabaseInstanceReplicaConfiguration",
    "SqlDatabaseInstanceServerCaCert",
    "SqlDatabaseInstanceSettings",
    "SqlDatabaseInstanceSettingsBackupConfiguration",
    "SqlDatabaseInstanceSettingsDatabaseFlags",
    "SqlDatabaseInstanceSettingsIpConfiguration",
    "SqlDatabaseInstanceSettingsIpConfigurationAuthorizedNetworks",
    "SqlDatabaseInstanceSettingsLocationPreference",
    "SqlDatabaseInstanceSettingsMaintenanceWindow",
    "SqlDatabaseInstanceTimeouts",
    "SqlDatabaseTimeouts",
    "SqlSourceRepresentationInstance",
    "SqlSourceRepresentationInstanceConfig",
    "SqlSourceRepresentationInstanceTimeouts",
    "SqlSslCert",
    "SqlSslCertConfig",
    "SqlSslCertTimeouts",
    "SqlUser",
    "SqlUserConfig",
    "SqlUserTimeouts",
    "StorageBucket",
    "StorageBucketAccessControl",
    "StorageBucketAccessControlConfig",
    "StorageBucketAccessControlTimeouts",
    "StorageBucketAcl",
    "StorageBucketAclConfig",
    "StorageBucketConfig",
    "StorageBucketCors",
    "StorageBucketEncryption",
    "StorageBucketIamBinding",
    "StorageBucketIamBindingCondition",
    "StorageBucketIamBindingConfig",
    "StorageBucketIamMember",
    "StorageBucketIamMemberCondition",
    "StorageBucketIamMemberConfig",
    "StorageBucketIamPolicy",
    "StorageBucketIamPolicyConfig",
    "StorageBucketLifecycleRule",
    "StorageBucketLifecycleRuleAction",
    "StorageBucketLifecycleRuleCondition",
    "StorageBucketLogging",
    "StorageBucketObject",
    "StorageBucketObjectConfig",
    "StorageBucketRetentionPolicy",
    "StorageBucketVersioning",
    "StorageBucketWebsite",
    "StorageDefaultObjectAccessControl",
    "StorageDefaultObjectAccessControlConfig",
    "StorageDefaultObjectAccessControlProjectTeam",
    "StorageDefaultObjectAccessControlTimeouts",
    "StorageDefaultObjectAcl",
    "StorageDefaultObjectAclConfig",
    "StorageHmacKey",
    "StorageHmacKeyConfig",
    "StorageHmacKeyTimeouts",
    "StorageNotification",
    "StorageNotificationConfig",
    "StorageObjectAccessControl",
    "StorageObjectAccessControlConfig",
    "StorageObjectAccessControlProjectTeam",
    "StorageObjectAccessControlTimeouts",
    "StorageObjectAcl",
    "StorageObjectAclConfig",
    "StorageTransferJob",
    "StorageTransferJobConfig",
    "StorageTransferJobSchedule",
    "StorageTransferJobScheduleScheduleEndDate",
    "StorageTransferJobScheduleScheduleStartDate",
    "StorageTransferJobScheduleStartTimeOfDay",
    "StorageTransferJobTransferSpec",
    "StorageTransferJobTransferSpecAwsS3DataSource",
    "StorageTransferJobTransferSpecAwsS3DataSourceAwsAccessKey",
    "StorageTransferJobTransferSpecGcsDataSink",
    "StorageTransferJobTransferSpecGcsDataSource",
    "StorageTransferJobTransferSpecHttpDataSource",
    "StorageTransferJobTransferSpecObjectConditions",
    "StorageTransferJobTransferSpecTransferOptions",
    "TpuNode",
    "TpuNodeConfig",
    "TpuNodeNetworkEndpoints",
    "TpuNodeSchedulingConfig",
    "TpuNodeTimeouts",
    "VpcAccessConnector",
    "VpcAccessConnectorConfig",
    "VpcAccessConnectorTimeouts",
]

publication.publish()
