// *** 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.outputs;

import com.pulumi.azure.containerservice.outputs.KubernetesClusterDefaultNodePoolKubeletConfig;
import com.pulumi.azure.containerservice.outputs.KubernetesClusterDefaultNodePoolLinuxOsConfig;
import com.pulumi.azure.containerservice.outputs.KubernetesClusterDefaultNodePoolNodeNetworkProfile;
import com.pulumi.azure.containerservice.outputs.KubernetesClusterDefaultNodePoolUpgradeSettings;
import com.pulumi.core.annotations.CustomType;
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;

@CustomType
public final class KubernetesClusterDefaultNodePool {
    /**
     * @return Specifies the ID of the Capacity Reservation Group within which this AKS Cluster should be created. Changing this forces a new resource to be created.
     * 
     */
    private @Nullable String capacityReservationGroupId;
    /**
     * @return Specifies whether to trust a Custom CA.
     * 
     */
    private @Nullable Boolean customCaTrustEnabled;
    /**
     * @return Should [the Kubernetes Auto Scaler](https://docs.microsoft.com/azure/aks/cluster-autoscaler) be enabled for this Node Pool?
     * 
     * &gt; **Note:** This requires that the `type` is set to `VirtualMachineScaleSets`.
     * 
     * &gt; **Note:** If you&#39;re using AutoScaling, you may wish to use [`ignoreChanges` functionality](https://www.pulumi.com/docs/intro/concepts/programming-model/#ignorechanges) to ignore changes to the `node_count` field.
     * 
     */
    private @Nullable Boolean enableAutoScaling;
    /**
     * @return Should the nodes in the Default Node Pool have host encryption enabled? `temporary_name_for_rotation` must be specified when changing this property.
     * 
     * &gt; **Note:** This requires that the Preview Feature `Microsoft.ContainerService/EnableEncryptionAtHostPreview` is enabled and the Resource Provider is re-registered.
     * 
     */
    private @Nullable Boolean enableHostEncryption;
    /**
     * @return Should nodes in this Node Pool have a Public IP Address? `temporary_name_for_rotation` must be specified when changing this property.
     * 
     */
    private @Nullable Boolean enableNodePublicIp;
    /**
     * @return Should the nodes in this Node Pool have Federal Information Processing Standard enabled? Changing this forces a new resource to be created.
     * 
     */
    private @Nullable Boolean fipsEnabled;
    /**
     * @return Specifies the ID of the Host Group within which this AKS Cluster should be created. Changing this forces a new resource to be created.
     * 
     */
    private @Nullable String hostGroupId;
    /**
     * @return A `kubelet_config` block as defined below. `temporary_name_for_rotation` must be specified when changing this block.
     * 
     */
    private @Nullable KubernetesClusterDefaultNodePoolKubeletConfig kubeletConfig;
    /**
     * @return The type of disk used by kubelet. Possible values are `OS` and `Temporary`.
     * 
     */
    private @Nullable String kubeletDiskType;
    /**
     * @return A `linux_os_config` block as defined below. `temporary_name_for_rotation` must be specified when changing this block.
     * 
     */
    private @Nullable KubernetesClusterDefaultNodePoolLinuxOsConfig linuxOsConfig;
    /**
     * @return The maximum number of nodes which should exist in this Node Pool. If specified this must be between `1` and `1000`.
     * 
     */
    private @Nullable Integer maxCount;
    /**
     * @return The maximum number of pods that can run on each agent. Changing this forces a new resource to be created. `temporary_name_for_rotation` must be specified when changing this property.
     * 
     */
    private @Nullable Integer maxPods;
    /**
     * @return A base64-encoded string which will be written to /etc/motd after decoding. This allows customization of the message of the day for Linux nodes. It cannot be specified for Windows nodes and must be a static string (i.e. will be printed raw and not executed as a script). Changing this forces a new resource to be created.
     * 
     */
    private @Nullable String messageOfTheDay;
    /**
     * @return The minimum number of nodes which should exist in this Node Pool. If specified this must be between `1` and `1000`.
     * 
     */
    private @Nullable Integer minCount;
    /**
     * @return The name which should be used for the default Kubernetes Node Pool. Changing this forces a new resource to be created.
     * 
     */
    private String name;
    /**
     * @return The initial number of nodes which should exist in this Node Pool. If specified this must be between `1` and `1000` and between `min_count` and `max_count`.
     * 
     * &gt; **Note:** If specified you may wish to use [`ignoreChanges` functionality](https://www.pulumi.com/docs/intro/concepts/programming-model/#ignorechanges) to ignore changes to this field.
     * 
     * &gt; **Note:** If `enable_auto_scaling` is set to `false` both `min_count` and `max_count` fields need to be set to `null` or omitted from the configuration.
     * 
     */
    private @Nullable Integer nodeCount;
    /**
     * @return A map of Kubernetes labels which should be applied to nodes in the Default Node Pool.
     * 
     */
    private @Nullable Map<String,String> nodeLabels;
    /**
     * @return A `node_network_profile` block as documented below.
     * 
     */
    private @Nullable KubernetesClusterDefaultNodePoolNodeNetworkProfile nodeNetworkProfile;
    /**
     * @return Resource ID for the Public IP Addresses Prefix for the nodes in this Node Pool. `enable_node_public_ip` should be `true`. Changing this forces a new resource to be created.
     * 
     */
    private @Nullable String nodePublicIpPrefixId;
    /**
     * @return A list of the taints added to new nodes during node pool create and scale. `temporary_name_for_rotation` must be specified when changing this property.
     * 
     */
    private @Nullable List<String> nodeTaints;
    /**
     * @return Enabling this option will taint default node pool with `CriticalAddonsOnly=true:NoSchedule` taint. `temporary_name_for_rotation` must be specified when changing this property.
     * 
     */
    private @Nullable Boolean onlyCriticalAddonsEnabled;
    /**
     * @return Version of Kubernetes used for the Agents. If not specified, the default node pool will be created with the version specified by `kubernetes_version`. If both are unspecified, the latest recommended version will be used at provisioning time (but won&#39;t auto-upgrade). AKS does not require an exact patch version to be specified, minor version aliases such as `1.22` are also supported. - The minor version&#39;s latest GA patch is automatically chosen in that case. More details can be found in [the documentation](https://docs.microsoft.com/en-us/azure/aks/supported-kubernetes-versions?tabs=azure-cli#alias-minor-version).
     * 
     * &gt; **Note:** This version must be supported by the Kubernetes Cluster - as such the version of Kubernetes used on the Cluster/Control Plane may need to be upgraded first.
     * 
     */
    private @Nullable String orchestratorVersion;
    /**
     * @return The size of the OS Disk which should be used for each agent in the Node Pool. `temporary_name_for_rotation` must be specified when attempting a change.
     * 
     */
    private @Nullable Integer osDiskSizeGb;
    /**
     * @return The type of disk which should be used for the Operating System. Possible values are `Ephemeral` and `Managed`. Defaults to `Managed`.  `temporary_name_for_rotation` must be specified when attempting a change.
     * 
     */
    private @Nullable String osDiskType;
    /**
     * @return Specifies the OS SKU used by the agent pool. Possible values include: `AzureLinux`, `Ubuntu`, `Windows2019`, `Windows2022`. If not specified, the default is `Ubuntu` if OSType=Linux or `Windows2019` if OSType=Windows. And the default Windows OSSKU will be changed to `Windows2022` after Windows2019 is deprecated. `temporary_name_for_rotation` must be specified when attempting a change.
     * 
     */
    private @Nullable String osSku;
    /**
     * @return The ID of the Subnet where the pods in the default Node Pool should exist. Changing this forces a new resource to be created.
     * 
     */
    private @Nullable String podSubnetId;
    /**
     * @return The ID of the Proximity Placement Group. Changing this forces a new resource to be created.
     * 
     */
    private @Nullable String proximityPlacementGroupId;
    /**
     * @return Specifies the autoscaling behaviour of the Kubernetes Cluster. Allowed values are `Delete` and `Deallocate`. Defaults to `Delete`.
     * 
     */
    private @Nullable String scaleDownMode;
    /**
     * @return The ID of the Snapshot which should be used to create this default Node Pool. `temporary_name_for_rotation` must be specified when changing this property.
     * 
     */
    private @Nullable String snapshotId;
    /**
     * @return A mapping of tags to assign to the Node Pool.
     * 
     * &gt; At this time there&#39;s a bug in the AKS API where Tags for a Node Pool are not stored in the correct case - you may wish to use `ignore_changes` functionality to ignore changes to the casing until this is fixed in the AKS API.
     * 
     */
    private @Nullable Map<String,String> tags;
    /**
     * @return Specifies the name of the temporary node pool used to cycle the default node pool for VM resizing.
     * 
     */
    private @Nullable String temporaryNameForRotation;
    /**
     * @return The type of Node Pool which should be created. Possible values are `AvailabilitySet` and `VirtualMachineScaleSets`. Defaults to `VirtualMachineScaleSets`. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** When creating a cluster that supports multiple node pools, the cluster must use `VirtualMachineScaleSets`. For more information on the limitations of clusters using multiple node pools see [the documentation](https://learn.microsoft.com/en-us/azure/aks/use-multiple-node-pools#limitations).
     * 
     */
    private @Nullable String type;
    /**
     * @return Used to specify whether the UltraSSD is enabled in the Default Node Pool. Defaults to `false`. See [the documentation](https://docs.microsoft.com/azure/aks/use-ultra-disks) for more information. `temporary_name_for_rotation` must be specified when attempting a change.
     * 
     */
    private @Nullable Boolean ultraSsdEnabled;
    /**
     * @return A `upgrade_settings` block as documented below.
     * 
     */
    private @Nullable KubernetesClusterDefaultNodePoolUpgradeSettings upgradeSettings;
    /**
     * @return The size of the Virtual Machine, such as `Standard_DS2_v2`. `temporary_name_for_rotation` must be specified when attempting a resize.
     * 
     */
    private String vmSize;
    /**
     * @return The ID of a Subnet where the Kubernetes Node Pool should exist. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** A Route Table must be configured on this Subnet.
     * 
     */
    private @Nullable String vnetSubnetId;
    /**
     * @return Specifies the workload runtime used by the node pool. Possible values are `OCIContainer` and `KataMshvVmIsolation`.
     * 
     * &gt; **Note:** Pod Sandboxing / KataVM Isolation node pools are in Public Preview - more information and details on how to opt into the preview can be found in [this article](https://learn.microsoft.com/azure/aks/use-pod-sandboxing)
     * 
     */
    private @Nullable String workloadRuntime;
    /**
     * @return Specifies a list of Availability Zones in which this Kubernetes Cluster should be located. `temporary_name_for_rotation` must be specified when changing this property.
     * 
     * &gt; **Note:** This requires that the `type` is set to `VirtualMachineScaleSets` and that `load_balancer_sku` is set to `standard`.
     * 
     */
    private @Nullable List<String> zones;

