// *** WARNING: this file was generated by pulumi-java-gen. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***

package com.pulumi.gcp.container.inputs;

import com.pulumi.core.Output;
import com.pulumi.core.annotations.Import;
import com.pulumi.gcp.container.inputs.ClusterAddonsConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterAuthenticatorGroupsConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterBinaryAuthorizationArgs;
import com.pulumi.gcp.container.inputs.ClusterClusterAutoscalingArgs;
import com.pulumi.gcp.container.inputs.ClusterClusterTelemetryArgs;
import com.pulumi.gcp.container.inputs.ClusterConfidentialNodesArgs;
import com.pulumi.gcp.container.inputs.ClusterCostManagementConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterDatabaseEncryptionArgs;
import com.pulumi.gcp.container.inputs.ClusterDefaultSnatStatusArgs;
import com.pulumi.gcp.container.inputs.ClusterDnsConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterEnableK8sBetaApisArgs;
import com.pulumi.gcp.container.inputs.ClusterGatewayApiConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterIdentityServiceConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterIpAllocationPolicyArgs;
import com.pulumi.gcp.container.inputs.ClusterLoggingConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterMaintenancePolicyArgs;
import com.pulumi.gcp.container.inputs.ClusterMasterAuthArgs;
import com.pulumi.gcp.container.inputs.ClusterMasterAuthorizedNetworksConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterMeshCertificatesArgs;
import com.pulumi.gcp.container.inputs.ClusterMonitoringConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterNetworkPolicyArgs;
import com.pulumi.gcp.container.inputs.ClusterNodeConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterNodePoolArgs;
import com.pulumi.gcp.container.inputs.ClusterNodePoolAutoConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterNodePoolDefaultsArgs;
import com.pulumi.gcp.container.inputs.ClusterNotificationConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterPodSecurityPolicyConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterPrivateClusterConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterProtectConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterReleaseChannelArgs;
import com.pulumi.gcp.container.inputs.ClusterResourceUsageExportConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterSecurityPostureConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterServiceExternalIpsConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterTpuConfigArgs;
import com.pulumi.gcp.container.inputs.ClusterVerticalPodAutoscalingArgs;
import com.pulumi.gcp.container.inputs.ClusterWorkloadIdentityConfigArgs;
import java.lang.Boolean;
import java.lang.Integer;
import java.lang.String;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Nullable;


public final class ClusterState extends com.pulumi.resources.ResourceArgs {

    public static final ClusterState Empty = new ClusterState();

    /**
     * The configuration for addons supported by GKE.
     * Structure is documented below.
     * 
     */
    @Import(name="addonsConfig")
    private @Nullable Output<ClusterAddonsConfigArgs> addonsConfig;

    /**
     * @return The configuration for addons supported by GKE.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterAddonsConfigArgs>> addonsConfig() {
        return Optional.ofNullable(this.addonsConfig);
    }

    /**
     * Enable NET_ADMIN for the cluster. Defaults to
     * `false`. This field should only be enabled for Autopilot clusters (`enable_autopilot`
     * set to `true`).
     * 
     */
    @Import(name="allowNetAdmin")
    private @Nullable Output<Boolean> allowNetAdmin;

    /**
     * @return Enable NET_ADMIN for the cluster. Defaults to
     * `false`. This field should only be enabled for Autopilot clusters (`enable_autopilot`
     * set to `true`).
     * 
     */
    public Optional<Output<Boolean>> allowNetAdmin() {
        return Optional.ofNullable(this.allowNetAdmin);
    }

    /**
     * Configuration for the
     * [Google Groups for GKE](https://cloud.google.com/kubernetes-engine/docs/how-to/role-based-access-control#groups-setup-gsuite) feature.
     * Structure is documented below.
     * 
     */
    @Import(name="authenticatorGroupsConfig")
    private @Nullable Output<ClusterAuthenticatorGroupsConfigArgs> authenticatorGroupsConfig;

    /**
     * @return Configuration for the
     * [Google Groups for GKE](https://cloud.google.com/kubernetes-engine/docs/how-to/role-based-access-control#groups-setup-gsuite) feature.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterAuthenticatorGroupsConfigArgs>> authenticatorGroupsConfig() {
        return Optional.ofNullable(this.authenticatorGroupsConfig);
    }

    /**
     * Configuration options for the Binary
     * Authorization feature. Structure is documented below.
     * 
     */
    @Import(name="binaryAuthorization")
    private @Nullable Output<ClusterBinaryAuthorizationArgs> binaryAuthorization;

    /**
     * @return Configuration options for the Binary
     * Authorization feature. Structure is documented below.
     * 
     */
    public Optional<Output<ClusterBinaryAuthorizationArgs>> binaryAuthorization() {
        return Optional.ofNullable(this.binaryAuthorization);
    }

    /**
     * Per-cluster configuration of Node Auto-Provisioning with Cluster Autoscaler to
     * automatically adjust the size of the cluster and create/delete node pools based
     * on the current needs of the cluster&#39;s workload. See the
     * [guide to using Node Auto-Provisioning](https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning)
     * for more details. Structure is documented below.
     * 
     */
    @Import(name="clusterAutoscaling")
    private @Nullable Output<ClusterClusterAutoscalingArgs> clusterAutoscaling;

    /**
     * @return Per-cluster configuration of Node Auto-Provisioning with Cluster Autoscaler to
     * automatically adjust the size of the cluster and create/delete node pools based
     * on the current needs of the cluster&#39;s workload. See the
     * [guide to using Node Auto-Provisioning](https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning)
     * for more details. Structure is documented below.
     * 
     */
    public Optional<Output<ClusterClusterAutoscalingArgs>> clusterAutoscaling() {
        return Optional.ofNullable(this.clusterAutoscaling);
    }

    /**
     * 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.
     * 
     */
    @Import(name="clusterIpv4Cidr")
    private @Nullable Output<String> clusterIpv4Cidr;

    /**
     * @return 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.
     * 
     */
    public Optional<Output<String>> clusterIpv4Cidr() {
        return Optional.ofNullable(this.clusterIpv4Cidr);
    }

    /**
     * Configuration for
     * [ClusterTelemetry](https://cloud.google.com/monitoring/kubernetes-engine/installing#controlling_the_collection_of_application_logs) feature,
     * Structure is documented below.
     * 
     */
    @Import(name="clusterTelemetry")
    private @Nullable Output<ClusterClusterTelemetryArgs> clusterTelemetry;

    /**
     * @return Configuration for
     * [ClusterTelemetry](https://cloud.google.com/monitoring/kubernetes-engine/installing#controlling_the_collection_of_application_logs) feature,
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterClusterTelemetryArgs>> clusterTelemetry() {
        return Optional.ofNullable(this.clusterTelemetry);
    }

    /**
     * Configuration for [Confidential Nodes](https://cloud.google.com/kubernetes-engine/docs/how-to/confidential-gke-nodes) feature. Structure is documented below documented below.
     * 
     */
    @Import(name="confidentialNodes")
    private @Nullable Output<ClusterConfidentialNodesArgs> confidentialNodes;

    /**
     * @return Configuration for [Confidential Nodes](https://cloud.google.com/kubernetes-engine/docs/how-to/confidential-gke-nodes) feature. Structure is documented below documented below.
     * 
     */
    public Optional<Output<ClusterConfidentialNodesArgs>> confidentialNodes() {
        return Optional.ofNullable(this.confidentialNodes);
    }

    /**
     * Configuration for the
     * [Cost Allocation](https://cloud.google.com/kubernetes-engine/docs/how-to/cost-allocations) feature.
     * Structure is documented below.
     * 
     */
    @Import(name="costManagementConfig")
    private @Nullable Output<ClusterCostManagementConfigArgs> costManagementConfig;

    /**
     * @return Configuration for the
     * [Cost Allocation](https://cloud.google.com/kubernetes-engine/docs/how-to/cost-allocations) feature.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterCostManagementConfigArgs>> costManagementConfig() {
        return Optional.ofNullable(this.costManagementConfig);
    }

    /**
     * Structure is documented below.
     * 
     */
    @Import(name="databaseEncryption")
    private @Nullable Output<ClusterDatabaseEncryptionArgs> databaseEncryption;

    /**
     * @return Structure is documented below.
     * 
     */
    public Optional<Output<ClusterDatabaseEncryptionArgs>> databaseEncryption() {
        return Optional.ofNullable(this.databaseEncryption);
    }

    /**
     * The desired datapath provider for this cluster. This is set to `LEGACY_DATAPATH` by default, which uses the IPTables-based kube-proxy implementation. Set to `ADVANCED_DATAPATH` to enable Dataplane v2.
     * 
     */
    @Import(name="datapathProvider")
    private @Nullable Output<String> datapathProvider;

    /**
     * @return The desired datapath provider for this cluster. This is set to `LEGACY_DATAPATH` by default, which uses the IPTables-based kube-proxy implementation. Set to `ADVANCED_DATAPATH` to enable Dataplane v2.
     * 
     */
    public Optional<Output<String>> datapathProvider() {
        return Optional.ofNullable(this.datapathProvider);
    }

    /**
     * The default maximum number of pods
     * per node in this cluster. This doesn&#39;t work on &#34;routes-based&#34; clusters, clusters
     * that don&#39;t have IP Aliasing enabled. See the [official documentation](https://cloud.google.com/kubernetes-engine/docs/how-to/flexible-pod-cidr)
     * for more information.
     * 
     */
    @Import(name="defaultMaxPodsPerNode")
    private @Nullable Output<Integer> defaultMaxPodsPerNode;

    /**
     * @return The default maximum number of pods
     * per node in this cluster. This doesn&#39;t work on &#34;routes-based&#34; clusters, clusters
     * that don&#39;t have IP Aliasing enabled. See the [official documentation](https://cloud.google.com/kubernetes-engine/docs/how-to/flexible-pod-cidr)
     * for more information.
     * 
     */
    public Optional<Output<Integer>> defaultMaxPodsPerNode() {
        return Optional.ofNullable(this.defaultMaxPodsPerNode);
    }

    /**
     * [GKE SNAT](https://cloud.google.com/kubernetes-engine/docs/how-to/ip-masquerade-agent#how_ipmasq_works) DefaultSnatStatus contains the desired state of whether default sNAT should be disabled on the cluster, [API doc](https://cloud.google.com/kubernetes-engine/docs/reference/rest/v1beta1/projects.locations.clusters#networkconfig). Structure is documented below
     * 
     */
    @Import(name="defaultSnatStatus")
    private @Nullable Output<ClusterDefaultSnatStatusArgs> defaultSnatStatus;

    /**
     * @return [GKE SNAT](https://cloud.google.com/kubernetes-engine/docs/how-to/ip-masquerade-agent#how_ipmasq_works) DefaultSnatStatus contains the desired state of whether default sNAT should be disabled on the cluster, [API doc](https://cloud.google.com/kubernetes-engine/docs/reference/rest/v1beta1/projects.locations.clusters#networkconfig). Structure is documented below
     * 
     */
    public Optional<Output<ClusterDefaultSnatStatusArgs>> defaultSnatStatus() {
        return Optional.ofNullable(this.defaultSnatStatus);
    }

    /**
     * Description of the cluster.
     * 
     */
    @Import(name="description")
    private @Nullable Output<String> description;

    /**
     * @return Description of the cluster.
     * 
     */
    public Optional<Output<String>> description() {
        return Optional.ofNullable(this.description);
    }

    /**
     * Configuration for [Using Cloud DNS for GKE](https://cloud.google.com/kubernetes-engine/docs/how-to/cloud-dns). Structure is documented below.
     * 
     */
    @Import(name="dnsConfig")
    private @Nullable Output<ClusterDnsConfigArgs> dnsConfig;

    /**
     * @return Configuration for [Using Cloud DNS for GKE](https://cloud.google.com/kubernetes-engine/docs/how-to/cloud-dns). Structure is documented below.
     * 
     */
    public Optional<Output<ClusterDnsConfigArgs>> dnsConfig() {
        return Optional.ofNullable(this.dnsConfig);
    }

    /**
     * Enable Autopilot for this cluster. Defaults to `false`.
     * Note that when this option is enabled, certain features of Standard GKE are not available.
     * See the [official documentation](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview#comparison)
     * for available features.
     * 
     */
    @Import(name="enableAutopilot")
    private @Nullable Output<Boolean> enableAutopilot;

    /**
     * @return Enable Autopilot for this cluster. Defaults to `false`.
     * Note that when this option is enabled, certain features of Standard GKE are not available.
     * See the [official documentation](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview#comparison)
     * for available features.
     * 
     */
    public Optional<Output<Boolean>> enableAutopilot() {
        return Optional.ofNullable(this.enableAutopilot);
    }

    /**
     * Enable Binary Authorization for this cluster.
     * If enabled, all container images will be validated by Google Binary Authorization.
     * Deprecated in favor of `binary_authorization`.
     * 
     * @deprecated
     * Deprecated in favor of binary_authorization.
     * 
     */
    @Deprecated /* Deprecated in favor of binary_authorization. */
    @Import(name="enableBinaryAuthorization")
    private @Nullable Output<Boolean> enableBinaryAuthorization;

