// *** 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.azure.containerservice.inputs;

import com.pulumi.azure.containerservice.inputs.KubernetesClusterNetworkProfileLoadBalancerProfileArgs;
import com.pulumi.azure.containerservice.inputs.KubernetesClusterNetworkProfileNatGatewayProfileArgs;
import com.pulumi.core.Output;
import com.pulumi.core.annotations.Import;
import java.lang.String;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Nullable;


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

    public static final KubernetesClusterNetworkProfileArgs Empty = new KubernetesClusterNetworkProfileArgs();

    /**
     * IP address within the Kubernetes service address range that will be used by cluster service discovery (kube-dns). Changing this forces a new resource to be created.
     * 
     */
    @Import(name="dnsServiceIp")
    private @Nullable Output<String> dnsServiceIp;

    /**
     * @return IP address within the Kubernetes service address range that will be used by cluster service discovery (kube-dns). Changing this forces a new resource to be created.
     * 
     */
    public Optional<Output<String>> dnsServiceIp() {
        return Optional.ofNullable(this.dnsServiceIp);
    }

    /**
     * IP address (in CIDR notation) used as the Docker bridge IP address on nodes. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** `docker_bridge_cidr` has been deprecated as the API no longer supports it and will be removed in version 4.0 of the provider.
     * 
     * @deprecated
     * `docker_bridge_cidr` has been deprecated as the API no longer supports it and will be removed in version 4.0 of the provider.
     * 
     */
    @Deprecated /* `docker_bridge_cidr` has been deprecated as the API no longer supports it and will be removed in version 4.0 of the provider. */
    @Import(name="dockerBridgeCidr")
    private @Nullable Output<String> dockerBridgeCidr;

    /**
     * @return IP address (in CIDR notation) used as the Docker bridge IP address on nodes. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** `docker_bridge_cidr` has been deprecated as the API no longer supports it and will be removed in version 4.0 of the provider.
     * 
     * @deprecated
     * `docker_bridge_cidr` has been deprecated as the API no longer supports it and will be removed in version 4.0 of the provider.
     * 
     */
    @Deprecated /* `docker_bridge_cidr` has been deprecated as the API no longer supports it and will be removed in version 4.0 of the provider. */
    public Optional<Output<String>> dockerBridgeCidr() {
        return Optional.ofNullable(this.dockerBridgeCidr);
    }

    /**
     * Specifies the eBPF data plane used for building the Kubernetes network. Possible value is `cilium`. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** When `ebpf_data_plane` is set to `cilium`, the `network_plugin` field can only be set to `azure`.
     * 
     * &gt; **Note:** When `ebpf_data_plane` is set to `cilium`, one of either `network_plugin_mode = &#34;overlay&#34;` or `pod_subnet_id` must be specified.
     * 
     * &gt; **Note:** This requires that the Preview Feature `Microsoft.ContainerService/CiliumDataplanePreview` is enabled and the Resource Provider is re-registered, see [the documentation](https://learn.microsoft.com/en-us/azure/aks/azure-cni-powered-by-cilium) for more information.
     * 
     */
    @Import(name="ebpfDataPlane")
    private @Nullable Output<String> ebpfDataPlane;

    /**
     * @return Specifies the eBPF data plane used for building the Kubernetes network. Possible value is `cilium`. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** When `ebpf_data_plane` is set to `cilium`, the `network_plugin` field can only be set to `azure`.
     * 
     * &gt; **Note:** When `ebpf_data_plane` is set to `cilium`, one of either `network_plugin_mode = &#34;overlay&#34;` or `pod_subnet_id` must be specified.
     * 
     * &gt; **Note:** This requires that the Preview Feature `Microsoft.ContainerService/CiliumDataplanePreview` is enabled and the Resource Provider is re-registered, see [the documentation](https://learn.microsoft.com/en-us/azure/aks/azure-cni-powered-by-cilium) for more information.
     * 
     */
    public Optional<Output<String>> ebpfDataPlane() {
        return Optional.ofNullable(this.ebpfDataPlane);
    }

    /**
     * Specifies a list of IP versions the Kubernetes Cluster will use to assign IP addresses to its nodes and pods. Possible values are `IPv4` and/or `IPv6`. `IPv4` must always be specified. Changing this forces a new resource to be created.
     * 
     * -&gt;**Note:** To configure dual-stack networking `ip_versions` should be set to `[&#34;IPv4&#34;, &#34;IPv6&#34;]`.
     * 
     * -&gt;**Note:** Dual-stack networking requires that the Preview Feature `Microsoft.ContainerService/AKS-EnableDualStack` is enabled and the Resource Provider is re-registered, see [the documentation](https://docs.microsoft.com/azure/aks/configure-kubenet-dual-stack?tabs=azure-cli%2Ckubectl#register-the-aks-enabledualstack-preview-feature) for more information.
     * 
     */
    @Import(name="ipVersions")
    private @Nullable Output<List<String>> ipVersions;

    /**
     * @return Specifies a list of IP versions the Kubernetes Cluster will use to assign IP addresses to its nodes and pods. Possible values are `IPv4` and/or `IPv6`. `IPv4` must always be specified. Changing this forces a new resource to be created.
     * 
     * -&gt;**Note:** To configure dual-stack networking `ip_versions` should be set to `[&#34;IPv4&#34;, &#34;IPv6&#34;]`.
     * 
     * -&gt;**Note:** Dual-stack networking requires that the Preview Feature `Microsoft.ContainerService/AKS-EnableDualStack` is enabled and the Resource Provider is re-registered, see [the documentation](https://docs.microsoft.com/azure/aks/configure-kubenet-dual-stack?tabs=azure-cli%2Ckubectl#register-the-aks-enabledualstack-preview-feature) for more information.
     * 
     */
    public Optional<Output<List<String>>> ipVersions() {
        return Optional.ofNullable(this.ipVersions);
    }

    /**
     * A `load_balancer_profile` block as defined below. This can only be specified when `load_balancer_sku` is set to `standard`. Changing this forces a new resource to be created.
     * 
     */
    @Import(name="loadBalancerProfile")
    private @Nullable Output<KubernetesClusterNetworkProfileLoadBalancerProfileArgs> loadBalancerProfile;

    /**
     * @return A `load_balancer_profile` block as defined below. This can only be specified when `load_balancer_sku` is set to `standard`. Changing this forces a new resource to be created.
     * 
     */
    public Optional<Output<KubernetesClusterNetworkProfileLoadBalancerProfileArgs>> loadBalancerProfile() {
        return Optional.ofNullable(this.loadBalancerProfile);
    }

    /**
     * Specifies the SKU of the Load Balancer used for this Kubernetes Cluster. Possible values are `basic` and `standard`. Defaults to `standard`. Changing this forces a new resource to be created.
     * 
     */
    @Import(name="loadBalancerSku")
    private @Nullable Output<String> loadBalancerSku;

    /**
     * @return Specifies the SKU of the Load Balancer used for this Kubernetes Cluster. Possible values are `basic` and `standard`. Defaults to `standard`. Changing this forces a new resource to be created.
     * 
     */
    public Optional<Output<String>> loadBalancerSku() {
        return Optional.ofNullable(this.loadBalancerSku);
    }

    /**
     * A `nat_gateway_profile` block as defined below. This can only be specified when `load_balancer_sku` is set to `standard` and `outbound_type` is set to `managedNATGateway` or `userAssignedNATGateway`. Changing this forces a new resource to be created.
     * 
     */
    @Import(name="natGatewayProfile")
    private @Nullable Output<KubernetesClusterNetworkProfileNatGatewayProfileArgs> natGatewayProfile;

    /**
     * @return A `nat_gateway_profile` block as defined below. This can only be specified when `load_balancer_sku` is set to `standard` and `outbound_type` is set to `managedNATGateway` or `userAssignedNATGateway`. Changing this forces a new resource to be created.
     * 
     */
    public Optional<Output<KubernetesClusterNetworkProfileNatGatewayProfileArgs>> natGatewayProfile() {
        return Optional.ofNullable(this.natGatewayProfile);
    }

    /**
     * Network mode to be used with Azure CNI. Possible values are `bridge` and `transparent`. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** `network_mode` can only be set to `bridge` for existing Kubernetes Clusters and cannot be used to provision new Clusters - this will be removed by Azure in the future.
     * 
     * &gt; **Note:** This property can only be set when `network_plugin` is set to `azure`.
     * 
     */
    @Import(name="networkMode")
    private @Nullable Output<String> networkMode;

    /**
     * @return Network mode to be used with Azure CNI. Possible values are `bridge` and `transparent`. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** `network_mode` can only be set to `bridge` for existing Kubernetes Clusters and cannot be used to provision new Clusters - this will be removed by Azure in the future.
     * 
     * &gt; **Note:** This property can only be set when `network_plugin` is set to `azure`.
     * 
     */
    public Optional<Output<String>> networkMode() {
        return Optional.ofNullable(this.networkMode);
    }

    /**
     * Network plugin to use for networking. Currently supported values are `azure`, `kubenet` and `none`. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** When `network_plugin` is set to `azure` - the `pod_cidr` field must not be set.
     * 
     */
    @Import(name="networkPlugin", required=true)
    private Output<String> networkPlugin;

    /**
     * @return Network plugin to use for networking. Currently supported values are `azure`, `kubenet` and `none`. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** When `network_plugin` is set to `azure` - the `pod_cidr` field must not be set.
     * 
     */
    public Output<String> networkPlugin() {
        return this.networkPlugin;
    }

    /**
     * Specifies the network plugin mode used for building the Kubernetes network. Possible value is `overlay`. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** When `network_plugin_mode` is set to `overlay`, the `network_plugin` field can only be set to `azure`.
     * 
     */
    @Import(name="networkPluginMode")
    private @Nullable Output<String> networkPluginMode;

    /**
     * @return Specifies the network plugin mode used for building the Kubernetes network. Possible value is `overlay`. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** When `network_plugin_mode` is set to `overlay`, the `network_plugin` field can only be set to `azure`.
     * 
     */
    public Optional<Output<String>> networkPluginMode() {
        return Optional.ofNullable(this.networkPluginMode);
    }

    /**
     * Sets up network policy to be used with Azure CNI. [Network policy allows us to control the traffic flow between pods](https://docs.microsoft.com/azure/aks/use-network-policies). Currently supported values are `calico` and `azure`. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** When `network_policy` is set to `azure`, the `network_plugin` field can only be set to `azure`.
     * 
     */
    @Import(name="networkPolicy")
    private @Nullable Output<String> networkPolicy;

    /**
     * @return Sets up network policy to be used with Azure CNI. [Network policy allows us to control the traffic flow between pods](https://docs.microsoft.com/azure/aks/use-network-policies). Currently supported values are `calico` and `azure`. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** When `network_policy` is set to `azure`, the `network_plugin` field can only be set to `azure`.
     * 
     */
    public Optional<Output<String>> networkPolicy() {
        return Optional.ofNullable(this.networkPolicy);
    }

    /**
     * The outbound (egress) routing method which should be used for this Kubernetes Cluster. Possible values are `loadBalancer`, `userDefinedRouting`, `managedNATGateway` and `userAssignedNATGateway`. Defaults to `loadBalancer`. Changing this forces a new resource to be created.
     * 
     */
    @Import(name="outboundType")
    private @Nullable Output<String> outboundType;

    /**
     * @return The outbound (egress) routing method which should be used for this Kubernetes Cluster. Possible values are `loadBalancer`, `userDefinedRouting`, `managedNATGateway` and `userAssignedNATGateway`. Defaults to `loadBalancer`. Changing this forces a new resource to be created.
     * 
     */
    public Optional<Output<String>> outboundType() {
        return Optional.ofNullable(this.outboundType);
    }

    /**
     * The CIDR to use for pod IP addresses. This field can only be set when `network_plugin` is set to `kubenet`. Changing this forces a new resource to be created.
     * 
     */
    @Import(name="podCidr")
    private @Nullable Output<String> podCidr;

    /**
     * @return The CIDR to use for pod IP addresses. This field can only be set when `network_plugin` is set to `kubenet`. Changing this forces a new resource to be created.
     * 
     */
    public Optional<Output<String>> podCidr() {
        return Optional.ofNullable(this.podCidr);
    }

    /**
     * A list of CIDRs to use for pod IP addresses. For single-stack networking a single IPv4 CIDR is expected. For dual-stack networking an IPv4 and IPv6 CIDR are expected. Changing this forces a new resource to be created.
     * 
     */
    @Import(name="podCidrs")
    private @Nullable Output<List<String>> podCidrs;

    /**
     * @return A list of CIDRs to use for pod IP addresses. For single-stack networking a single IPv4 CIDR is expected. For dual-stack networking an IPv4 and IPv6 CIDR are expected. Changing this forces a new resource to be created.
     * 
     */
    public Optional<Output<List<String>>> podCidrs() {
        return Optional.ofNullable(this.podCidrs);
    }

    /**
     * The Network Range used by the Kubernetes service. Changing this forces a new resource to be created.
     * 
     */
    @Import(name="serviceCidr")
    private @Nullable Output<String> serviceCidr;

    /**
     * @return The Network Range used by the Kubernetes service. Changing this forces a new resource to be created.
     * 
     */
    public Optional<Output<String>> serviceCidr() {
        return Optional.ofNullable(this.serviceCidr);
    }

    /**
     * A list of CIDRs to use for Kubernetes services. For single-stack networking a single IPv4 CIDR is expected. For dual-stack networking an IPv4 and IPv6 CIDR are expected. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** This range should not be used by any network element on or connected to this VNet. Service address CIDR must be smaller than /12. `docker_bridge_cidr`, `dns_service_ip` and `service_cidr` should all be empty or all should be set.
     * 
     */
    @Import(name="serviceCidrs")
    private @Nullable Output<List<String>> serviceCidrs;

    /**
     * @return A list of CIDRs to use for Kubernetes services. For single-stack networking a single IPv4 CIDR is expected. For dual-stack networking an IPv4 and IPv6 CIDR are expected. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** This range should not be used by any network element on or connected to this VNet. Service address CIDR must be smaller than /12. `docker_bridge_cidr`, `dns_service_ip` and `service_cidr` should all be empty or all should be set.
     * 
     */
    public Optional<Output<List<String>>> serviceCidrs() {
        return Optional.ofNullable(this.serviceCidrs);
    }

    private KubernetesClusterNetworkProfileArgs() {}

    private KubernetesClusterNetworkProfileArgs(KubernetesClusterNetworkProfileArgs $) {
        this.dnsServiceIp = $.dnsServiceIp;
        this.dockerBridgeCidr = $.dockerBridgeCidr;
        this.ebpfDataPlane = $.ebpfDataPlane;
        this.ipVersions = $.ipVersions;
        this.loadBalancerProfile = $.loadBalancerProfile;
        this.loadBalancerSku = $.loadBalancerSku;
        this.natGatewayProfile = $.natGatewayProfile;
        this.networkMode = $.networkMode;
        this.networkPlugin = $.networkPlugin;
        this.networkPluginMode = $.networkPluginMode;
        this.networkPolicy = $.networkPolicy;
        this.outboundType = $.outboundType;
        this.podCidr = $.podCidr;
        this.podCidrs = $.podCidrs;
        this.serviceCidr = $.serviceCidr;
        this.serviceCidrs = $.serviceCidrs;
    }

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

    public static final class Builder {
        private KubernetesClusterNetworkProfileArgs $;

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

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

        /**
         * @param dnsServiceIp IP address within the Kubernetes service address range that will be used by cluster service discovery (kube-dns). Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder dnsServiceIp(@Nullable Output<String> dnsServiceIp) {
            $.dnsServiceIp = dnsServiceIp;
            return this;
        }

        /**
         * @param dnsServiceIp IP address within the Kubernetes service address range that will be used by cluster service discovery (kube-dns). Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder dnsServiceIp(String dnsServiceIp) {
            return dnsServiceIp(Output.of(dnsServiceIp));
        }

        /**
         * @param dockerBridgeCidr IP address (in CIDR notation) used as the Docker bridge IP address on nodes. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** `docker_bridge_cidr` has been deprecated as the API no longer supports it and will be removed in version 4.0 of the provider.
         * 
         * @return builder
         * 
         * @deprecated
         * `docker_bridge_cidr` has been deprecated as the API no longer supports it and will be removed in version 4.0 of the provider.
         * 
         */
        @Deprecated /* `docker_bridge_cidr` has been deprecated as the API no longer supports it and will be removed in version 4.0 of the provider. */
        public Builder dockerBridgeCidr(@Nullable Output<String> dockerBridgeCidr) {
            $.dockerBridgeCidr = dockerBridgeCidr;
            return this;
        }

        /**
         * @param dockerBridgeCidr IP address (in CIDR notation) used as the Docker bridge IP address on nodes. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** `docker_bridge_cidr` has been deprecated as the API no longer supports it and will be removed in version 4.0 of the provider.
         * 
         * @return builder
         * 
         * @deprecated
         * `docker_bridge_cidr` has been deprecated as the API no longer supports it and will be removed in version 4.0 of the provider.
         * 
         */
        @Deprecated /* `docker_bridge_cidr` has been deprecated as the API no longer supports it and will be removed in version 4.0 of the provider. */
        public Builder dockerBridgeCidr(String dockerBridgeCidr) {
            return dockerBridgeCidr(Output.of(dockerBridgeCidr));
        }

        /**
         * @param ebpfDataPlane Specifies the eBPF data plane used for building the Kubernetes network. Possible value is `cilium`. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** When `ebpf_data_plane` is set to `cilium`, the `network_plugin` field can only be set to `azure`.
         * 
         * &gt; **Note:** When `ebpf_data_plane` is set to `cilium`, one of either `network_plugin_mode = &#34;overlay&#34;` or `pod_subnet_id` must be specified.
         * 
         * &gt; **Note:** This requires that the Preview Feature `Microsoft.ContainerService/CiliumDataplanePreview` is enabled and the Resource Provider is re-registered, see [the documentation](https://learn.microsoft.com/en-us/azure/aks/azure-cni-powered-by-cilium) for more information.
         * 
         * @return builder
         * 
         */
        public Builder ebpfDataPlane(@Nullable Output<String> ebpfDataPlane) {
            $.ebpfDataPlane = ebpfDataPlane;
            return this;
        }

        /**
         * @param ebpfDataPlane Specifies the eBPF data plane used for building the Kubernetes network. Possible value is `cilium`. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** When `ebpf_data_plane` is set to `cilium`, the `network_plugin` field can only be set to `azure`.
         * 
         * &gt; **Note:** When `ebpf_data_plane` is set to `cilium`, one of either `network_plugin_mode = &#34;overlay&#34;` or `pod_subnet_id` must be specified.
         * 
         * &gt; **Note:** This requires that the Preview Feature `Microsoft.ContainerService/CiliumDataplanePreview` is enabled and the Resource Provider is re-registered, see [the documentation](https://learn.microsoft.com/en-us/azure/aks/azure-cni-powered-by-cilium) for more information.
         * 
         * @return builder
         * 
         */
        public Builder ebpfDataPlane(String ebpfDataPlane) {
            return ebpfDataPlane(Output.of(ebpfDataPlane));
        }

        /**
         * @param ipVersions Specifies a list of IP versions the Kubernetes Cluster will use to assign IP addresses to its nodes and pods. Possible values are `IPv4` and/or `IPv6`. `IPv4` must always be specified. Changing this forces a new resource to be created.
         * 
         * -&gt;**Note:** To configure dual-stack networking `ip_versions` should be set to `[&#34;IPv4&#34;, &#34;IPv6&#34;]`.
         * 
         * -&gt;**Note:** Dual-stack networking requires that the Preview Feature `Microsoft.ContainerService/AKS-EnableDualStack` is enabled and the Resource Provider is re-registered, see [the documentation](https://docs.microsoft.com/azure/aks/configure-kubenet-dual-stack?tabs=azure-cli%2Ckubectl#register-the-aks-enabledualstack-preview-feature) for more information.
         * 
         * @return builder
         * 
         */
        public Builder ipVersions(@Nullable Output<List<String>> ipVersions) {
            $.ipVersions = ipVersions;
            return this;
        }

        /**
         * @param ipVersions Specifies a list of IP versions the Kubernetes Cluster will use to assign IP addresses to its nodes and pods. Possible values are `IPv4` and/or `IPv6`. `IPv4` must always be specified. Changing this forces a new resource to be created.
         * 
         * -&gt;**Note:** To configure dual-stack networking `ip_versions` should be set to `[&#34;IPv4&#34;, &#34;IPv6&#34;]`.
         * 
         * -&gt;**Note:** Dual-stack networking requires that the Preview Feature `Microsoft.ContainerService/AKS-EnableDualStack` is enabled and the Resource Provider is re-registered, see [the documentation](https://docs.microsoft.com/azure/aks/configure-kubenet-dual-stack?tabs=azure-cli%2Ckubectl#register-the-aks-enabledualstack-preview-feature) for more information.
         * 
         * @return builder
         * 
         */
        public Builder ipVersions(List<String> ipVersions) {
            return ipVersions(Output.of(ipVersions));
        }

        /**
         * @param ipVersions Specifies a list of IP versions the Kubernetes Cluster will use to assign IP addresses to its nodes and pods. Possible values are `IPv4` and/or `IPv6`. `IPv4` must always be specified. Changing this forces a new resource to be created.
         * 
         * -&gt;**Note:** To configure dual-stack networking `ip_versions` should be set to `[&#34;IPv4&#34;, &#34;IPv6&#34;]`.
         * 
         * -&gt;**Note:** Dual-stack networking requires that the Preview Feature `Microsoft.ContainerService/AKS-EnableDualStack` is enabled and the Resource Provider is re-registered, see [the documentation](https://docs.microsoft.com/azure/aks/configure-kubenet-dual-stack?tabs=azure-cli%2Ckubectl#register-the-aks-enabledualstack-preview-feature) for more information.
         * 
         * @return builder
         * 
         */
        public Builder ipVersions(String... ipVersions) {
            return ipVersions(List.of(ipVersions));
        }

        /**
         * @param loadBalancerProfile A `load_balancer_profile` block as defined below. This can only be specified when `load_balancer_sku` is set to `standard`. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder loadBalancerProfile(@Nullable Output<KubernetesClusterNetworkProfileLoadBalancerProfileArgs> loadBalancerProfile) {
            $.loadBalancerProfile = loadBalancerProfile;
            return this;
        }

        /**
         * @param loadBalancerProfile A `load_balancer_profile` block as defined below. This can only be specified when `load_balancer_sku` is set to `standard`. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder loadBalancerProfile(KubernetesClusterNetworkProfileLoadBalancerProfileArgs loadBalancerProfile) {
            return loadBalancerProfile(Output.of(loadBalancerProfile));
        }

        /**
         * @param loadBalancerSku Specifies the SKU of the Load Balancer used for this Kubernetes Cluster. Possible values are `basic` and `standard`. Defaults to `standard`. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder loadBalancerSku(@Nullable Output<String> loadBalancerSku) {
            $.loadBalancerSku = loadBalancerSku;
            return this;
        }

        /**
         * @param loadBalancerSku Specifies the SKU of the Load Balancer used for this Kubernetes Cluster. Possible values are `basic` and `standard`. Defaults to `standard`. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder loadBalancerSku(String loadBalancerSku) {
            return loadBalancerSku(Output.of(loadBalancerSku));
        }

        /**
         * @param natGatewayProfile A `nat_gateway_profile` block as defined below. This can only be specified when `load_balancer_sku` is set to `standard` and `outbound_type` is set to `managedNATGateway` or `userAssignedNATGateway`. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder natGatewayProfile(@Nullable Output<KubernetesClusterNetworkProfileNatGatewayProfileArgs> natGatewayProfile) {
            $.natGatewayProfile = natGatewayProfile;
            return this;
        }

        /**
         * @param natGatewayProfile A `nat_gateway_profile` block as defined below. This can only be specified when `load_balancer_sku` is set to `standard` and `outbound_type` is set to `managedNATGateway` or `userAssignedNATGateway`. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder natGatewayProfile(KubernetesClusterNetworkProfileNatGatewayProfileArgs natGatewayProfile) {
            return natGatewayProfile(Output.of(natGatewayProfile));
        }

        /**
         * @param networkMode Network mode to be used with Azure CNI. Possible values are `bridge` and `transparent`. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** `network_mode` can only be set to `bridge` for existing Kubernetes Clusters and cannot be used to provision new Clusters - this will be removed by Azure in the future.
         * 
         * &gt; **Note:** This property can only be set when `network_plugin` is set to `azure`.
         * 
         * @return builder
         * 
         */
        public Builder networkMode(@Nullable Output<String> networkMode) {
            $.networkMode = networkMode;
            return this;
        }

        /**
         * @param networkMode Network mode to be used with Azure CNI. Possible values are `bridge` and `transparent`. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** `network_mode` can only be set to `bridge` for existing Kubernetes Clusters and cannot be used to provision new Clusters - this will be removed by Azure in the future.
         * 
         * &gt; **Note:** This property can only be set when `network_plugin` is set to `azure`.
         * 
         * @return builder
         * 
         */
        public Builder networkMode(String networkMode) {
            return networkMode(Output.of(networkMode));
        }

        /**
         * @param networkPlugin Network plugin to use for networking. Currently supported values are `azure`, `kubenet` and `none`. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** When `network_plugin` is set to `azure` - the `pod_cidr` field must not be set.
         * 
         * @return builder
         * 
         */
        public Builder networkPlugin(Output<String> networkPlugin) {
            $.networkPlugin = networkPlugin;
            return this;
        }

        /**
         * @param networkPlugin Network plugin to use for networking. Currently supported values are `azure`, `kubenet` and `none`. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** When `network_plugin` is set to `azure` - the `pod_cidr` field must not be set.
         * 
         * @return builder
         * 
         */
        public Builder networkPlugin(String networkPlugin) {
            return networkPlugin(Output.of(networkPlugin));
        }

        /**
         * @param networkPluginMode Specifies the network plugin mode used for building the Kubernetes network. Possible value is `overlay`. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** When `network_plugin_mode` is set to `overlay`, the `network_plugin` field can only be set to `azure`.
         * 
         * @return builder
         * 
         */
        public Builder networkPluginMode(@Nullable Output<String> networkPluginMode) {
            $.networkPluginMode = networkPluginMode;
            return this;
        }

        /**
         * @param networkPluginMode Specifies the network plugin mode used for building the Kubernetes network. Possible value is `overlay`. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** When `network_plugin_mode` is set to `overlay`, the `network_plugin` field can only be set to `azure`.
         * 
         * @return builder
         * 
         */
        public Builder networkPluginMode(String networkPluginMode) {
            return networkPluginMode(Output.of(networkPluginMode));
        }

        /**
         * @param networkPolicy Sets up network policy to be used with Azure CNI. [Network policy allows us to control the traffic flow between pods](https://docs.microsoft.com/azure/aks/use-network-policies). Currently supported values are `calico` and `azure`. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** When `network_policy` is set to `azure`, the `network_plugin` field can only be set to `azure`.
         * 
         * @return builder
         * 
         */
        public Builder networkPolicy(@Nullable Output<String> networkPolicy) {
            $.networkPolicy = networkPolicy;
            return this;
        }

        /**
         * @param networkPolicy Sets up network policy to be used with Azure CNI. [Network policy allows us to control the traffic flow between pods](https://docs.microsoft.com/azure/aks/use-network-policies). Currently supported values are `calico` and `azure`. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** When `network_policy` is set to `azure`, the `network_plugin` field can only be set to `azure`.
         * 
         * @return builder
         * 
         */
        public Builder networkPolicy(String networkPolicy) {
            return networkPolicy(Output.of(networkPolicy));
        }

        /**
         * @param outboundType The outbound (egress) routing method which should be used for this Kubernetes Cluster. Possible values are `loadBalancer`, `userDefinedRouting`, `managedNATGateway` and `userAssignedNATGateway`. Defaults to `loadBalancer`. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder outboundType(@Nullable Output<String> outboundType) {
            $.outboundType = outboundType;
            return this;
        }

        /**
         * @param outboundType The outbound (egress) routing method which should be used for this Kubernetes Cluster. Possible values are `loadBalancer`, `userDefinedRouting`, `managedNATGateway` and `userAssignedNATGateway`. Defaults to `loadBalancer`. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder outboundType(String outboundType) {
            return outboundType(Output.of(outboundType));
        }

        /**
         * @param podCidr The CIDR to use for pod IP addresses. This field can only be set when `network_plugin` is set to `kubenet`. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder podCidr(@Nullable Output<String> podCidr) {
            $.podCidr = podCidr;
            return this;
        }

        /**
         * @param podCidr The CIDR to use for pod IP addresses. This field can only be set when `network_plugin` is set to `kubenet`. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder podCidr(String podCidr) {
            return podCidr(Output.of(podCidr));
        }

        /**
         * @param podCidrs A list of CIDRs to use for pod IP addresses. For single-stack networking a single IPv4 CIDR is expected. For dual-stack networking an IPv4 and IPv6 CIDR are expected. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder podCidrs(@Nullable Output<List<String>> podCidrs) {
            $.podCidrs = podCidrs;
            return this;
        }

        /**
         * @param podCidrs A list of CIDRs to use for pod IP addresses. For single-stack networking a single IPv4 CIDR is expected. For dual-stack networking an IPv4 and IPv6 CIDR are expected. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder podCidrs(List<String> podCidrs) {
            return podCidrs(Output.of(podCidrs));
        }

        /**
         * @param podCidrs A list of CIDRs to use for pod IP addresses. For single-stack networking a single IPv4 CIDR is expected. For dual-stack networking an IPv4 and IPv6 CIDR are expected. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder podCidrs(String... podCidrs) {
            return podCidrs(List.of(podCidrs));
        }

        /**
         * @param serviceCidr The Network Range used by the Kubernetes service. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder serviceCidr(@Nullable Output<String> serviceCidr) {
            $.serviceCidr = serviceCidr;
            return this;
        }

        /**
         * @param serviceCidr The Network Range used by the Kubernetes service. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder serviceCidr(String serviceCidr) {
            return serviceCidr(Output.of(serviceCidr));
        }

        /**
         * @param serviceCidrs A list of CIDRs to use for Kubernetes services. For single-stack networking a single IPv4 CIDR is expected. For dual-stack networking an IPv4 and IPv6 CIDR are expected. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** This range should not be used by any network element on or connected to this VNet. Service address CIDR must be smaller than /12. `docker_bridge_cidr`, `dns_service_ip` and `service_cidr` should all be empty or all should be set.
         * 
         * @return builder
         * 
         */
        public Builder serviceCidrs(@Nullable Output<List<String>> serviceCidrs) {
            $.serviceCidrs = serviceCidrs;
            return this;
        }

        /**
         * @param serviceCidrs A list of CIDRs to use for Kubernetes services. For single-stack networking a single IPv4 CIDR is expected. For dual-stack networking an IPv4 and IPv6 CIDR are expected. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** This range should not be used by any network element on or connected to this VNet. Service address CIDR must be smaller than /12. `docker_bridge_cidr`, `dns_service_ip` and `service_cidr` should all be empty or all should be set.
         * 
         * @return builder
         * 
         */
        public Builder serviceCidrs(List<String> serviceCidrs) {
            return serviceCidrs(Output.of(serviceCidrs));
        }

        /**
         * @param serviceCidrs A list of CIDRs to use for Kubernetes services. For single-stack networking a single IPv4 CIDR is expected. For dual-stack networking an IPv4 and IPv6 CIDR are expected. Changing this forces a new resource to be created.
         * 
         * &gt; **Note:** This range should not be used by any network element on or connected to this VNet. Service address CIDR must be smaller than /12. `docker_bridge_cidr`, `dns_service_ip` and `service_cidr` should all be empty or all should be set.
         * 
         * @return builder
         * 
         */
        public Builder serviceCidrs(String... serviceCidrs) {
            return serviceCidrs(List.of(serviceCidrs));
        }

        public KubernetesClusterNetworkProfileArgs build() {
            $.networkPlugin = Objects.requireNonNull($.networkPlugin, "expected parameter 'networkPlugin' to be non-null");
            return $;
        }
    }

}