    private KubernetesClusterDefaultNodePool() {}
    /**
     * @return Specifies the ID of the Capacity Reservation Group within which this AKS Cluster should be created. Changing this forces a new resource to be created.
     * 
     */
    public Optional<String> capacityReservationGroupId() {
        return Optional.ofNullable(this.capacityReservationGroupId);
    }
    /**
     * @return Specifies whether to trust a Custom CA.
     * 
     */
    public Optional<Boolean> customCaTrustEnabled() {
        return Optional.ofNullable(this.customCaTrustEnabled);
    }
    /**
     * @return Should [the Kubernetes Auto Scaler](https://docs.microsoft.com/azure/aks/cluster-autoscaler) be enabled for this Node Pool?
     * 
     * &gt; **Note:** This requires that the `type` is set to `VirtualMachineScaleSets`.
     * 
     * &gt; **Note:** If you&#39;re using AutoScaling, you may wish to use [`ignoreChanges` functionality](https://www.pulumi.com/docs/intro/concepts/programming-model/#ignorechanges) to ignore changes to the `node_count` field.
     * 
     */
    public Optional<Boolean> enableAutoScaling() {
        return Optional.ofNullable(this.enableAutoScaling);
    }
    /**
     * @return Should the nodes in the Default Node Pool have host encryption enabled? `temporary_name_for_rotation` must be specified when changing this property.
     * 
     * &gt; **Note:** This requires that the Preview Feature `Microsoft.ContainerService/EnableEncryptionAtHostPreview` is enabled and the Resource Provider is re-registered.
     * 
     */
    public Optional<Boolean> enableHostEncryption() {
        return Optional.ofNullable(this.enableHostEncryption);
    }
    /**
     * @return Should nodes in this Node Pool have a Public IP Address? `temporary_name_for_rotation` must be specified when changing this property.
     * 
     */
    public Optional<Boolean> enableNodePublicIp() {
        return Optional.ofNullable(this.enableNodePublicIp);
    }
    /**
     * @return Should the nodes in this Node Pool have Federal Information Processing Standard enabled? Changing this forces a new resource to be created.
     * 
     */
    public Optional<Boolean> fipsEnabled() {
        return Optional.ofNullable(this.fipsEnabled);
    }
    /**
     * @return Specifies the ID of the Host Group within which this AKS Cluster should be created. Changing this forces a new resource to be created.
     * 
     */
    public Optional<String> hostGroupId() {
        return Optional.ofNullable(this.hostGroupId);
    }
    /**
     * @return A `kubelet_config` block as defined below. `temporary_name_for_rotation` must be specified when changing this block.
     * 
     */
    public Optional<KubernetesClusterDefaultNodePoolKubeletConfig> kubeletConfig() {
        return Optional.ofNullable(this.kubeletConfig);
    }
    /**
     * @return The type of disk used by kubelet. Possible values are `OS` and `Temporary`.
     * 
     */
    public Optional<String> kubeletDiskType() {
        return Optional.ofNullable(this.kubeletDiskType);
    }
    /**
     * @return A `linux_os_config` block as defined below. `temporary_name_for_rotation` must be specified when changing this block.
     * 
     */
    public Optional<KubernetesClusterDefaultNodePoolLinuxOsConfig> linuxOsConfig() {
        return Optional.ofNullable(this.linuxOsConfig);
    }
    /**
     * @return The maximum number of nodes which should exist in this Node Pool. If specified this must be between `1` and `1000`.
     * 
     */
    public Optional<Integer> maxCount() {
        return Optional.ofNullable(this.maxCount);
    }
    /**
     * @return The maximum number of pods that can run on each agent. Changing this forces a new resource to be created. `temporary_name_for_rotation` must be specified when changing this property.
     * 
     */
    public Optional<Integer> maxPods() {
        return Optional.ofNullable(this.maxPods);
    }
    /**
     * @return A base64-encoded string which will be written to /etc/motd after decoding. This allows customization of the message of the day for Linux nodes. It cannot be specified for Windows nodes and must be a static string (i.e. will be printed raw and not executed as a script). Changing this forces a new resource to be created.
     * 
     */
    public Optional<String> messageOfTheDay() {
        return Optional.ofNullable(this.messageOfTheDay);
    }
    /**
     * @return The minimum number of nodes which should exist in this Node Pool. If specified this must be between `1` and `1000`.
     * 
     */
    public Optional<Integer> minCount() {
        return Optional.ofNullable(this.minCount);
    }
    /**
     * @return The name which should be used for the default Kubernetes Node Pool. Changing this forces a new resource to be created.
     * 
     */
    public String name() {
        return this.name;
    }
    /**
     * @return The initial number of nodes which should exist in this Node Pool. If specified this must be between `1` and `1000` and between `min_count` and `max_count`.
     * 
     * &gt; **Note:** If specified you may wish to use [`ignoreChanges` functionality](https://www.pulumi.com/docs/intro/concepts/programming-model/#ignorechanges) to ignore changes to this field.
     * 
     * &gt; **Note:** If `enable_auto_scaling` is set to `false` both `min_count` and `max_count` fields need to be set to `null` or omitted from the configuration.
     * 
     */
    public Optional<Integer> nodeCount() {
        return Optional.ofNullable(this.nodeCount);
    }
    /**
     * @return A map of Kubernetes labels which should be applied to nodes in the Default Node Pool.
     * 
     */
    public Map<String,String> nodeLabels() {
        return this.nodeLabels == null ? Map.of() : this.nodeLabels;
    }
    /**
     * @return A `node_network_profile` block as documented below.
     * 
     */
    public Optional<KubernetesClusterDefaultNodePoolNodeNetworkProfile> nodeNetworkProfile() {
        return Optional.ofNullable(this.nodeNetworkProfile);
    }
    /**
     * @return Resource ID for the Public IP Addresses Prefix for the nodes in this Node Pool. `enable_node_public_ip` should be `true`. Changing this forces a new resource to be created.
     * 
     */
    public Optional<String> nodePublicIpPrefixId() {
        return Optional.ofNullable(this.nodePublicIpPrefixId);
    }
    /**
     * @return A list of the taints added to new nodes during node pool create and scale. `temporary_name_for_rotation` must be specified when changing this property.
     * 
     */
    public List<String> nodeTaints() {
        return this.nodeTaints == null ? List.of() : this.nodeTaints;
    }
    /**
     * @return Enabling this option will taint default node pool with `CriticalAddonsOnly=true:NoSchedule` taint. `temporary_name_for_rotation` must be specified when changing this property.
     * 
     */
    public Optional<Boolean> onlyCriticalAddonsEnabled() {
        return Optional.ofNullable(this.onlyCriticalAddonsEnabled);
    }
    /**
     * @return Version of Kubernetes used for the Agents. If not specified, the default node pool will be created with the version specified by `kubernetes_version`. If both are unspecified, the latest recommended version will be used at provisioning time (but won&#39;t auto-upgrade). AKS does not require an exact patch version to be specified, minor version aliases such as `1.22` are also supported. - The minor version&#39;s latest GA patch is automatically chosen in that case. More details can be found in [the documentation](https://docs.microsoft.com/en-us/azure/aks/supported-kubernetes-versions?tabs=azure-cli#alias-minor-version).
     * 
     * &gt; **Note:** This version must be supported by the Kubernetes Cluster - as such the version of Kubernetes used on the Cluster/Control Plane may need to be upgraded first.
     * 
     */
    public Optional<String> orchestratorVersion() {
        return Optional.ofNullable(this.orchestratorVersion);
    }
    /**
     * @return The size of the OS Disk which should be used for each agent in the Node Pool. `temporary_name_for_rotation` must be specified when attempting a change.
     * 
     */
    public Optional<Integer> osDiskSizeGb() {
        return Optional.ofNullable(this.osDiskSizeGb);
    }
    /**
     * @return The type of disk which should be used for the Operating System. Possible values are `Ephemeral` and `Managed`. Defaults to `Managed`.  `temporary_name_for_rotation` must be specified when attempting a change.
     * 
     */
    public Optional<String> osDiskType() {
        return Optional.ofNullable(this.osDiskType);
    }
    /**
     * @return Specifies the OS SKU used by the agent pool. Possible values include: `AzureLinux`, `Ubuntu`, `Windows2019`, `Windows2022`. If not specified, the default is `Ubuntu` if OSType=Linux or `Windows2019` if OSType=Windows. And the default Windows OSSKU will be changed to `Windows2022` after Windows2019 is deprecated. `temporary_name_for_rotation` must be specified when attempting a change.
     * 
     */
    public Optional<String> osSku() {
        return Optional.ofNullable(this.osSku);
    }
    /**
     * @return The ID of the Subnet where the pods in the default Node Pool should exist. Changing this forces a new resource to be created.
     * 
     */
    public Optional<String> podSubnetId() {
        return Optional.ofNullable(this.podSubnetId);
    }
    /**
     * @return The ID of the Proximity Placement Group. Changing this forces a new resource to be created.
     * 
     */
    public Optional<String> proximityPlacementGroupId() {
        return Optional.ofNullable(this.proximityPlacementGroupId);
    }
    /**
     * @return Specifies the autoscaling behaviour of the Kubernetes Cluster. Allowed values are `Delete` and `Deallocate`. Defaults to `Delete`.
     * 
     */
    public Optional<String> scaleDownMode() {
        return Optional.ofNullable(this.scaleDownMode);
    }
    /**
     * @return The ID of the Snapshot which should be used to create this default Node Pool. `temporary_name_for_rotation` must be specified when changing this property.
     * 
     */
    public Optional<String> snapshotId() {
        return Optional.ofNullable(this.snapshotId);
    }
    /**
     * @return A mapping of tags to assign to the Node Pool.
     * 
     * &gt; At this time there&#39;s a bug in the AKS API where Tags for a Node Pool are not stored in the correct case - you may wish to use `ignore_changes` functionality to ignore changes to the casing until this is fixed in the AKS API.
     * 
     */
    public Map<String,String> tags() {
        return this.tags == null ? Map.of() : this.tags;
    }
    /**
     * @return Specifies the name of the temporary node pool used to cycle the default node pool for VM resizing.
     * 
     */
    public Optional<String> temporaryNameForRotation() {
        return Optional.ofNullable(this.temporaryNameForRotation);
    }
    /**
     * @return The type of Node Pool which should be created. Possible values are `AvailabilitySet` and `VirtualMachineScaleSets`. Defaults to `VirtualMachineScaleSets`. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** When creating a cluster that supports multiple node pools, the cluster must use `VirtualMachineScaleSets`. For more information on the limitations of clusters using multiple node pools see [the documentation](https://learn.microsoft.com/en-us/azure/aks/use-multiple-node-pools#limitations).
     * 
     */
    public Optional<String> type() {
        return Optional.ofNullable(this.type);
    }
    /**
     * @return Used to specify whether the UltraSSD is enabled in the Default Node Pool. Defaults to `false`. See [the documentation](https://docs.microsoft.com/azure/aks/use-ultra-disks) for more information. `temporary_name_for_rotation` must be specified when attempting a change.
     * 
     */
    public Optional<Boolean> ultraSsdEnabled() {
        return Optional.ofNullable(this.ultraSsdEnabled);
    }
    /**
     * @return A `upgrade_settings` block as documented below.
     * 
     */
    public Optional<KubernetesClusterDefaultNodePoolUpgradeSettings> upgradeSettings() {
        return Optional.ofNullable(this.upgradeSettings);
    }
    /**
     * @return The size of the Virtual Machine, such as `Standard_DS2_v2`. `temporary_name_for_rotation` must be specified when attempting a resize.
     * 
     */
    public String vmSize() {
        return this.vmSize;
    }
    /**
     * @return The ID of a Subnet where the Kubernetes Node Pool should exist. Changing this forces a new resource to be created.
     * 
     * &gt; **Note:** A Route Table must be configured on this Subnet.
     * 
     */
    public Optional<String> vnetSubnetId() {
        return Optional.ofNullable(this.vnetSubnetId);
    }
    /**
     * @return Specifies the workload runtime used by the node pool. Possible values are `OCIContainer` and `KataMshvVmIsolation`.
     * 
     * &gt; **Note:** Pod Sandboxing / KataVM Isolation node pools are in Public Preview - more information and details on how to opt into the preview can be found in [this article](https://learn.microsoft.com/azure/aks/use-pod-sandboxing)
     * 
     */
    public Optional<String> workloadRuntime() {
        return Optional.ofNullable(this.workloadRuntime);
    }
    /**
     * @return Specifies a list of Availability Zones in which this Kubernetes Cluster should be located. `temporary_name_for_rotation` must be specified when changing this property.
     * 
     * &gt; **Note:** This requires that the `type` is set to `VirtualMachineScaleSets` and that `load_balancer_sku` is set to `standard`.
     * 
     */
    public List<String> zones() {
        return this.zones == null ? List.of() : this.zones;
    }

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