    /**
     * @return Enable Binary Authorization for this cluster.
     * If enabled, all container images will be validated by Google Binary Authorization.
     * Deprecated in favor of `binary_authorization`.
     * 
     * @deprecated
     * Deprecated in favor of binary_authorization.
     * 
     */
    @Deprecated /* Deprecated in favor of binary_authorization. */
    public Optional<Output<Boolean>> enableBinaryAuthorization() {
        return Optional.ofNullable(this.enableBinaryAuthorization);
    }

    /**
     * Whether Intra-node visibility is enabled for this cluster. This makes same node pod to pod traffic visible for VPC network.
     * 
     */
    @Import(name="enableIntranodeVisibility")
    private @Nullable Output<Boolean> enableIntranodeVisibility;

    /**
     * @return Whether Intra-node visibility is enabled for this cluster. This makes same node pod to pod traffic visible for VPC network.
     * 
     */
    public Optional<Output<Boolean>> enableIntranodeVisibility() {
        return Optional.ofNullable(this.enableIntranodeVisibility);
    }

    /**
     * Configuration for Kubernetes Beta APIs.
     * Structure is documented below.
     * 
     */
    @Import(name="enableK8sBetaApis")
    private @Nullable Output<ClusterEnableK8sBetaApisArgs> enableK8sBetaApis;

    /**
     * @return Configuration for Kubernetes Beta APIs.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterEnableK8sBetaApisArgs>> enableK8sBetaApis() {
        return Optional.ofNullable(this.enableK8sBetaApis);
    }

    /**
     * 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.
     * 
     */
    @Import(name="enableKubernetesAlpha")
    private @Nullable Output<Boolean> enableKubernetesAlpha;

    /**
     * @return 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.
     * 
     */
    public Optional<Output<Boolean>> enableKubernetesAlpha() {
        return Optional.ofNullable(this.enableKubernetesAlpha);
    }

    /**
     * Whether L4ILB Subsetting is enabled for this cluster.
     * 
     */
    @Import(name="enableL4IlbSubsetting")
    private @Nullable Output<Boolean> enableL4IlbSubsetting;

    /**
     * @return Whether L4ILB Subsetting is enabled for this cluster.
     * 
     */
    public Optional<Output<Boolean>> enableL4IlbSubsetting() {
        return Optional.ofNullable(this.enableL4IlbSubsetting);
    }

    /**
     * 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`
     * 
     */
    @Import(name="enableLegacyAbac")
    private @Nullable Output<Boolean> enableLegacyAbac;

    /**
     * @return 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`
     * 
     */
    public Optional<Output<Boolean>> enableLegacyAbac() {
        return Optional.ofNullable(this.enableLegacyAbac);
    }

    /**
     * )
     * Whether multi-networking is enabled for this cluster.
     * 
     */
    @Import(name="enableMultiNetworking")
    private @Nullable Output<Boolean> enableMultiNetworking;

    /**
     * @return )
     * Whether multi-networking is enabled for this cluster.
     * 
     */
    public Optional<Output<Boolean>> enableMultiNetworking() {
        return Optional.ofNullable(this.enableMultiNetworking);
    }

    /**
     * Enable Shielded Nodes features on all nodes in this cluster.  Defaults to `true`.
     * 
     */
    @Import(name="enableShieldedNodes")
    private @Nullable Output<Boolean> enableShieldedNodes;

    /**
     * @return Enable Shielded Nodes features on all nodes in this cluster.  Defaults to `true`.
     * 
     */
    public Optional<Output<Boolean>> enableShieldedNodes() {
        return Optional.ofNullable(this.enableShieldedNodes);
    }

    /**
     * Whether to enable Cloud TPU resources in this cluster.
     * See the [official documentation](https://cloud.google.com/tpu/docs/kubernetes-engine-setup).
     * 
     */
    @Import(name="enableTpu")
    private @Nullable Output<Boolean> enableTpu;

    /**
     * @return Whether to enable Cloud TPU resources in this cluster.
     * See the [official documentation](https://cloud.google.com/tpu/docs/kubernetes-engine-setup).
     * 
     */
    public Optional<Output<Boolean>> enableTpu() {
        return Optional.ofNullable(this.enableTpu);
    }

    /**
     * The IP address of this cluster&#39;s Kubernetes master.
     * 
     */
    @Import(name="endpoint")
    private @Nullable Output<String> endpoint;

    /**
     * @return The IP address of this cluster&#39;s Kubernetes master.
     * 
     */
    public Optional<Output<String>> endpoint() {
        return Optional.ofNullable(this.endpoint);
    }

    /**
     * Configuration for [GKE Gateway API controller](https://cloud.google.com/kubernetes-engine/docs/concepts/gateway-api). Structure is documented below.
     * 
     */
    @Import(name="gatewayApiConfig")
    private @Nullable Output<ClusterGatewayApiConfigArgs> gatewayApiConfig;

    /**
     * @return Configuration for [GKE Gateway API controller](https://cloud.google.com/kubernetes-engine/docs/concepts/gateway-api). Structure is documented below.
     * 
     */
    public Optional<Output<ClusterGatewayApiConfigArgs>> gatewayApiConfig() {
        return Optional.ofNullable(this.gatewayApiConfig);
    }

    /**
     * . Structure is documented below.
     * 
     */
    @Import(name="identityServiceConfig")
    private @Nullable Output<ClusterIdentityServiceConfigArgs> identityServiceConfig;

    /**
     * @return . Structure is documented below.
     * 
     */
    public Optional<Output<ClusterIdentityServiceConfigArgs>> identityServiceConfig() {
        return Optional.ofNullable(this.identityServiceConfig);
    }

    /**
     * The number of nodes to create in this
     * cluster&#39;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&#39;re using
     * `gcp.container.NodePool` objects with no default node pool, you&#39;ll need to
     * set this to a value of at least `1`, alongside setting
     * `remove_default_node_pool` to `true`.
     * 
     */
    @Import(name="initialNodeCount")
    private @Nullable Output<Integer> initialNodeCount;

    /**
     * @return The number of nodes to create in this
     * cluster&#39;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&#39;re using
     * `gcp.container.NodePool` objects with no default node pool, you&#39;ll need to
     * set this to a value of at least `1`, alongside setting
     * `remove_default_node_pool` to `true`.
     * 
     */
    public Optional<Output<Integer>> initialNodeCount() {
        return Optional.ofNullable(this.initialNodeCount);
    }

    /**
     * Configuration of cluster IP allocation for
     * VPC-native clusters. Adding this block enables [IP aliasing](https://cloud.google.com/kubernetes-engine/docs/how-to/ip-aliases),
     * making the cluster VPC-native instead of routes-based. Structure is documented
     * below.
     * 
     */
    @Import(name="ipAllocationPolicy")
    private @Nullable Output<ClusterIpAllocationPolicyArgs> ipAllocationPolicy;

    /**
     * @return Configuration of cluster IP allocation for
     * VPC-native clusters. Adding this block enables [IP aliasing](https://cloud.google.com/kubernetes-engine/docs/how-to/ip-aliases),
     * making the cluster VPC-native instead of routes-based. Structure is documented
     * below.
     * 
     */
    public Optional<Output<ClusterIpAllocationPolicyArgs>> ipAllocationPolicy() {
        return Optional.ofNullable(this.ipAllocationPolicy);
    }

    /**
     * The fingerprint of the set of labels for this cluster.
     * 
     */
    @Import(name="labelFingerprint")
    private @Nullable Output<String> labelFingerprint;

    /**
     * @return The fingerprint of the set of labels for this cluster.
     * 
     */
    public Optional<Output<String>> labelFingerprint() {
        return Optional.ofNullable(this.labelFingerprint);
    }

    /**
     * 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
     * 
     */
    @Import(name="location")
    private @Nullable Output<String> location;

    /**
     * @return 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
     * 
     */
    public Optional<Output<String>> location() {
        return Optional.ofNullable(this.location);
    }

    /**
     * Logging configuration for the cluster.
     * Structure is documented below.
     * 
     */
    @Import(name="loggingConfig")
    private @Nullable Output<ClusterLoggingConfigArgs> loggingConfig;

    /**
     * @return Logging configuration for the cluster.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterLoggingConfigArgs>> loggingConfig() {
        return Optional.ofNullable(this.loggingConfig);
    }

    /**
     * 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`
     * 
     */
    @Import(name="loggingService")
    private @Nullable Output<String> loggingService;

    /**
     * @return 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`
     * 
     */
    public Optional<Output<String>> loggingService() {
        return Optional.ofNullable(this.loggingService);
    }

    /**
     * The maintenance policy to use for the cluster. Structure is
     * documented below.
     * 
     */
    @Import(name="maintenancePolicy")
    private @Nullable Output<ClusterMaintenancePolicyArgs> maintenancePolicy;

    /**
     * @return The maintenance policy to use for the cluster. Structure is
     * documented below.
     * 
     */
    public Optional<Output<ClusterMaintenancePolicyArgs>> maintenancePolicy() {
        return Optional.ofNullable(this.maintenancePolicy);
    }

    /**
     * The authentication information for accessing the
     * Kubernetes master. Some values in this block are only returned by the API if
     * your service account has permission to get credentials for your GKE cluster. If
     * you see an unexpected diff unsetting your client cert, ensure you have the
     * `container.clusters.getCredentials` permission.
     * Structure is documented below.
     * 
     */
    @Import(name="masterAuth")
    private @Nullable Output<ClusterMasterAuthArgs> masterAuth;

    /**
     * @return The authentication information for accessing the
     * Kubernetes master. Some values in this block are only returned by the API if
     * your service account has permission to get credentials for your GKE cluster. If
     * you see an unexpected diff unsetting your client cert, ensure you have the
     * `container.clusters.getCredentials` permission.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterMasterAuthArgs>> masterAuth() {
        return Optional.ofNullable(this.masterAuth);
    }

    /**
     * The desired
     * configuration options for master authorized networks. Omit the
     * nested `cidr_blocks` attribute to disallow external access (except
     * the cluster node IPs, which GKE automatically whitelists).
     * Structure is documented below.
     * 
     */
    @Import(name="masterAuthorizedNetworksConfig")
    private @Nullable Output<ClusterMasterAuthorizedNetworksConfigArgs> masterAuthorizedNetworksConfig;

    /**
     * @return The desired
     * configuration options for master authorized networks. Omit the
     * nested `cidr_blocks` attribute to disallow external access (except
     * the cluster node IPs, which GKE automatically whitelists).
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterMasterAuthorizedNetworksConfigArgs>> masterAuthorizedNetworksConfig() {
        return Optional.ofNullable(this.masterAuthorizedNetworksConfig);
    }

    /**
     * The current version of the master in the cluster. This may
     * be different than the `min_master_version` set in the config if the master
     * has been updated by GKE.
     * 
     */
    @Import(name="masterVersion")
    private @Nullable Output<String> masterVersion;

    /**
     * @return The current version of the master in the cluster. This may
     * be different than the `min_master_version` set in the config if the master
     * has been updated by GKE.
     * 
     */
    public Optional<Output<String>> masterVersion() {
        return Optional.ofNullable(this.masterVersion);
    }

    /**
     * Structure is documented below.
     * 
     */
    @Import(name="meshCertificates")
    private @Nullable Output<ClusterMeshCertificatesArgs> meshCertificates;

    /**
     * @return Structure is documented below.
     * 
     */
    public Optional<Output<ClusterMeshCertificatesArgs>> meshCertificates() {
        return Optional.ofNullable(this.meshCertificates);
    }

    /**
     * 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&#39;s version will be set by GKE to the version of the most recent
     * official release (which is not necessarily the latest version).  Most users will find
     * the `gcp.container.getEngineVersions` data source useful - it indicates which versions
     * are available. If you intend to specify versions manually,
     * [the docs](https://cloud.google.com/kubernetes-engine/versioning-and-upgrades#specifying_cluster_version)
     * describe the various acceptable formats for this field.
     * 
     * &gt; If you are using the `gcp.container.getEngineVersions` datasource with a regional cluster, ensure that you have provided a `location`
     * to the datasource. A region can have a different set of supported versions than its corresponding zones, and not all zones in a
     * region are guaranteed to support the same version.
     * 
     */
    @Import(name="minMasterVersion")
    private @Nullable Output<String> minMasterVersion;

    /**
     * @return 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&#39;s version will be set by GKE to the version of the most recent
     * official release (which is not necessarily the latest version).  Most users will find
     * the `gcp.container.getEngineVersions` data source useful - it indicates which versions
     * are available. If you intend to specify versions manually,
     * [the docs](https://cloud.google.com/kubernetes-engine/versioning-and-upgrades#specifying_cluster_version)
     * describe the various acceptable formats for this field.
     * 
     * &gt; If you are using the `gcp.container.getEngineVersions` datasource with a regional cluster, ensure that you have provided a `location`
     * to the datasource. A region can have a different set of supported versions than its corresponding zones, and not all zones in a
     * region are guaranteed to support the same version.
     * 
     */
    public Optional<Output<String>> minMasterVersion() {
        return Optional.ofNullable(this.minMasterVersion);
    }

    /**
     * Monitoring configuration for the cluster.
     * Structure is documented below.
     * 
     */
    @Import(name="monitoringConfig")
    private @Nullable Output<ClusterMonitoringConfigArgs> monitoringConfig;

    /**
     * @return Monitoring configuration for the cluster.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterMonitoringConfigArgs>> monitoringConfig() {
        return Optional.ofNullable(this.monitoringConfig);
    }

    /**
     * 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`
     * 
     */
    @Import(name="monitoringService")
    private @Nullable Output<String> monitoringService;

    /**
     * @return 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`
     * 
     */
    public Optional<Output<String>> monitoringService() {
        return Optional.ofNullable(this.monitoringService);
    }

    /**
     * The name of the cluster, unique within the project and
     * location.
     * 
     * ***
     * 
     */
    @Import(name="name")
    private @Nullable Output<String> name;

    /**
     * @return The name of the cluster, unique within the project and
     * location.
     * 
     * ***
     * 
     */
    public Optional<Output<String>> name() {
        return Optional.ofNullable(this.name);
    }

    /**
     * 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.
     * 
     */
    @Import(name="network")
    private @Nullable Output<String> network;

    /**
     * @return 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.
     * 
     */
    public Optional<Output<String>> network() {
        return Optional.ofNullable(this.network);
    }

    /**
     * Configuration options for the
     * [NetworkPolicy](https://kubernetes.io/docs/concepts/services-networking/networkpolicies/)
     * feature. Structure is documented below.
     * 
     */
    @Import(name="networkPolicy")
    private @Nullable Output<ClusterNetworkPolicyArgs> networkPolicy;

    /**
     * @return Configuration options for the
     * [NetworkPolicy](https://kubernetes.io/docs/concepts/services-networking/networkpolicies/)
     * feature. Structure is documented below.
     * 
     */
    public Optional<Output<ClusterNetworkPolicyArgs>> networkPolicy() {
        return Optional.ofNullable(this.networkPolicy);
    }

    /**
     * Determines whether alias IPs or routes will be used for pod IPs in the cluster.
     * Options are `VPC_NATIVE` or `ROUTES`. `VPC_NATIVE` enables [IP aliasing](https://cloud.google.com/kubernetes-engine/docs/how-to/ip-aliases),
     * and requires the `ip_allocation_policy` block to be defined. By default, when this field is unspecified and no `ip_allocation_policy` blocks are set, GKE will create a `ROUTES`-based cluster.
     * 
     */
    @Import(name="networkingMode")
    private @Nullable Output<String> networkingMode;

    /**
     * @return Determines whether alias IPs or routes will be used for pod IPs in the cluster.
     * Options are `VPC_NATIVE` or `ROUTES`. `VPC_NATIVE` enables [IP aliasing](https://cloud.google.com/kubernetes-engine/docs/how-to/ip-aliases),
     * and requires the `ip_allocation_policy` block to be defined. By default, when this field is unspecified and no `ip_allocation_policy` blocks are set, GKE will create a `ROUTES`-based cluster.
     * 
     */
    public Optional<Output<String>> networkingMode() {
        return Optional.ofNullable(this.networkingMode);
    }

    /**
     * Parameters used in creating the default node pool.
     * Generally, this field should not be used at the same time as a
     * `gcp.container.NodePool` or a `node_pool` block; this configuration
     * manages the default node pool, which isn&#39;t recommended to be used.
     * Structure is documented below.
     * 
     */
    @Import(name="nodeConfig")
    private @Nullable Output<ClusterNodeConfigArgs> nodeConfig;

    /**
     * @return Parameters used in creating the default node pool.
     * Generally, this field should not be used at the same time as a
     * `gcp.container.NodePool` or a `node_pool` block; this configuration
     * manages the default node pool, which isn&#39;t recommended to be used.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterNodeConfigArgs>> nodeConfig() {
        return Optional.ofNullable(this.nodeConfig);
    }

    /**
     * The list of zones in which the cluster&#39;s nodes
     * are located. Nodes must be in the region of their regional cluster or in the
     * same region as their cluster&#39;s zone for zonal clusters. If this is specified for
     * a zonal cluster, omit the cluster&#39;s zone.
     * 
     * &gt; A &#34;multi-zonal&#34; cluster is a zonal cluster with at least one additional zone
     * defined; in a multi-zonal cluster, the cluster master is only present in a
     * single zone while nodes are present in each of the primary zone and the node
     * locations. In contrast, in a regional cluster, cluster master nodes are present
     * in multiple zones in the region. For that reason, regional clusters should be
     * preferred.
     * 
     */
    @Import(name="nodeLocations")
    private @Nullable Output<List<String>> nodeLocations;

    /**
     * @return The list of zones in which the cluster&#39;s nodes
     * are located. Nodes must be in the region of their regional cluster or in the
     * same region as their cluster&#39;s zone for zonal clusters. If this is specified for
     * a zonal cluster, omit the cluster&#39;s zone.
     * 
     * &gt; A &#34;multi-zonal&#34; cluster is a zonal cluster with at least one additional zone
     * defined; in a multi-zonal cluster, the cluster master is only present in a
     * single zone while nodes are present in each of the primary zone and the node
     * locations. In contrast, in a regional cluster, cluster master nodes are present
     * in multiple zones in the region. For that reason, regional clusters should be
     * preferred.
     * 
     */
    public Optional<Output<List<String>>> nodeLocations() {
        return Optional.ofNullable(this.nodeLocations);
    }

    /**
     * ) Node pool configs that apply to auto-provisioned node pools in
     * [autopilot](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview#comparison) clusters and
     * [node auto-provisioning](https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning)-enabled clusters. Structure is documented below.
     * 
     */
    @Import(name="nodePoolAutoConfig")
    private @Nullable Output<ClusterNodePoolAutoConfigArgs> nodePoolAutoConfig;

    /**
     * @return ) Node pool configs that apply to auto-provisioned node pools in
     * [autopilot](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview#comparison) clusters and
     * [node auto-provisioning](https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning)-enabled clusters. Structure is documented below.
     * 
     */
    public Optional<Output<ClusterNodePoolAutoConfigArgs>> nodePoolAutoConfig() {
        return Optional.ofNullable(this.nodePoolAutoConfig);
    }

    /**
     * Default NodePool settings for the entire cluster. These settings are overridden if specified on the specific NodePool object. Structure is documented below.
     * 
     */
    @Import(name="nodePoolDefaults")
    private @Nullable Output<ClusterNodePoolDefaultsArgs> nodePoolDefaults;

    /**
     * @return Default NodePool settings for the entire cluster. These settings are overridden if specified on the specific NodePool object. Structure is documented below.
     * 
     */
    public Optional<Output<ClusterNodePoolDefaultsArgs>> nodePoolDefaults() {
        return Optional.ofNullable(this.nodePoolDefaults);
    }

    /**
     * List of node pools associated with this cluster.
     * See gcp.container.NodePool for schema.
     * **Warning:** node pools defined inside a cluster can&#39;t be changed (or added/removed) after
     * cluster creation without deleting and recreating the entire cluster. Unless you absolutely need the ability
     * to say &#34;these are the _only_ node pools associated with this cluster&#34;, use the
     * gcp.container.NodePool resource instead of this property.
     * 
     */
    @Import(name="nodePools")
    private @Nullable Output<List<ClusterNodePoolArgs>> nodePools;

    /**
     * @return List of node pools associated with this cluster.
     * See gcp.container.NodePool for schema.
     * **Warning:** node pools defined inside a cluster can&#39;t be changed (or added/removed) after
     * cluster creation without deleting and recreating the entire cluster. Unless you absolutely need the ability
     * to say &#34;these are the _only_ node pools associated with this cluster&#34;, use the
     * gcp.container.NodePool resource instead of this property.
     * 
     */
    public Optional<Output<List<ClusterNodePoolArgs>>> nodePools() {
        return Optional.ofNullable(this.nodePools);
    }

    /**
     * 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&#39;s
     * recommended that you specify explicit versions as the provider will see spurious diffs
     * when fuzzy versions are used. See the `gcp.container.getEngineVersions` data source&#39;s
     * `version_prefix` field to approximate fuzzy versions.
     * To update nodes in other node pools, use the `version` attribute on the node pool.
     * 
     */
    @Import(name="nodeVersion")
    private @Nullable Output<String> nodeVersion;

    /**
     * @return 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&#39;s
     * recommended that you specify explicit versions as the provider will see spurious diffs
     * when fuzzy versions are used. See the `gcp.container.getEngineVersions` data source&#39;s
     * `version_prefix` field to approximate fuzzy versions.
     * To update nodes in other node pools, use the `version` attribute on the node pool.
     * 
     */
    public Optional<Output<String>> nodeVersion() {
        return Optional.ofNullable(this.nodeVersion);
    }

    /**
     * Configuration for the [cluster upgrade notifications](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-upgrade-notifications) feature. Structure is documented below.
     * 
     */
    @Import(name="notificationConfig")
    private @Nullable Output<ClusterNotificationConfigArgs> notificationConfig;

    /**
     * @return Configuration for the [cluster upgrade notifications](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-upgrade-notifications) feature. Structure is documented below.
     * 
     */
    public Optional<Output<ClusterNotificationConfigArgs>> notificationConfig() {
        return Optional.ofNullable(this.notificationConfig);
    }

    @Import(name="operation")
    private @Nullable Output<String> operation;

    public Optional<Output<String>> operation() {
        return Optional.ofNullable(this.operation);
    }

    /**
     * ) Configuration for the
     * [PodSecurityPolicy](https://cloud.google.com/kubernetes-engine/docs/how-to/pod-security-policies) feature.
     * Structure is documented below.
     * 
     */
    @Import(name="podSecurityPolicyConfig")
    private @Nullable Output<ClusterPodSecurityPolicyConfigArgs> podSecurityPolicyConfig;

    /**
     * @return ) Configuration for the
     * [PodSecurityPolicy](https://cloud.google.com/kubernetes-engine/docs/how-to/pod-security-policies) feature.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterPodSecurityPolicyConfigArgs>> podSecurityPolicyConfig() {
        return Optional.ofNullable(this.podSecurityPolicyConfig);
    }

    /**
     * Configuration for [private clusters](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters),
     * clusters with private nodes. Structure is documented below.
     * 
     */
    @Import(name="privateClusterConfig")
    private @Nullable Output<ClusterPrivateClusterConfigArgs> privateClusterConfig;

    /**
     * @return Configuration for [private clusters](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters),
     * clusters with private nodes. Structure is documented below.
     * 
     */
    public Optional<Output<ClusterPrivateClusterConfigArgs>> privateClusterConfig() {
        return Optional.ofNullable(this.privateClusterConfig);
    }

    /**
     * The desired state of IPv6 connectivity to Google Services. By default, no private IPv6 access to or from Google Services (all access will be via IPv4).
     * 
     */
    @Import(name="privateIpv6GoogleAccess")
    private @Nullable Output<String> privateIpv6GoogleAccess;

    /**
     * @return The desired state of IPv6 connectivity to Google Services. By default, no private IPv6 access to or from Google Services (all access will be via IPv4).
     * 
     */
    public Optional<Output<String>> privateIpv6GoogleAccess() {
        return Optional.ofNullable(this.privateIpv6GoogleAccess);
    }

    /**
     * The ID of the project in which the resource belongs. If it
     * is not provided, the provider project is used.
     * 
     */
    @Import(name="project")
    private @Nullable Output<String> project;

    /**
     * @return The ID of the project in which the resource belongs. If it
     * is not provided, the provider project is used.
     * 
     */
    public Optional<Output<String>> project() {
        return Optional.ofNullable(this.project);
    }

    /**
     * )
     * Enable/Disable Protect API features for the cluster. Structure is documented below.
     * 
     */
    @Import(name="protectConfig")
    private @Nullable Output<ClusterProtectConfigArgs> protectConfig;

    /**
     * @return )
     * Enable/Disable Protect API features for the cluster. Structure is documented below.
     * 
     */
    public Optional<Output<ClusterProtectConfigArgs>> protectConfig() {
        return Optional.ofNullable(this.protectConfig);
    }

    /**
     * Configuration options for the [Release channel](https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels)
     * feature, which provide more control over automatic upgrades of your GKE clusters.
     * When updating this field, GKE imposes specific version requirements. See
     * [Selecting a new release channel](https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels#selecting_a_new_release_channel)
     * for more details; the `gcp.container.getEngineVersions` datasource can provide
     * the default version for a channel. Note that removing the `release_channel`
     * field from your config will cause the provider to stop managing your cluster&#39;s
     * release channel, but will not unenroll it. Instead, use the `&#34;UNSPECIFIED&#34;`
     * channel. Structure is documented below.
     * 
     */
    @Import(name="releaseChannel")
    private @Nullable Output<ClusterReleaseChannelArgs> releaseChannel;