    public static Builder builder(KubernetesClusterDefaultNodePool defaults) {
        return new Builder(defaults);
    }
    @CustomType.Builder
    public static final class Builder {
        private @Nullable String capacityReservationGroupId;
        private @Nullable Boolean customCaTrustEnabled;
        private @Nullable Boolean enableAutoScaling;
        private @Nullable Boolean enableHostEncryption;
        private @Nullable Boolean enableNodePublicIp;
        private @Nullable Boolean fipsEnabled;
        private @Nullable String hostGroupId;
        private @Nullable KubernetesClusterDefaultNodePoolKubeletConfig kubeletConfig;
        private @Nullable String kubeletDiskType;
        private @Nullable KubernetesClusterDefaultNodePoolLinuxOsConfig linuxOsConfig;
        private @Nullable Integer maxCount;
        private @Nullable Integer maxPods;
        private @Nullable String messageOfTheDay;
        private @Nullable Integer minCount;
        private String name;
        private @Nullable Integer nodeCount;
        private @Nullable Map<String,String> nodeLabels;
        private @Nullable KubernetesClusterDefaultNodePoolNodeNetworkProfile nodeNetworkProfile;
        private @Nullable String nodePublicIpPrefixId;
        private @Nullable List<String> nodeTaints;
        private @Nullable Boolean onlyCriticalAddonsEnabled;
        private @Nullable String orchestratorVersion;
        private @Nullable Integer osDiskSizeGb;
        private @Nullable String osDiskType;
        private @Nullable String osSku;
        private @Nullable String podSubnetId;
        private @Nullable String proximityPlacementGroupId;
        private @Nullable String scaleDownMode;
        private @Nullable String snapshotId;
        private @Nullable Map<String,String> tags;
        private @Nullable String temporaryNameForRotation;
        private @Nullable String type;
        private @Nullable Boolean ultraSsdEnabled;
        private @Nullable KubernetesClusterDefaultNodePoolUpgradeSettings upgradeSettings;
        private String vmSize;
        private @Nullable String vnetSubnetId;
        private @Nullable String workloadRuntime;
        private @Nullable List<String> zones;
        public Builder() {}
        public Builder(KubernetesClusterDefaultNodePool defaults) {
    	      Objects.requireNonNull(defaults);
    	      this.capacityReservationGroupId = defaults.capacityReservationGroupId;
    	      this.customCaTrustEnabled = defaults.customCaTrustEnabled;
    	      this.enableAutoScaling = defaults.enableAutoScaling;
    	      this.enableHostEncryption = defaults.enableHostEncryption;
    	      this.enableNodePublicIp = defaults.enableNodePublicIp;
    	      this.fipsEnabled = defaults.fipsEnabled;
    	      this.hostGroupId = defaults.hostGroupId;
    	      this.kubeletConfig = defaults.kubeletConfig;
    	      this.kubeletDiskType = defaults.kubeletDiskType;
    	      this.linuxOsConfig = defaults.linuxOsConfig;
    	      this.maxCount = defaults.maxCount;
    	      this.maxPods = defaults.maxPods;
    	      this.messageOfTheDay = defaults.messageOfTheDay;
    	      this.minCount = defaults.minCount;
    	      this.name = defaults.name;
    	      this.nodeCount = defaults.nodeCount;
    	      this.nodeLabels = defaults.nodeLabels;
    	      this.nodeNetworkProfile = defaults.nodeNetworkProfile;
    	      this.nodePublicIpPrefixId = defaults.nodePublicIpPrefixId;
    	      this.nodeTaints = defaults.nodeTaints;
    	      this.onlyCriticalAddonsEnabled = defaults.onlyCriticalAddonsEnabled;
    	      this.orchestratorVersion = defaults.orchestratorVersion;
    	      this.osDiskSizeGb = defaults.osDiskSizeGb;
    	      this.osDiskType = defaults.osDiskType;
    	      this.osSku = defaults.osSku;
    	      this.podSubnetId = defaults.podSubnetId;
    	      this.proximityPlacementGroupId = defaults.proximityPlacementGroupId;
    	      this.scaleDownMode = defaults.scaleDownMode;
    	      this.snapshotId = defaults.snapshotId;
    	      this.tags = defaults.tags;
    	      this.temporaryNameForRotation = defaults.temporaryNameForRotation;
    	      this.type = defaults.type;
    	      this.ultraSsdEnabled = defaults.ultraSsdEnabled;
    	      this.upgradeSettings = defaults.upgradeSettings;
    	      this.vmSize = defaults.vmSize;
    	      this.vnetSubnetId = defaults.vnetSubnetId;
    	      this.workloadRuntime = defaults.workloadRuntime;
    	      this.zones = defaults.zones;
        }