    /**
     * @return Configuration options for the [Release channel](https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels)
     * feature, which provide more control over automatic upgrades of your GKE clusters.
     * When updating this field, GKE imposes specific version requirements. See
     * [Selecting a new release channel](https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels#selecting_a_new_release_channel)
     * for more details; the `gcp.container.getEngineVersions` datasource can provide
     * the default version for a channel. Note that removing the `release_channel`
     * field from your config will cause the provider to stop managing your cluster&#39;s
     * release channel, but will not unenroll it. Instead, use the `&#34;UNSPECIFIED&#34;`
     * channel. Structure is documented below.
     * 
     */
    public Optional<Output<ClusterReleaseChannelArgs>> releaseChannel() {
        return Optional.ofNullable(this.releaseChannel);
    }

    /**
     * If `true`, deletes the default node
     * pool upon cluster creation. If you&#39;re using `gcp.container.NodePool`
     * resources with no default node pool, this should be set to `true`, alongside
     * setting `initial_node_count` to at least `1`.
     * 
     */
    @Import(name="removeDefaultNodePool")
    private @Nullable Output<Boolean> removeDefaultNodePool;

    /**
     * @return If `true`, deletes the default node
     * pool upon cluster creation. If you&#39;re using `gcp.container.NodePool`
     * resources with no default node pool, this should be set to `true`, alongside
     * setting `initial_node_count` to at least `1`.
     * 
     */
    public Optional<Output<Boolean>> removeDefaultNodePool() {
        return Optional.ofNullable(this.removeDefaultNodePool);
    }

    /**
     * The GCE resource labels (a map of key/value pairs) to be applied to the cluster.
     * 
     */
    @Import(name="resourceLabels")
    private @Nullable Output<Map<String,String>> resourceLabels;

    /**
     * @return The GCE resource labels (a map of key/value pairs) to be applied to the cluster.
     * 
     */
    public Optional<Output<Map<String,String>>> resourceLabels() {
        return Optional.ofNullable(this.resourceLabels);
    }

    /**
     * Configuration for the
     * [ResourceUsageExportConfig](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-usage-metering) feature.
     * Structure is documented below.
     * 
     */
    @Import(name="resourceUsageExportConfig")
    private @Nullable Output<ClusterResourceUsageExportConfigArgs> resourceUsageExportConfig;

    /**
     * @return Configuration for the
     * [ResourceUsageExportConfig](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-usage-metering) feature.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterResourceUsageExportConfigArgs>> resourceUsageExportConfig() {
        return Optional.ofNullable(this.resourceUsageExportConfig);
    }

    /**
     * Enable/Disable Security Posture API features for the cluster. Structure is documented below.
     * 
     * &lt;a name=&#34;nested_default_snat_status&#34;&gt;&lt;/a&gt;The `default_snat_status` block supports
     * 
     */
    @Import(name="securityPostureConfig")
    private @Nullable Output<ClusterSecurityPostureConfigArgs> securityPostureConfig;

    /**
     * @return Enable/Disable Security Posture API features for the cluster. Structure is documented below.
     * 
     * &lt;a name=&#34;nested_default_snat_status&#34;&gt;&lt;/a&gt;The `default_snat_status` block supports
     * 
     */
    public Optional<Output<ClusterSecurityPostureConfigArgs>> securityPostureConfig() {
        return Optional.ofNullable(this.securityPostureConfig);
    }

    /**
     * The server-defined URL for the resource.
     * 
     */
    @Import(name="selfLink")
    private @Nullable Output<String> selfLink;

    /**
     * @return The server-defined URL for the resource.
     * 
     */
    public Optional<Output<String>> selfLink() {
        return Optional.ofNullable(this.selfLink);
    }

    /**
     * Structure is documented below.
     * 
     */
    @Import(name="serviceExternalIpsConfig")
    private @Nullable Output<ClusterServiceExternalIpsConfigArgs> serviceExternalIpsConfig;

    /**
     * @return Structure is documented below.
     * 
     */
    public Optional<Output<ClusterServiceExternalIpsConfigArgs>> serviceExternalIpsConfig() {
        return Optional.ofNullable(this.serviceExternalIpsConfig);
    }

    /**
     * The IP address range of the Kubernetes services in this
     * cluster, in [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
     * notation (e.g. `1.2.3.4/29`). Service addresses are typically put in the last
     * `/16` from the container CIDR.
     * 
     */
    @Import(name="servicesIpv4Cidr")
    private @Nullable Output<String> servicesIpv4Cidr;

    /**
     * @return The IP address range of the Kubernetes services in this
     * cluster, in [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
     * notation (e.g. `1.2.3.4/29`). Service addresses are typically put in the last
     * `/16` from the container CIDR.
     * 
     */
    public Optional<Output<String>> servicesIpv4Cidr() {
        return Optional.ofNullable(this.servicesIpv4Cidr);
    }

    /**
     * The name or self_link of the Google Compute Engine
     * subnetwork in which the cluster&#39;s instances are launched.
     * 
     */
    @Import(name="subnetwork")
    private @Nullable Output<String> subnetwork;

    /**
     * @return The name or self_link of the Google Compute Engine
     * subnetwork in which the cluster&#39;s instances are launched.
     * 
     */
    public Optional<Output<String>> subnetwork() {
        return Optional.ofNullable(this.subnetwork);
    }

    /**
     * TPU configuration for the cluster.
     * 
     */
    @Import(name="tpuConfig")
    private @Nullable Output<ClusterTpuConfigArgs> tpuConfig;

    /**
     * @return TPU configuration for the cluster.
     * 
     */
    public Optional<Output<ClusterTpuConfigArgs>> tpuConfig() {
        return Optional.ofNullable(this.tpuConfig);
    }

    /**
     * The IP address range of the Cloud TPUs in this cluster, in
     * [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
     * notation (e.g. `1.2.3.4/29`).
     * 
     */
    @Import(name="tpuIpv4CidrBlock")
    private @Nullable Output<String> tpuIpv4CidrBlock;

    /**
     * @return The IP address range of the Cloud TPUs in this cluster, in
     * [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
     * notation (e.g. `1.2.3.4/29`).
     * 
     */
    public Optional<Output<String>> tpuIpv4CidrBlock() {
        return Optional.ofNullable(this.tpuIpv4CidrBlock);
    }

    /**
     * Vertical Pod Autoscaling automatically adjusts the resources of pods controlled by it.
     * Structure is documented below.
     * 
     */
    @Import(name="verticalPodAutoscaling")
    private @Nullable Output<ClusterVerticalPodAutoscalingArgs> verticalPodAutoscaling;

    /**
     * @return Vertical Pod Autoscaling automatically adjusts the resources of pods controlled by it.
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterVerticalPodAutoscalingArgs>> verticalPodAutoscaling() {
        return Optional.ofNullable(this.verticalPodAutoscaling);
    }

    /**
     * Workload Identity allows Kubernetes service accounts to act as a user-managed
     * [Google IAM Service Account](https://cloud.google.com/iam/docs/service-accounts#user-managed_service_accounts).
     * Structure is documented below.
     * 
     */
    @Import(name="workloadIdentityConfig")
    private @Nullable Output<ClusterWorkloadIdentityConfigArgs> workloadIdentityConfig;

    /**
     * @return Workload Identity allows Kubernetes service accounts to act as a user-managed
     * [Google IAM Service Account](https://cloud.google.com/iam/docs/service-accounts#user-managed_service_accounts).
     * Structure is documented below.
     * 
     */
    public Optional<Output<ClusterWorkloadIdentityConfigArgs>> workloadIdentityConfig() {
        return Optional.ofNullable(this.workloadIdentityConfig);
    }

    private ClusterState() {}

    private ClusterState(ClusterState $) {
        this.addonsConfig = $.addonsConfig;
        this.allowNetAdmin = $.allowNetAdmin;
        this.authenticatorGroupsConfig = $.authenticatorGroupsConfig;
        this.binaryAuthorization = $.binaryAuthorization;
        this.clusterAutoscaling = $.clusterAutoscaling;
        this.clusterIpv4Cidr = $.clusterIpv4Cidr;
        this.clusterTelemetry = $.clusterTelemetry;
        this.confidentialNodes = $.confidentialNodes;
        this.costManagementConfig = $.costManagementConfig;
        this.databaseEncryption = $.databaseEncryption;
        this.datapathProvider = $.datapathProvider;
        this.defaultMaxPodsPerNode = $.defaultMaxPodsPerNode;
        this.defaultSnatStatus = $.defaultSnatStatus;
        this.description = $.description;
        this.dnsConfig = $.dnsConfig;
        this.enableAutopilot = $.enableAutopilot;
        this.enableBinaryAuthorization = $.enableBinaryAuthorization;
        this.enableIntranodeVisibility = $.enableIntranodeVisibility;
        this.enableK8sBetaApis = $.enableK8sBetaApis;
        this.enableKubernetesAlpha = $.enableKubernetesAlpha;
        this.enableL4IlbSubsetting = $.enableL4IlbSubsetting;
        this.enableLegacyAbac = $.enableLegacyAbac;
        this.enableMultiNetworking = $.enableMultiNetworking;
        this.enableShieldedNodes = $.enableShieldedNodes;
        this.enableTpu = $.enableTpu;
        this.endpoint = $.endpoint;
        this.gatewayApiConfig = $.gatewayApiConfig;
        this.identityServiceConfig = $.identityServiceConfig;
        this.initialNodeCount = $.initialNodeCount;
        this.ipAllocationPolicy = $.ipAllocationPolicy;
        this.labelFingerprint = $.labelFingerprint;
        this.location = $.location;
        this.loggingConfig = $.loggingConfig;
        this.loggingService = $.loggingService;
        this.maintenancePolicy = $.maintenancePolicy;
        this.masterAuth = $.masterAuth;
        this.masterAuthorizedNetworksConfig = $.masterAuthorizedNetworksConfig;
        this.masterVersion = $.masterVersion;
        this.meshCertificates = $.meshCertificates;
        this.minMasterVersion = $.minMasterVersion;
        this.monitoringConfig = $.monitoringConfig;
        this.monitoringService = $.monitoringService;
        this.name = $.name;
        this.network = $.network;
        this.networkPolicy = $.networkPolicy;
        this.networkingMode = $.networkingMode;
        this.nodeConfig = $.nodeConfig;
        this.nodeLocations = $.nodeLocations;
        this.nodePoolAutoConfig = $.nodePoolAutoConfig;
        this.nodePoolDefaults = $.nodePoolDefaults;
        this.nodePools = $.nodePools;
        this.nodeVersion = $.nodeVersion;
        this.notificationConfig = $.notificationConfig;
        this.operation = $.operation;
        this.podSecurityPolicyConfig = $.podSecurityPolicyConfig;
        this.privateClusterConfig = $.privateClusterConfig;
        this.privateIpv6GoogleAccess = $.privateIpv6GoogleAccess;
        this.project = $.project;
        this.protectConfig = $.protectConfig;
        this.releaseChannel = $.releaseChannel;
        this.removeDefaultNodePool = $.removeDefaultNodePool;
        this.resourceLabels = $.resourceLabels;
        this.resourceUsageExportConfig = $.resourceUsageExportConfig;
        this.securityPostureConfig = $.securityPostureConfig;
        this.selfLink = $.selfLink;
        this.serviceExternalIpsConfig = $.serviceExternalIpsConfig;
        this.servicesIpv4Cidr = $.servicesIpv4Cidr;
        this.subnetwork = $.subnetwork;
        this.tpuConfig = $.tpuConfig;
        this.tpuIpv4CidrBlock = $.tpuIpv4CidrBlock;
        this.verticalPodAutoscaling = $.verticalPodAutoscaling;
        this.workloadIdentityConfig = $.workloadIdentityConfig;
    }

    public static Builder builder() {
        return new Builder();
    }
    public static Builder builder(ClusterState defaults) {
        return new Builder(defaults);
    }

    public static final class Builder {
        private ClusterState $;

        public Builder() {
            $ = new ClusterState();
        }

        public Builder(ClusterState defaults) {
            $ = new ClusterState(Objects.requireNonNull(defaults));
        }

        /**
         * @param addonsConfig The configuration for addons supported by GKE.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder addonsConfig(@Nullable Output<ClusterAddonsConfigArgs> addonsConfig) {
            $.addonsConfig = addonsConfig;
            return this;
        }

        /**
         * @param addonsConfig The configuration for addons supported by GKE.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder addonsConfig(ClusterAddonsConfigArgs addonsConfig) {
            return addonsConfig(Output.of(addonsConfig));
        }

        /**
         * @param allowNetAdmin Enable NET_ADMIN for the cluster. Defaults to
         * `false`. This field should only be enabled for Autopilot clusters (`enable_autopilot`
         * set to `true`).
         * 
         * @return builder
         * 
         */
        public Builder allowNetAdmin(@Nullable Output<Boolean> allowNetAdmin) {
            $.allowNetAdmin = allowNetAdmin;
            return this;
        }

        /**
         * @param allowNetAdmin Enable NET_ADMIN for the cluster. Defaults to
         * `false`. This field should only be enabled for Autopilot clusters (`enable_autopilot`
         * set to `true`).
         * 
         * @return builder
         * 
         */
        public Builder allowNetAdmin(Boolean allowNetAdmin) {
            return allowNetAdmin(Output.of(allowNetAdmin));
        }

        /**
         * @param authenticatorGroupsConfig Configuration for the
         * [Google Groups for GKE](https://cloud.google.com/kubernetes-engine/docs/how-to/role-based-access-control#groups-setup-gsuite) feature.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder authenticatorGroupsConfig(@Nullable Output<ClusterAuthenticatorGroupsConfigArgs> authenticatorGroupsConfig) {
            $.authenticatorGroupsConfig = authenticatorGroupsConfig;
            return this;
        }

        /**
         * @param authenticatorGroupsConfig Configuration for the
         * [Google Groups for GKE](https://cloud.google.com/kubernetes-engine/docs/how-to/role-based-access-control#groups-setup-gsuite) feature.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder authenticatorGroupsConfig(ClusterAuthenticatorGroupsConfigArgs authenticatorGroupsConfig) {
            return authenticatorGroupsConfig(Output.of(authenticatorGroupsConfig));
        }

        /**
         * @param binaryAuthorization Configuration options for the Binary
         * Authorization feature. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder binaryAuthorization(@Nullable Output<ClusterBinaryAuthorizationArgs> binaryAuthorization) {
            $.binaryAuthorization = binaryAuthorization;
            return this;
        }

        /**
         * @param binaryAuthorization Configuration options for the Binary
         * Authorization feature. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder binaryAuthorization(ClusterBinaryAuthorizationArgs binaryAuthorization) {
            return binaryAuthorization(Output.of(binaryAuthorization));
        }

        /**
         * @param clusterAutoscaling Per-cluster configuration of Node Auto-Provisioning with Cluster Autoscaler to
         * automatically adjust the size of the cluster and create/delete node pools based
         * on the current needs of the cluster&#39;s workload. See the
         * [guide to using Node Auto-Provisioning](https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning)
         * for more details. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder clusterAutoscaling(@Nullable Output<ClusterClusterAutoscalingArgs> clusterAutoscaling) {
            $.clusterAutoscaling = clusterAutoscaling;
            return this;
        }

        /**
         * @param clusterAutoscaling Per-cluster configuration of Node Auto-Provisioning with Cluster Autoscaler to
         * automatically adjust the size of the cluster and create/delete node pools based
         * on the current needs of the cluster&#39;s workload. See the
         * [guide to using Node Auto-Provisioning](https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning)
         * for more details. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder clusterAutoscaling(ClusterClusterAutoscalingArgs clusterAutoscaling) {
            return clusterAutoscaling(Output.of(clusterAutoscaling));
        }

        /**
         * @param clusterIpv4Cidr 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 builder
         * 
         */
        public Builder clusterIpv4Cidr(@Nullable Output<String> clusterIpv4Cidr) {
            $.clusterIpv4Cidr = clusterIpv4Cidr;
            return this;
        }

        /**
         * @param clusterIpv4Cidr 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 builder
         * 
         */
        public Builder clusterIpv4Cidr(String clusterIpv4Cidr) {
            return clusterIpv4Cidr(Output.of(clusterIpv4Cidr));
        }

        /**
         * @param clusterTelemetry Configuration for
         * [ClusterTelemetry](https://cloud.google.com/monitoring/kubernetes-engine/installing#controlling_the_collection_of_application_logs) feature,
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder clusterTelemetry(@Nullable Output<ClusterClusterTelemetryArgs> clusterTelemetry) {
            $.clusterTelemetry = clusterTelemetry;
            return this;
        }

        /**
         * @param clusterTelemetry Configuration for
         * [ClusterTelemetry](https://cloud.google.com/monitoring/kubernetes-engine/installing#controlling_the_collection_of_application_logs) feature,
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder clusterTelemetry(ClusterClusterTelemetryArgs clusterTelemetry) {
            return clusterTelemetry(Output.of(clusterTelemetry));
        }

        /**
         * @param confidentialNodes Configuration for [Confidential Nodes](https://cloud.google.com/kubernetes-engine/docs/how-to/confidential-gke-nodes) feature. Structure is documented below documented below.
         * 
         * @return builder
         * 
         */
        public Builder confidentialNodes(@Nullable Output<ClusterConfidentialNodesArgs> confidentialNodes) {
            $.confidentialNodes = confidentialNodes;
            return this;
        }

        /**
         * @param confidentialNodes Configuration for [Confidential Nodes](https://cloud.google.com/kubernetes-engine/docs/how-to/confidential-gke-nodes) feature. Structure is documented below documented below.
         * 
         * @return builder
         * 
         */
        public Builder confidentialNodes(ClusterConfidentialNodesArgs confidentialNodes) {
            return confidentialNodes(Output.of(confidentialNodes));
        }

        /**
         * @param costManagementConfig Configuration for the
         * [Cost Allocation](https://cloud.google.com/kubernetes-engine/docs/how-to/cost-allocations) feature.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder costManagementConfig(@Nullable Output<ClusterCostManagementConfigArgs> costManagementConfig) {
            $.costManagementConfig = costManagementConfig;
            return this;
        }

        /**
         * @param costManagementConfig Configuration for the
         * [Cost Allocation](https://cloud.google.com/kubernetes-engine/docs/how-to/cost-allocations) feature.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder costManagementConfig(ClusterCostManagementConfigArgs costManagementConfig) {
            return costManagementConfig(Output.of(costManagementConfig));
        }

        /**
         * @param databaseEncryption Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder databaseEncryption(@Nullable Output<ClusterDatabaseEncryptionArgs> databaseEncryption) {
            $.databaseEncryption = databaseEncryption;
            return this;
        }

        /**
         * @param databaseEncryption Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder databaseEncryption(ClusterDatabaseEncryptionArgs databaseEncryption) {
            return databaseEncryption(Output.of(databaseEncryption));
        }

        /**
         * @param datapathProvider The desired datapath provider for this cluster. This is set to `LEGACY_DATAPATH` by default, which uses the IPTables-based kube-proxy implementation. Set to `ADVANCED_DATAPATH` to enable Dataplane v2.
         * 
         * @return builder
         * 
         */
        public Builder datapathProvider(@Nullable Output<String> datapathProvider) {
            $.datapathProvider = datapathProvider;
            return this;
        }

        /**
         * @param datapathProvider The desired datapath provider for this cluster. This is set to `LEGACY_DATAPATH` by default, which uses the IPTables-based kube-proxy implementation. Set to `ADVANCED_DATAPATH` to enable Dataplane v2.
         * 
         * @return builder
         * 
         */
        public Builder datapathProvider(String datapathProvider) {
            return datapathProvider(Output.of(datapathProvider));
        }

        /**
         * @param defaultMaxPodsPerNode The default maximum number of pods
         * per node in this cluster. This doesn&#39;t work on &#34;routes-based&#34; clusters, clusters
         * that don&#39;t have IP Aliasing enabled. See the [official documentation](https://cloud.google.com/kubernetes-engine/docs/how-to/flexible-pod-cidr)
         * for more information.
         * 
         * @return builder
         * 
         */
        public Builder defaultMaxPodsPerNode(@Nullable Output<Integer> defaultMaxPodsPerNode) {
            $.defaultMaxPodsPerNode = defaultMaxPodsPerNode;
            return this;
        }

        /**
         * @param defaultMaxPodsPerNode The default maximum number of pods
         * per node in this cluster. This doesn&#39;t work on &#34;routes-based&#34; clusters, clusters
         * that don&#39;t have IP Aliasing enabled. See the [official documentation](https://cloud.google.com/kubernetes-engine/docs/how-to/flexible-pod-cidr)
         * for more information.
         * 
         * @return builder
         * 
         */
        public Builder defaultMaxPodsPerNode(Integer defaultMaxPodsPerNode) {
            return defaultMaxPodsPerNode(Output.of(defaultMaxPodsPerNode));
        }

        /**
         * @param defaultSnatStatus [GKE SNAT](https://cloud.google.com/kubernetes-engine/docs/how-to/ip-masquerade-agent#how_ipmasq_works) DefaultSnatStatus contains the desired state of whether default sNAT should be disabled on the cluster, [API doc](https://cloud.google.com/kubernetes-engine/docs/reference/rest/v1beta1/projects.locations.clusters#networkconfig). Structure is documented below
         * 
         * @return builder
         * 
         */
        public Builder defaultSnatStatus(@Nullable Output<ClusterDefaultSnatStatusArgs> defaultSnatStatus) {
            $.defaultSnatStatus = defaultSnatStatus;
            return this;
        }

        /**
         * @param defaultSnatStatus [GKE SNAT](https://cloud.google.com/kubernetes-engine/docs/how-to/ip-masquerade-agent#how_ipmasq_works) DefaultSnatStatus contains the desired state of whether default sNAT should be disabled on the cluster, [API doc](https://cloud.google.com/kubernetes-engine/docs/reference/rest/v1beta1/projects.locations.clusters#networkconfig). Structure is documented below
         * 
         * @return builder
         * 
         */
        public Builder defaultSnatStatus(ClusterDefaultSnatStatusArgs defaultSnatStatus) {
            return defaultSnatStatus(Output.of(defaultSnatStatus));
        }

        /**
         * @param description Description of the cluster.
         * 
         * @return builder
         * 
         */
        public Builder description(@Nullable Output<String> description) {
            $.description = description;
            return this;
        }

        /**
         * @param description Description of the cluster.
         * 
         * @return builder
         * 
         */
        public Builder description(String description) {
            return description(Output.of(description));
        }

        /**
         * @param dnsConfig Configuration for [Using Cloud DNS for GKE](https://cloud.google.com/kubernetes-engine/docs/how-to/cloud-dns). Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder dnsConfig(@Nullable Output<ClusterDnsConfigArgs> dnsConfig) {
            $.dnsConfig = dnsConfig;
            return this;
        }

        /**
         * @param dnsConfig Configuration for [Using Cloud DNS for GKE](https://cloud.google.com/kubernetes-engine/docs/how-to/cloud-dns). Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder dnsConfig(ClusterDnsConfigArgs dnsConfig) {
            return dnsConfig(Output.of(dnsConfig));
        }

        /**
         * @param enableAutopilot Enable Autopilot for this cluster. Defaults to `false`.
         * Note that when this option is enabled, certain features of Standard GKE are not available.
         * See the [official documentation](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview#comparison)
         * for available features.
         * 
         * @return builder
         * 
         */
        public Builder enableAutopilot(@Nullable Output<Boolean> enableAutopilot) {
            $.enableAutopilot = enableAutopilot;
            return this;
        }

        /**
         * @param enableAutopilot Enable Autopilot for this cluster. Defaults to `false`.
         * Note that when this option is enabled, certain features of Standard GKE are not available.
         * See the [official documentation](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview#comparison)
         * for available features.
         * 
         * @return builder
         * 
         */
        public Builder enableAutopilot(Boolean enableAutopilot) {
            return enableAutopilot(Output.of(enableAutopilot));
        }

        /**
         * @param enableBinaryAuthorization Enable Binary Authorization for this cluster.
         * If enabled, all container images will be validated by Google Binary Authorization.
         * Deprecated in favor of `binary_authorization`.
         * 
         * @return builder
         * 
         * @deprecated
         * Deprecated in favor of binary_authorization.
         * 
         */
        @Deprecated /* Deprecated in favor of binary_authorization. */
        public Builder enableBinaryAuthorization(@Nullable Output<Boolean> enableBinaryAuthorization) {
            $.enableBinaryAuthorization = enableBinaryAuthorization;
            return this;
        }

        /**
         * @param enableBinaryAuthorization Enable Binary Authorization for this cluster.
         * If enabled, all container images will be validated by Google Binary Authorization.
         * Deprecated in favor of `binary_authorization`.
         * 
         * @return builder
         * 
         * @deprecated
         * Deprecated in favor of binary_authorization.
         * 
         */
        @Deprecated /* Deprecated in favor of binary_authorization. */
        public Builder enableBinaryAuthorization(Boolean enableBinaryAuthorization) {
            return enableBinaryAuthorization(Output.of(enableBinaryAuthorization));
        }

        /**
         * @param enableIntranodeVisibility Whether Intra-node visibility is enabled for this cluster. This makes same node pod to pod traffic visible for VPC network.
         * 
         * @return builder
         * 
         */
        public Builder enableIntranodeVisibility(@Nullable Output<Boolean> enableIntranodeVisibility) {
            $.enableIntranodeVisibility = enableIntranodeVisibility;
            return this;
        }

        /**
         * @param enableIntranodeVisibility Whether Intra-node visibility is enabled for this cluster. This makes same node pod to pod traffic visible for VPC network.
         * 
         * @return builder
         * 
         */
        public Builder enableIntranodeVisibility(Boolean enableIntranodeVisibility) {
            return enableIntranodeVisibility(Output.of(enableIntranodeVisibility));
        }

        /**
         * @param enableK8sBetaApis Configuration for Kubernetes Beta APIs.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder enableK8sBetaApis(@Nullable Output<ClusterEnableK8sBetaApisArgs> enableK8sBetaApis) {
            $.enableK8sBetaApis = enableK8sBetaApis;
            return this;
        }

        /**
         * @param enableK8sBetaApis Configuration for Kubernetes Beta APIs.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder enableK8sBetaApis(ClusterEnableK8sBetaApisArgs enableK8sBetaApis) {
            return enableK8sBetaApis(Output.of(enableK8sBetaApis));
        }

        /**
         * @param enableKubernetesAlpha 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 builder
         * 
         */
        public Builder enableKubernetesAlpha(@Nullable Output<Boolean> enableKubernetesAlpha) {
            $.enableKubernetesAlpha = enableKubernetesAlpha;
            return this;
        }