        @CustomType.Setter
        public Builder capacityReservationGroupId(@Nullable String capacityReservationGroupId) {
            this.capacityReservationGroupId = capacityReservationGroupId;
            return this;
        }
        @CustomType.Setter
        public Builder customCaTrustEnabled(@Nullable Boolean customCaTrustEnabled) {
            this.customCaTrustEnabled = customCaTrustEnabled;
            return this;
        }
        @CustomType.Setter
        public Builder enableAutoScaling(@Nullable Boolean enableAutoScaling) {
            this.enableAutoScaling = enableAutoScaling;
            return this;
        }
        @CustomType.Setter
        public Builder enableHostEncryption(@Nullable Boolean enableHostEncryption) {
            this.enableHostEncryption = enableHostEncryption;
            return this;
        }
        @CustomType.Setter
        public Builder enableNodePublicIp(@Nullable Boolean enableNodePublicIp) {
            this.enableNodePublicIp = enableNodePublicIp;
            return this;
        }
        @CustomType.Setter
        public Builder fipsEnabled(@Nullable Boolean fipsEnabled) {
            this.fipsEnabled = fipsEnabled;
            return this;
        }
        @CustomType.Setter
        public Builder hostGroupId(@Nullable String hostGroupId) {
            this.hostGroupId = hostGroupId;
            return this;
        }
        @CustomType.Setter
        public Builder kubeletConfig(@Nullable KubernetesClusterDefaultNodePoolKubeletConfig kubeletConfig) {
            this.kubeletConfig = kubeletConfig;
            return this;
        }
        @CustomType.Setter
        public Builder kubeletDiskType(@Nullable String kubeletDiskType) {
            this.kubeletDiskType = kubeletDiskType;
            return this;
        }
        @CustomType.Setter
        public Builder linuxOsConfig(@Nullable KubernetesClusterDefaultNodePoolLinuxOsConfig linuxOsConfig) {
            this.linuxOsConfig = linuxOsConfig;
            return this;
        }
        @CustomType.Setter
        public Builder maxCount(@Nullable Integer maxCount) {
            this.maxCount = maxCount;
            return this;
        }
        @CustomType.Setter
        public Builder maxPods(@Nullable Integer maxPods) {
            this.maxPods = maxPods;
            return this;
        }
        @CustomType.Setter
        public Builder messageOfTheDay(@Nullable String messageOfTheDay) {
            this.messageOfTheDay = messageOfTheDay;
            return this;
        }
        @CustomType.Setter
        public Builder minCount(@Nullable Integer minCount) {
            this.minCount = minCount;
            return this;
        }
        @CustomType.Setter
        public Builder name(String name) {
            this.name = Objects.requireNonNull(name);
            return this;
        }
        @CustomType.Setter
        public Builder nodeCount(@Nullable Integer nodeCount) {
            this.nodeCount = nodeCount;
            return this;
        }
        @CustomType.Setter
        public Builder nodeLabels(@Nullable Map<String,String> nodeLabels) {
            this.nodeLabels = nodeLabels;
            return this;
        }
        @CustomType.Setter
        public Builder nodeNetworkProfile(@Nullable KubernetesClusterDefaultNodePoolNodeNetworkProfile nodeNetworkProfile) {
            this.nodeNetworkProfile = nodeNetworkProfile;
            return this;
        }
        @CustomType.Setter
        public Builder nodePublicIpPrefixId(@Nullable String nodePublicIpPrefixId) {
            this.nodePublicIpPrefixId = nodePublicIpPrefixId;
            return this;
        }
        @CustomType.Setter
        public Builder nodeTaints(@Nullable List<String> nodeTaints) {
            this.nodeTaints = nodeTaints;
            return this;
        }
        public Builder nodeTaints(String... nodeTaints) {
            return nodeTaints(List.of(nodeTaints));
        }
        @CustomType.Setter
        public Builder onlyCriticalAddonsEnabled(@Nullable Boolean onlyCriticalAddonsEnabled) {
            this.onlyCriticalAddonsEnabled = onlyCriticalAddonsEnabled;
            return this;
        }
        @CustomType.Setter
        public Builder orchestratorVersion(@Nullable String orchestratorVersion) {
            this.orchestratorVersion = orchestratorVersion;
            return this;
        }
        @CustomType.Setter
        public Builder osDiskSizeGb(@Nullable Integer osDiskSizeGb) {
            this.osDiskSizeGb = osDiskSizeGb;
            return this;
        }
        @CustomType.Setter
        public Builder osDiskType(@Nullable String osDiskType) {
            this.osDiskType = osDiskType;
            return this;
        }
        @CustomType.Setter
        public Builder osSku(@Nullable String osSku) {
            this.osSku = osSku;
            return this;
        }
        @CustomType.Setter
        public Builder podSubnetId(@Nullable String podSubnetId) {
            this.podSubnetId = podSubnetId;
            return this;
        }
        @CustomType.Setter
        public Builder proximityPlacementGroupId(@Nullable String proximityPlacementGroupId) {
            this.proximityPlacementGroupId = proximityPlacementGroupId;
            return this;
        }
        @CustomType.Setter
        public Builder scaleDownMode(@Nullable String scaleDownMode) {
            this.scaleDownMode = scaleDownMode;
            return this;
        }
        @CustomType.Setter
        public Builder snapshotId(@Nullable String snapshotId) {
            this.snapshotId = snapshotId;
            return this;
        }
        @CustomType.Setter
        public Builder tags(@Nullable Map<String,String> tags) {
            this.tags = tags;
            return this;
        }
        @CustomType.Setter
        public Builder temporaryNameForRotation(@Nullable String temporaryNameForRotation) {
            this.temporaryNameForRotation = temporaryNameForRotation;
            return this;
        }
        @CustomType.Setter
        public Builder type(@Nullable String type) {
            this.type = type;
            return this;
        }
        @CustomType.Setter
        public Builder ultraSsdEnabled(@Nullable Boolean ultraSsdEnabled) {
            this.ultraSsdEnabled = ultraSsdEnabled;
            return this;
        }
        @CustomType.Setter
        public Builder upgradeSettings(@Nullable KubernetesClusterDefaultNodePoolUpgradeSettings upgradeSettings) {
            this.upgradeSettings = upgradeSettings;
            return this;
        }
        @CustomType.Setter
        public Builder vmSize(String vmSize) {
            this.vmSize = Objects.requireNonNull(vmSize);
            return this;
        }
        @CustomType.Setter
        public Builder vnetSubnetId(@Nullable String vnetSubnetId) {
            this.vnetSubnetId = vnetSubnetId;
            return this;
        }
        @CustomType.Setter
        public Builder workloadRuntime(@Nullable String workloadRuntime) {
            this.workloadRuntime = workloadRuntime;
            return this;
        }
        @CustomType.Setter
        public Builder zones(@Nullable List<String> zones) {
            this.zones = zones;
            return this;
        }
        public Builder zones(String... zones) {
            return zones(List.of(zones));
        }
        public KubernetesClusterDefaultNodePool build() {
            final var o = new KubernetesClusterDefaultNodePool();
            o.capacityReservationGroupId = capacityReservationGroupId;
            o.customCaTrustEnabled = customCaTrustEnabled;
            o.enableAutoScaling = enableAutoScaling;
            o.enableHostEncryption = enableHostEncryption;
            o.enableNodePublicIp = enableNodePublicIp;
            o.fipsEnabled = fipsEnabled;
            o.hostGroupId = hostGroupId;
            o.kubeletConfig = kubeletConfig;
            o.kubeletDiskType = kubeletDiskType;
            o.linuxOsConfig = linuxOsConfig;
            o.maxCount = maxCount;
            o.maxPods = maxPods;
            o.messageOfTheDay = messageOfTheDay;
            o.minCount = minCount;
            o.name = name;
            o.nodeCount = nodeCount;
            o.nodeLabels = nodeLabels;
            o.nodeNetworkProfile = nodeNetworkProfile;
            o.nodePublicIpPrefixId = nodePublicIpPrefixId;
            o.nodeTaints = nodeTaints;
            o.onlyCriticalAddonsEnabled = onlyCriticalAddonsEnabled;
            o.orchestratorVersion = orchestratorVersion;
            o.osDiskSizeGb = osDiskSizeGb;
            o.osDiskType = osDiskType;
            o.osSku = osSku;
            o.podSubnetId = podSubnetId;
            o.proximityPlacementGroupId = proximityPlacementGroupId;
            o.scaleDownMode = scaleDownMode;
            o.snapshotId = snapshotId;
            o.tags = tags;
            o.temporaryNameForRotation = temporaryNameForRotation;
            o.type = type;
            o.ultraSsdEnabled = ultraSsdEnabled;
            o.upgradeSettings = upgradeSettings;
            o.vmSize = vmSize;
            o.vnetSubnetId = vnetSubnetId;
            o.workloadRuntime = workloadRuntime;
            o.zones = zones;
            return o;
        }
    }
}