        /**
         * @param enableKubernetesAlpha 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 builder
         * 
         */
        public Builder enableKubernetesAlpha(Boolean enableKubernetesAlpha) {
            return enableKubernetesAlpha(Output.of(enableKubernetesAlpha));
        }

        /**
         * @param enableL4IlbSubsetting Whether L4ILB Subsetting is enabled for this cluster.
         * 
         * @return builder
         * 
         */
        public Builder enableL4IlbSubsetting(@Nullable Output<Boolean> enableL4IlbSubsetting) {
            $.enableL4IlbSubsetting = enableL4IlbSubsetting;
            return this;
        }

        /**
         * @param enableL4IlbSubsetting Whether L4ILB Subsetting is enabled for this cluster.
         * 
         * @return builder
         * 
         */
        public Builder enableL4IlbSubsetting(Boolean enableL4IlbSubsetting) {
            return enableL4IlbSubsetting(Output.of(enableL4IlbSubsetting));
        }

        /**
         * @param enableLegacyAbac 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 builder
         * 
         */
        public Builder enableLegacyAbac(@Nullable Output<Boolean> enableLegacyAbac) {
            $.enableLegacyAbac = enableLegacyAbac;
            return this;
        }

        /**
         * @param enableLegacyAbac 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 builder
         * 
         */
        public Builder enableLegacyAbac(Boolean enableLegacyAbac) {
            return enableLegacyAbac(Output.of(enableLegacyAbac));
        }

        /**
         * @param enableMultiNetworking )
         * Whether multi-networking is enabled for this cluster.
         * 
         * @return builder
         * 
         */
        public Builder enableMultiNetworking(@Nullable Output<Boolean> enableMultiNetworking) {
            $.enableMultiNetworking = enableMultiNetworking;
            return this;
        }

        /**
         * @param enableMultiNetworking )
         * Whether multi-networking is enabled for this cluster.
         * 
         * @return builder
         * 
         */
        public Builder enableMultiNetworking(Boolean enableMultiNetworking) {
            return enableMultiNetworking(Output.of(enableMultiNetworking));
        }

        /**
         * @param enableShieldedNodes Enable Shielded Nodes features on all nodes in this cluster.  Defaults to `true`.
         * 
         * @return builder
         * 
         */
        public Builder enableShieldedNodes(@Nullable Output<Boolean> enableShieldedNodes) {
            $.enableShieldedNodes = enableShieldedNodes;
            return this;
        }

        /**
         * @param enableShieldedNodes Enable Shielded Nodes features on all nodes in this cluster.  Defaults to `true`.
         * 
         * @return builder
         * 
         */
        public Builder enableShieldedNodes(Boolean enableShieldedNodes) {
            return enableShieldedNodes(Output.of(enableShieldedNodes));
        }

        /**
         * @param enableTpu Whether to enable Cloud TPU resources in this cluster.
         * See the [official documentation](https://cloud.google.com/tpu/docs/kubernetes-engine-setup).
         * 
         * @return builder
         * 
         */
        public Builder enableTpu(@Nullable Output<Boolean> enableTpu) {
            $.enableTpu = enableTpu;
            return this;
        }

        /**
         * @param enableTpu Whether to enable Cloud TPU resources in this cluster.
         * See the [official documentation](https://cloud.google.com/tpu/docs/kubernetes-engine-setup).
         * 
         * @return builder
         * 
         */
        public Builder enableTpu(Boolean enableTpu) {
            return enableTpu(Output.of(enableTpu));
        }

        /**
         * @param endpoint The IP address of this cluster&#39;s Kubernetes master.
         * 
         * @return builder
         * 
         */
        public Builder endpoint(@Nullable Output<String> endpoint) {
            $.endpoint = endpoint;
            return this;
        }

        /**
         * @param endpoint The IP address of this cluster&#39;s Kubernetes master.
         * 
         * @return builder
         * 
         */
        public Builder endpoint(String endpoint) {
            return endpoint(Output.of(endpoint));
        }

        /**
         * @param gatewayApiConfig Configuration for [GKE Gateway API controller](https://cloud.google.com/kubernetes-engine/docs/concepts/gateway-api). Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder gatewayApiConfig(@Nullable Output<ClusterGatewayApiConfigArgs> gatewayApiConfig) {
            $.gatewayApiConfig = gatewayApiConfig;
            return this;
        }

        /**
         * @param gatewayApiConfig Configuration for [GKE Gateway API controller](https://cloud.google.com/kubernetes-engine/docs/concepts/gateway-api). Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder gatewayApiConfig(ClusterGatewayApiConfigArgs gatewayApiConfig) {
            return gatewayApiConfig(Output.of(gatewayApiConfig));
        }

        /**
         * @param identityServiceConfig . Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder identityServiceConfig(@Nullable Output<ClusterIdentityServiceConfigArgs> identityServiceConfig) {
            $.identityServiceConfig = identityServiceConfig;
            return this;
        }

        /**
         * @param identityServiceConfig . Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder identityServiceConfig(ClusterIdentityServiceConfigArgs identityServiceConfig) {
            return identityServiceConfig(Output.of(identityServiceConfig));
        }

        /**
         * @param initialNodeCount The number of nodes to create in this
         * cluster&#39;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&#39;re using
         * `gcp.container.NodePool` objects with no default node pool, you&#39;ll need to
         * set this to a value of at least `1`, alongside setting
         * `remove_default_node_pool` to `true`.
         * 
         * @return builder
         * 
         */
        public Builder initialNodeCount(@Nullable Output<Integer> initialNodeCount) {
            $.initialNodeCount = initialNodeCount;
            return this;
        }

        /**
         * @param initialNodeCount The number of nodes to create in this
         * cluster&#39;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&#39;re using
         * `gcp.container.NodePool` objects with no default node pool, you&#39;ll need to
         * set this to a value of at least `1`, alongside setting
         * `remove_default_node_pool` to `true`.
         * 
         * @return builder
         * 
         */
        public Builder initialNodeCount(Integer initialNodeCount) {
            return initialNodeCount(Output.of(initialNodeCount));
        }

        /**
         * @param ipAllocationPolicy Configuration of cluster IP allocation for
         * VPC-native clusters. Adding this block enables [IP aliasing](https://cloud.google.com/kubernetes-engine/docs/how-to/ip-aliases),
         * making the cluster VPC-native instead of routes-based. Structure is documented
         * below.
         * 
         * @return builder
         * 
         */
        public Builder ipAllocationPolicy(@Nullable Output<ClusterIpAllocationPolicyArgs> ipAllocationPolicy) {
            $.ipAllocationPolicy = ipAllocationPolicy;
            return this;
        }

        /**
         * @param ipAllocationPolicy Configuration of cluster IP allocation for
         * VPC-native clusters. Adding this block enables [IP aliasing](https://cloud.google.com/kubernetes-engine/docs/how-to/ip-aliases),
         * making the cluster VPC-native instead of routes-based. Structure is documented
         * below.
         * 
         * @return builder
         * 
         */
        public Builder ipAllocationPolicy(ClusterIpAllocationPolicyArgs ipAllocationPolicy) {
            return ipAllocationPolicy(Output.of(ipAllocationPolicy));
        }

        /**
         * @param labelFingerprint The fingerprint of the set of labels for this cluster.
         * 
         * @return builder
         * 
         */
        public Builder labelFingerprint(@Nullable Output<String> labelFingerprint) {
            $.labelFingerprint = labelFingerprint;
            return this;
        }

        /**
         * @param labelFingerprint The fingerprint of the set of labels for this cluster.
         * 
         * @return builder
         * 
         */
        public Builder labelFingerprint(String labelFingerprint) {
            return labelFingerprint(Output.of(labelFingerprint));
        }

        /**
         * @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
         * 
         * @return builder
         * 
         */
        public Builder location(@Nullable Output<String> location) {
            $.location = location;
            return this;
        }

        /**
         * @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
         * 
         * @return builder
         * 
         */
        public Builder location(String location) {
            return location(Output.of(location));
        }

        /**
         * @param loggingConfig Logging configuration for the cluster.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder loggingConfig(@Nullable Output<ClusterLoggingConfigArgs> loggingConfig) {
            $.loggingConfig = loggingConfig;
            return this;
        }

        /**
         * @param loggingConfig Logging configuration for the cluster.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder loggingConfig(ClusterLoggingConfigArgs loggingConfig) {
            return loggingConfig(Output.of(loggingConfig));
        }

        /**
         * @param loggingService 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 builder
         * 
         */
        public Builder loggingService(@Nullable Output<String> loggingService) {
            $.loggingService = loggingService;
            return this;
        }

        /**
         * @param loggingService 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 builder
         * 
         */
        public Builder loggingService(String loggingService) {
            return loggingService(Output.of(loggingService));
        }

        /**
         * @param maintenancePolicy The maintenance policy to use for the cluster. Structure is
         * documented below.
         * 
         * @return builder
         * 
         */
        public Builder maintenancePolicy(@Nullable Output<ClusterMaintenancePolicyArgs> maintenancePolicy) {
            $.maintenancePolicy = maintenancePolicy;
            return this;
        }

        /**
         * @param maintenancePolicy The maintenance policy to use for the cluster. Structure is
         * documented below.
         * 
         * @return builder
         * 
         */
        public Builder maintenancePolicy(ClusterMaintenancePolicyArgs maintenancePolicy) {
            return maintenancePolicy(Output.of(maintenancePolicy));
        }

        /**
         * @param masterAuth The authentication information for accessing the
         * Kubernetes master. Some values in this block are only returned by the API if
         * your service account has permission to get credentials for your GKE cluster. If
         * you see an unexpected diff unsetting your client cert, ensure you have the
         * `container.clusters.getCredentials` permission.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder masterAuth(@Nullable Output<ClusterMasterAuthArgs> masterAuth) {
            $.masterAuth = masterAuth;
            return this;
        }

        /**
         * @param masterAuth The authentication information for accessing the
         * Kubernetes master. Some values in this block are only returned by the API if
         * your service account has permission to get credentials for your GKE cluster. If
         * you see an unexpected diff unsetting your client cert, ensure you have the
         * `container.clusters.getCredentials` permission.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder masterAuth(ClusterMasterAuthArgs masterAuth) {
            return masterAuth(Output.of(masterAuth));
        }

        /**
         * @param masterAuthorizedNetworksConfig The desired
         * configuration options for master authorized networks. Omit the
         * nested `cidr_blocks` attribute to disallow external access (except
         * the cluster node IPs, which GKE automatically whitelists).
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder masterAuthorizedNetworksConfig(@Nullable Output<ClusterMasterAuthorizedNetworksConfigArgs> masterAuthorizedNetworksConfig) {
            $.masterAuthorizedNetworksConfig = masterAuthorizedNetworksConfig;
            return this;
        }

        /**
         * @param masterAuthorizedNetworksConfig The desired
         * configuration options for master authorized networks. Omit the
         * nested `cidr_blocks` attribute to disallow external access (except
         * the cluster node IPs, which GKE automatically whitelists).
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder masterAuthorizedNetworksConfig(ClusterMasterAuthorizedNetworksConfigArgs masterAuthorizedNetworksConfig) {
            return masterAuthorizedNetworksConfig(Output.of(masterAuthorizedNetworksConfig));
        }

        /**
         * @param masterVersion The current version of the master in the cluster. This may
         * be different than the `min_master_version` set in the config if the master
         * has been updated by GKE.
         * 
         * @return builder
         * 
         */
        public Builder masterVersion(@Nullable Output<String> masterVersion) {
            $.masterVersion = masterVersion;
            return this;
        }

        /**
         * @param masterVersion The current version of the master in the cluster. This may
         * be different than the `min_master_version` set in the config if the master
         * has been updated by GKE.
         * 
         * @return builder
         * 
         */
        public Builder masterVersion(String masterVersion) {
            return masterVersion(Output.of(masterVersion));
        }

        /**
         * @param meshCertificates Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder meshCertificates(@Nullable Output<ClusterMeshCertificatesArgs> meshCertificates) {
            $.meshCertificates = meshCertificates;
            return this;
        }

        /**
         * @param meshCertificates Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder meshCertificates(ClusterMeshCertificatesArgs meshCertificates) {
            return meshCertificates(Output.of(meshCertificates));
        }

        /**
         * @param minMasterVersion 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&#39;s version will be set by GKE to the version of the most recent
         * official release (which is not necessarily the latest version).  Most users will find
         * the `gcp.container.getEngineVersions` data source useful - it indicates which versions
         * are available. If you intend to specify versions manually,
         * [the docs](https://cloud.google.com/kubernetes-engine/versioning-and-upgrades#specifying_cluster_version)
         * describe the various acceptable formats for this field.
         * 
         * &gt; If you are using the `gcp.container.getEngineVersions` datasource with a regional cluster, ensure that you have provided a `location`
         * to the datasource. A region can have a different set of supported versions than its corresponding zones, and not all zones in a
         * region are guaranteed to support the same version.
         * 
         * @return builder
         * 
         */
        public Builder minMasterVersion(@Nullable Output<String> minMasterVersion) {
            $.minMasterVersion = minMasterVersion;
            return this;
        }

        /**
         * @param minMasterVersion 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&#39;s version will be set by GKE to the version of the most recent
         * official release (which is not necessarily the latest version).  Most users will find
         * the `gcp.container.getEngineVersions` data source useful - it indicates which versions
         * are available. If you intend to specify versions manually,
         * [the docs](https://cloud.google.com/kubernetes-engine/versioning-and-upgrades#specifying_cluster_version)
         * describe the various acceptable formats for this field.
         * 
         * &gt; If you are using the `gcp.container.getEngineVersions` datasource with a regional cluster, ensure that you have provided a `location`
         * to the datasource. A region can have a different set of supported versions than its corresponding zones, and not all zones in a
         * region are guaranteed to support the same version.
         * 
         * @return builder
         * 
         */
        public Builder minMasterVersion(String minMasterVersion) {
            return minMasterVersion(Output.of(minMasterVersion));
        }

        /**
         * @param monitoringConfig Monitoring configuration for the cluster.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder monitoringConfig(@Nullable Output<ClusterMonitoringConfigArgs> monitoringConfig) {
            $.monitoringConfig = monitoringConfig;
            return this;
        }

        /**
         * @param monitoringConfig Monitoring configuration for the cluster.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder monitoringConfig(ClusterMonitoringConfigArgs monitoringConfig) {
            return monitoringConfig(Output.of(monitoringConfig));
        }

        /**
         * @param monitoringService 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 builder
         * 
         */
        public Builder monitoringService(@Nullable Output<String> monitoringService) {
            $.monitoringService = monitoringService;
            return this;
        }

        /**
         * @param monitoringService 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 builder
         * 
         */
        public Builder monitoringService(String monitoringService) {
            return monitoringService(Output.of(monitoringService));
        }

        /**
         * @param name The name of the cluster, unique within the project and
         * location.
         * 
         * ***
         * 
         * @return builder
         * 
         */
        public Builder name(@Nullable Output<String> name) {
            $.name = name;
            return this;
        }

        /**
         * @param name The name of the cluster, unique within the project and
         * location.
         * 
         * ***
         * 
         * @return builder
         * 
         */
        public Builder name(String name) {
            return name(Output.of(name));
        }

        /**
         * @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.
         * 
         * @return builder
         * 
         */
        public Builder network(@Nullable Output<String> network) {
            $.network = network;
            return this;
        }

        /**
         * @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.
         * 
         * @return builder
         * 
         */
        public Builder network(String network) {
            return network(Output.of(network));
        }

        /**
         * @param networkPolicy Configuration options for the
         * [NetworkPolicy](https://kubernetes.io/docs/concepts/services-networking/networkpolicies/)
         * feature. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder networkPolicy(@Nullable Output<ClusterNetworkPolicyArgs> networkPolicy) {
            $.networkPolicy = networkPolicy;
            return this;
        }

        /**
         * @param networkPolicy Configuration options for the
         * [NetworkPolicy](https://kubernetes.io/docs/concepts/services-networking/networkpolicies/)
         * feature. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder networkPolicy(ClusterNetworkPolicyArgs networkPolicy) {
            return networkPolicy(Output.of(networkPolicy));
        }

        /**
         * @param networkingMode Determines whether alias IPs or routes will be used for pod IPs in the cluster.
         * Options are `VPC_NATIVE` or `ROUTES`. `VPC_NATIVE` enables [IP aliasing](https://cloud.google.com/kubernetes-engine/docs/how-to/ip-aliases),
         * and requires the `ip_allocation_policy` block to be defined. By default, when this field is unspecified and no `ip_allocation_policy` blocks are set, GKE will create a `ROUTES`-based cluster.
         * 
         * @return builder
         * 
         */
        public Builder networkingMode(@Nullable Output<String> networkingMode) {
            $.networkingMode = networkingMode;
            return this;
        }

        /**
         * @param networkingMode Determines whether alias IPs or routes will be used for pod IPs in the cluster.
         * Options are `VPC_NATIVE` or `ROUTES`. `VPC_NATIVE` enables [IP aliasing](https://cloud.google.com/kubernetes-engine/docs/how-to/ip-aliases),
         * and requires the `ip_allocation_policy` block to be defined. By default, when this field is unspecified and no `ip_allocation_policy` blocks are set, GKE will create a `ROUTES`-based cluster.
         * 
         * @return builder
         * 
         */
        public Builder networkingMode(String networkingMode) {
            return networkingMode(Output.of(networkingMode));
        }

        /**
         * @param nodeConfig Parameters used in creating the default node pool.
         * Generally, this field should not be used at the same time as a
         * `gcp.container.NodePool` or a `node_pool` block; this configuration
         * manages the default node pool, which isn&#39;t recommended to be used.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder nodeConfig(@Nullable Output<ClusterNodeConfigArgs> nodeConfig) {
            $.nodeConfig = nodeConfig;
            return this;
        }

        /**
         * @param nodeConfig Parameters used in creating the default node pool.
         * Generally, this field should not be used at the same time as a
         * `gcp.container.NodePool` or a `node_pool` block; this configuration
         * manages the default node pool, which isn&#39;t recommended to be used.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder nodeConfig(ClusterNodeConfigArgs nodeConfig) {
            return nodeConfig(Output.of(nodeConfig));
        }

        /**
         * @param nodeLocations The list of zones in which the cluster&#39;s nodes
         * are located. Nodes must be in the region of their regional cluster or in the
         * same region as their cluster&#39;s zone for zonal clusters. If this is specified for
         * a zonal cluster, omit the cluster&#39;s zone.
         * 
         * &gt; A &#34;multi-zonal&#34; cluster is a zonal cluster with at least one additional zone
         * defined; in a multi-zonal cluster, the cluster master is only present in a
         * single zone while nodes are present in each of the primary zone and the node
         * locations. In contrast, in a regional cluster, cluster master nodes are present
         * in multiple zones in the region. For that reason, regional clusters should be
         * preferred.
         * 
         * @return builder
         * 
         */
        public Builder nodeLocations(@Nullable Output<List<String>> nodeLocations) {
            $.nodeLocations = nodeLocations;
            return this;
        }

        /**
         * @param nodeLocations The list of zones in which the cluster&#39;s nodes
         * are located. Nodes must be in the region of their regional cluster or in the
         * same region as their cluster&#39;s zone for zonal clusters. If this is specified for
         * a zonal cluster, omit the cluster&#39;s zone.
         * 
         * &gt; A &#34;multi-zonal&#34; cluster is a zonal cluster with at least one additional zone
         * defined; in a multi-zonal cluster, the cluster master is only present in a
         * single zone while nodes are present in each of the primary zone and the node
         * locations. In contrast, in a regional cluster, cluster master nodes are present
         * in multiple zones in the region. For that reason, regional clusters should be
         * preferred.
         * 
         * @return builder
         * 
         */
        public Builder nodeLocations(List<String> nodeLocations) {
            return nodeLocations(Output.of(nodeLocations));
        }

        /**
         * @param nodeLocations The list of zones in which the cluster&#39;s nodes
         * are located. Nodes must be in the region of their regional cluster or in the
         * same region as their cluster&#39;s zone for zonal clusters. If this is specified for
         * a zonal cluster, omit the cluster&#39;s zone.
         * 
         * &gt; A &#34;multi-zonal&#34; cluster is a zonal cluster with at least one additional zone
         * defined; in a multi-zonal cluster, the cluster master is only present in a
         * single zone while nodes are present in each of the primary zone and the node
         * locations. In contrast, in a regional cluster, cluster master nodes are present
         * in multiple zones in the region. For that reason, regional clusters should be
         * preferred.
         * 
         * @return builder
         * 
         */
        public Builder nodeLocations(String... nodeLocations) {
            return nodeLocations(List.of(nodeLocations));
        }

        /**
         * @param nodePoolAutoConfig ) Node pool configs that apply to auto-provisioned node pools in
         * [autopilot](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview#comparison) clusters and
         * [node auto-provisioning](https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning)-enabled clusters. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder nodePoolAutoConfig(@Nullable Output<ClusterNodePoolAutoConfigArgs> nodePoolAutoConfig) {
            $.nodePoolAutoConfig = nodePoolAutoConfig;
            return this;
        }

        /**
         * @param nodePoolAutoConfig ) Node pool configs that apply to auto-provisioned node pools in
         * [autopilot](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview#comparison) clusters and
         * [node auto-provisioning](https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning)-enabled clusters. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder nodePoolAutoConfig(ClusterNodePoolAutoConfigArgs nodePoolAutoConfig) {
            return nodePoolAutoConfig(Output.of(nodePoolAutoConfig));
        }

        /**
         * @param nodePoolDefaults Default NodePool settings for the entire cluster. These settings are overridden if specified on the specific NodePool object. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder nodePoolDefaults(@Nullable Output<ClusterNodePoolDefaultsArgs> nodePoolDefaults) {
            $.nodePoolDefaults = nodePoolDefaults;
            return this;
        }

        /**
         * @param nodePoolDefaults Default NodePool settings for the entire cluster. These settings are overridden if specified on the specific NodePool object. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder nodePoolDefaults(ClusterNodePoolDefaultsArgs nodePoolDefaults) {
            return nodePoolDefaults(Output.of(nodePoolDefaults));
        }

        /**
         * @param nodePools List of node pools associated with this cluster.
         * See gcp.container.NodePool for schema.
         * **Warning:** node pools defined inside a cluster can&#39;t be changed (or added/removed) after
         * cluster creation without deleting and recreating the entire cluster. Unless you absolutely need the ability
         * to say &#34;these are the _only_ node pools associated with this cluster&#34;, use the
         * gcp.container.NodePool resource instead of this property.
         * 
         * @return builder
         * 
         */
        public Builder nodePools(@Nullable Output<List<ClusterNodePoolArgs>> nodePools) {
            $.nodePools = nodePools;
            return this;
        }

        /**
         * @param nodePools List of node pools associated with this cluster.
         * See gcp.container.NodePool for schema.
         * **Warning:** node pools defined inside a cluster can&#39;t be changed (or added/removed) after
         * cluster creation without deleting and recreating the entire cluster. Unless you absolutely need the ability
         * to say &#34;these are the _only_ node pools associated with this cluster&#34;, use the
         * gcp.container.NodePool resource instead of this property.
         * 
         * @return builder
         * 
         */
        public Builder nodePools(List<ClusterNodePoolArgs> nodePools) {
            return nodePools(Output.of(nodePools));
        }

        /**
         * @param nodePools List of node pools associated with this cluster.
         * See gcp.container.NodePool for schema.
         * **Warning:** node pools defined inside a cluster can&#39;t be changed (or added/removed) after
         * cluster creation without deleting and recreating the entire cluster. Unless you absolutely need the ability
         * to say &#34;these are the _only_ node pools associated with this cluster&#34;, use the
         * gcp.container.NodePool resource instead of this property.
         * 
         * @return builder
         * 
         */
        public Builder nodePools(ClusterNodePoolArgs... nodePools) {
            return nodePools(List.of(nodePools));
        }

        /**
         * @param nodeVersion 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&#39;s
         * recommended that you specify explicit versions as the provider will see spurious diffs
         * when fuzzy versions are used. See the `gcp.container.getEngineVersions` data source&#39;s
         * `version_prefix` field to approximate fuzzy versions.
         * To update nodes in other node pools, use the `version` attribute on the node pool.
         * 
         * @return builder
         * 
         */
        public Builder nodeVersion(@Nullable Output<String> nodeVersion) {
            $.nodeVersion = nodeVersion;
            return this;
        }

        /**
         * @param nodeVersion 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&#39;s
         * recommended that you specify explicit versions as the provider will see spurious diffs
         * when fuzzy versions are used. See the `gcp.container.getEngineVersions` data source&#39;s
         * `version_prefix` field to approximate fuzzy versions.
         * To update nodes in other node pools, use the `version` attribute on the node pool.
         * 
         * @return builder
         * 
         */
        public Builder nodeVersion(String nodeVersion) {
            return nodeVersion(Output.of(nodeVersion));
        }

        /**
         * @param notificationConfig Configuration for the [cluster upgrade notifications](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-upgrade-notifications) feature. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder notificationConfig(@Nullable Output<ClusterNotificationConfigArgs> notificationConfig) {
            $.notificationConfig = notificationConfig;
            return this;
        }

        /**
         * @param notificationConfig Configuration for the [cluster upgrade notifications](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-upgrade-notifications) feature. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder notificationConfig(ClusterNotificationConfigArgs notificationConfig) {
            return notificationConfig(Output.of(notificationConfig));
        }

        public Builder operation(@Nullable Output<String> operation) {
            $.operation = operation;
            return this;
        }

        public Builder operation(String operation) {
            return operation(Output.of(operation));
        }

        /**
         * @param podSecurityPolicyConfig ) Configuration for the
         * [PodSecurityPolicy](https://cloud.google.com/kubernetes-engine/docs/how-to/pod-security-policies) feature.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder podSecurityPolicyConfig(@Nullable Output<ClusterPodSecurityPolicyConfigArgs> podSecurityPolicyConfig) {
            $.podSecurityPolicyConfig = podSecurityPolicyConfig;
            return this;
        }

        /**
         * @param podSecurityPolicyConfig ) Configuration for the
         * [PodSecurityPolicy](https://cloud.google.com/kubernetes-engine/docs/how-to/pod-security-policies) feature.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder podSecurityPolicyConfig(ClusterPodSecurityPolicyConfigArgs podSecurityPolicyConfig) {
            return podSecurityPolicyConfig(Output.of(podSecurityPolicyConfig));
        }

        /**
         * @param privateClusterConfig Configuration for [private clusters](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters),
         * clusters with private nodes. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder privateClusterConfig(@Nullable Output<ClusterPrivateClusterConfigArgs> privateClusterConfig) {
            $.privateClusterConfig = privateClusterConfig;
            return this;
        }

        /**
         * @param privateClusterConfig Configuration for [private clusters](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters),
         * clusters with private nodes. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder privateClusterConfig(ClusterPrivateClusterConfigArgs privateClusterConfig) {
            return privateClusterConfig(Output.of(privateClusterConfig));
        }

        /**
         * @param privateIpv6GoogleAccess The desired state of IPv6 connectivity to Google Services. By default, no private IPv6 access to or from Google Services (all access will be via IPv4).
         * 
         * @return builder
         * 
         */
        public Builder privateIpv6GoogleAccess(@Nullable Output<String> privateIpv6GoogleAccess) {
            $.privateIpv6GoogleAccess = privateIpv6GoogleAccess;
            return this;
        }

        /**
         * @param privateIpv6GoogleAccess The desired state of IPv6 connectivity to Google Services. By default, no private IPv6 access to or from Google Services (all access will be via IPv4).
         * 
         * @return builder
         * 
         */
        public Builder privateIpv6GoogleAccess(String privateIpv6GoogleAccess) {
            return privateIpv6GoogleAccess(Output.of(privateIpv6GoogleAccess));
        }

        /**
         * @param project The ID of the project in which the resource belongs. If it
         * is not provided, the provider project is used.
         * 
         * @return builder
         * 
         */
        public Builder project(@Nullable Output<String> project) {
            $.project = project;
            return this;
        }

        /**
         * @param project The ID of the project in which the resource belongs. If it
         * is not provided, the provider project is used.
         * 
         * @return builder
         * 
         */
        public Builder project(String project) {
            return project(Output.of(project));
        }

        /**
         * @param protectConfig )
         * Enable/Disable Protect API features for the cluster. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder protectConfig(@Nullable Output<ClusterProtectConfigArgs> protectConfig) {
            $.protectConfig = protectConfig;
            return this;
        }

        /**
         * @param protectConfig )
         * Enable/Disable Protect API features for the cluster. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder protectConfig(ClusterProtectConfigArgs protectConfig) {
            return protectConfig(Output.of(protectConfig));
        }

        /**
         * @param releaseChannel Configuration options for the [Release channel](https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels)
         * feature, which provide more control over automatic upgrades of your GKE clusters.
         * When updating this field, GKE imposes specific version requirements. See
         * [Selecting a new release channel](https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels#selecting_a_new_release_channel)
         * for more details; the `gcp.container.getEngineVersions` datasource can provide
         * the default version for a channel. Note that removing the `release_channel`
         * field from your config will cause the provider to stop managing your cluster&#39;s
         * release channel, but will not unenroll it. Instead, use the `&#34;UNSPECIFIED&#34;`
         * channel. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder releaseChannel(@Nullable Output<ClusterReleaseChannelArgs> releaseChannel) {
            $.releaseChannel = releaseChannel;
            return this;
        }

        /**
         * @param releaseChannel Configuration options for the [Release channel](https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels)
         * feature, which provide more control over automatic upgrades of your GKE clusters.
         * When updating this field, GKE imposes specific version requirements. See
         * [Selecting a new release channel](https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels#selecting_a_new_release_channel)
         * for more details; the `gcp.container.getEngineVersions` datasource can provide
         * the default version for a channel. Note that removing the `release_channel`
         * field from your config will cause the provider to stop managing your cluster&#39;s
         * release channel, but will not unenroll it. Instead, use the `&#34;UNSPECIFIED&#34;`
         * channel. Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder releaseChannel(ClusterReleaseChannelArgs releaseChannel) {
            return releaseChannel(Output.of(releaseChannel));
        }

        /**
         * @param removeDefaultNodePool If `true`, deletes the default node
         * pool upon cluster creation. If you&#39;re using `gcp.container.NodePool`
         * resources with no default node pool, this should be set to `true`, alongside
         * setting `initial_node_count` to at least `1`.
         * 
         * @return builder
         * 
         */
        public Builder removeDefaultNodePool(@Nullable Output<Boolean> removeDefaultNodePool) {
            $.removeDefaultNodePool = removeDefaultNodePool;
            return this;
        }

        /**
         * @param removeDefaultNodePool If `true`, deletes the default node
         * pool upon cluster creation. If you&#39;re using `gcp.container.NodePool`
         * resources with no default node pool, this should be set to `true`, alongside
         * setting `initial_node_count` to at least `1`.
         * 
         * @return builder
         * 
         */
        public Builder removeDefaultNodePool(Boolean removeDefaultNodePool) {
            return removeDefaultNodePool(Output.of(removeDefaultNodePool));
        }

        /**
         * @param resourceLabels The GCE resource labels (a map of key/value pairs) to be applied to the cluster.
         * 
         * @return builder
         * 
         */
        public Builder resourceLabels(@Nullable Output<Map<String,String>> resourceLabels) {
            $.resourceLabels = resourceLabels;
            return this;
        }

        /**
         * @param resourceLabels The GCE resource labels (a map of key/value pairs) to be applied to the cluster.
         * 
         * @return builder
         * 
         */
        public Builder resourceLabels(Map<String,String> resourceLabels) {
            return resourceLabels(Output.of(resourceLabels));
        }

        /**
         * @param resourceUsageExportConfig Configuration for the
         * [ResourceUsageExportConfig](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-usage-metering) feature.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder resourceUsageExportConfig(@Nullable Output<ClusterResourceUsageExportConfigArgs> resourceUsageExportConfig) {
            $.resourceUsageExportConfig = resourceUsageExportConfig;
            return this;
        }

        /**
         * @param resourceUsageExportConfig Configuration for the
         * [ResourceUsageExportConfig](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-usage-metering) feature.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder resourceUsageExportConfig(ClusterResourceUsageExportConfigArgs resourceUsageExportConfig) {
            return resourceUsageExportConfig(Output.of(resourceUsageExportConfig));
        }

        /**
         * @param securityPostureConfig Enable/Disable Security Posture API features for the cluster. Structure is documented below.
         * 
         * &lt;a name=&#34;nested_default_snat_status&#34;&gt;&lt;/a&gt;The `default_snat_status` block supports
         * 
         * @return builder
         * 
         */
        public Builder securityPostureConfig(@Nullable Output<ClusterSecurityPostureConfigArgs> securityPostureConfig) {
            $.securityPostureConfig = securityPostureConfig;
            return this;
        }

        /**
         * @param securityPostureConfig Enable/Disable Security Posture API features for the cluster. Structure is documented below.
         * 
         * &lt;a name=&#34;nested_default_snat_status&#34;&gt;&lt;/a&gt;The `default_snat_status` block supports
         * 
         * @return builder
         * 
         */
        public Builder securityPostureConfig(ClusterSecurityPostureConfigArgs securityPostureConfig) {
            return securityPostureConfig(Output.of(securityPostureConfig));
        }

        /**
         * @param selfLink The server-defined URL for the resource.
         * 
         * @return builder
         * 
         */
        public Builder selfLink(@Nullable Output<String> selfLink) {
            $.selfLink = selfLink;
            return this;
        }

        /**
         * @param selfLink The server-defined URL for the resource.
         * 
         * @return builder
         * 
         */
        public Builder selfLink(String selfLink) {
            return selfLink(Output.of(selfLink));
        }

        /**
         * @param serviceExternalIpsConfig Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder serviceExternalIpsConfig(@Nullable Output<ClusterServiceExternalIpsConfigArgs> serviceExternalIpsConfig) {
            $.serviceExternalIpsConfig = serviceExternalIpsConfig;
            return this;
        }

        /**
         * @param serviceExternalIpsConfig Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder serviceExternalIpsConfig(ClusterServiceExternalIpsConfigArgs serviceExternalIpsConfig) {
            return serviceExternalIpsConfig(Output.of(serviceExternalIpsConfig));
        }

        /**
         * @param servicesIpv4Cidr The IP address range of the Kubernetes services in this
         * cluster, in [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
         * notation (e.g. `1.2.3.4/29`). Service addresses are typically put in the last
         * `/16` from the container CIDR.
         * 
         * @return builder
         * 
         */
        public Builder servicesIpv4Cidr(@Nullable Output<String> servicesIpv4Cidr) {
            $.servicesIpv4Cidr = servicesIpv4Cidr;
            return this;
        }

        /**
         * @param servicesIpv4Cidr The IP address range of the Kubernetes services in this
         * cluster, in [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
         * notation (e.g. `1.2.3.4/29`). Service addresses are typically put in the last
         * `/16` from the container CIDR.
         * 
         * @return builder
         * 
         */
        public Builder servicesIpv4Cidr(String servicesIpv4Cidr) {
            return servicesIpv4Cidr(Output.of(servicesIpv4Cidr));
        }

        /**
         * @param subnetwork The name or self_link of the Google Compute Engine
         * subnetwork in which the cluster&#39;s instances are launched.
         * 
         * @return builder
         * 
         */
        public Builder subnetwork(@Nullable Output<String> subnetwork) {
            $.subnetwork = subnetwork;
            return this;
        }

        /**
         * @param subnetwork The name or self_link of the Google Compute Engine
         * subnetwork in which the cluster&#39;s instances are launched.
         * 
         * @return builder
         * 
         */
        public Builder subnetwork(String subnetwork) {
            return subnetwork(Output.of(subnetwork));
        }

        /**
         * @param tpuConfig TPU configuration for the cluster.
         * 
         * @return builder
         * 
         */
        public Builder tpuConfig(@Nullable Output<ClusterTpuConfigArgs> tpuConfig) {
            $.tpuConfig = tpuConfig;
            return this;
        }

        /**
         * @param tpuConfig TPU configuration for the cluster.
         * 
         * @return builder
         * 
         */
        public Builder tpuConfig(ClusterTpuConfigArgs tpuConfig) {
            return tpuConfig(Output.of(tpuConfig));
        }

        /**
         * @param tpuIpv4CidrBlock The IP address range of the Cloud TPUs in this cluster, in
         * [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
         * notation (e.g. `1.2.3.4/29`).
         * 
         * @return builder
         * 
         */
        public Builder tpuIpv4CidrBlock(@Nullable Output<String> tpuIpv4CidrBlock) {
            $.tpuIpv4CidrBlock = tpuIpv4CidrBlock;
            return this;
        }

        /**
         * @param tpuIpv4CidrBlock The IP address range of the Cloud TPUs in this cluster, in
         * [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
         * notation (e.g. `1.2.3.4/29`).
         * 
         * @return builder
         * 
         */
        public Builder tpuIpv4CidrBlock(String tpuIpv4CidrBlock) {
            return tpuIpv4CidrBlock(Output.of(tpuIpv4CidrBlock));
        }

        /**
         * @param verticalPodAutoscaling Vertical Pod Autoscaling automatically adjusts the resources of pods controlled by it.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder verticalPodAutoscaling(@Nullable Output<ClusterVerticalPodAutoscalingArgs> verticalPodAutoscaling) {
            $.verticalPodAutoscaling = verticalPodAutoscaling;
            return this;
        }

        /**
         * @param verticalPodAutoscaling Vertical Pod Autoscaling automatically adjusts the resources of pods controlled by it.
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder verticalPodAutoscaling(ClusterVerticalPodAutoscalingArgs verticalPodAutoscaling) {
            return verticalPodAutoscaling(Output.of(verticalPodAutoscaling));
        }

        /**
         * @param workloadIdentityConfig Workload Identity allows Kubernetes service accounts to act as a user-managed
         * [Google IAM Service Account](https://cloud.google.com/iam/docs/service-accounts#user-managed_service_accounts).
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder workloadIdentityConfig(@Nullable Output<ClusterWorkloadIdentityConfigArgs> workloadIdentityConfig) {
            $.workloadIdentityConfig = workloadIdentityConfig;
            return this;
        }

        /**
         * @param workloadIdentityConfig Workload Identity allows Kubernetes service accounts to act as a user-managed
         * [Google IAM Service Account](https://cloud.google.com/iam/docs/service-accounts#user-managed_service_accounts).
         * Structure is documented below.
         * 
         * @return builder
         * 
         */
        public Builder workloadIdentityConfig(ClusterWorkloadIdentityConfigArgs workloadIdentityConfig) {
            return workloadIdentityConfig(Output.of(workloadIdentityConfig));
        }

        public ClusterState build() {
            return $;
        }
    }

}
