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

import com.pulumi.azure.Utilities;
import com.pulumi.azure.compute.WindowsVirtualMachineScaleSetArgs;
import com.pulumi.azure.compute.inputs.WindowsVirtualMachineScaleSetState;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetAdditionalCapabilities;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetAdditionalUnattendContent;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetAutomaticInstanceRepair;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetBootDiagnostics;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetDataDisk;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetExtension;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetGalleryApplication;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetIdentity;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetNetworkInterface;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetOsDisk;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetPlan;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetRollingUpgradePolicy;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetScaleIn;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetSecret;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetSourceImageReference;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetSpotRestore;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetTerminateNotification;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetTerminationNotification;
import com.pulumi.azure.compute.outputs.WindowsVirtualMachineScaleSetWinrmListener;
import com.pulumi.core.Output;
import com.pulumi.core.annotations.Export;
import com.pulumi.core.annotations.ResourceType;
import com.pulumi.core.internal.Codegen;
import java.lang.Boolean;
import java.lang.Double;
import java.lang.Integer;
import java.lang.String;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import javax.annotation.Nullable;

/**
 * Manages a Windows Virtual Machine Scale Set.
 * 
 * ## Disclaimers
 * 
 * &gt; **NOTE:**: All arguments including the administrator login and password will be stored in the raw state as plain-text.
 * 
 * &gt; **NOTE:** This provider will automatically update &amp; reimage the nodes in the Scale Set (if Required) during an Update - this behaviour can be configured using the `features` setting within the Provider block.
 * 
 * &gt; **NOTE:** This resource does not support Unmanaged Disks. If you need to use Unmanaged Disks you can continue to use the `azure.compute.ScaleSet` resource instead
 * 
 * ## Example Usage
 * 
 * This example provisions a basic Windows Virtual Machine Scale Set on an internal network.
 * ```java
 * package generated_program;
 * 
 * import com.pulumi.Context;
 * import com.pulumi.Pulumi;
 * import com.pulumi.core.Output;
 * import com.pulumi.azure.core.ResourceGroup;
 * import com.pulumi.azure.core.ResourceGroupArgs;
 * import com.pulumi.azure.network.VirtualNetwork;
 * import com.pulumi.azure.network.VirtualNetworkArgs;
 * import com.pulumi.azure.network.Subnet;
 * import com.pulumi.azure.network.SubnetArgs;
 * import com.pulumi.azure.compute.WindowsVirtualMachineScaleSet;
 * import com.pulumi.azure.compute.WindowsVirtualMachineScaleSetArgs;
 * import com.pulumi.azure.compute.inputs.WindowsVirtualMachineScaleSetSourceImageReferenceArgs;
 * import com.pulumi.azure.compute.inputs.WindowsVirtualMachineScaleSetOsDiskArgs;
 * import com.pulumi.azure.compute.inputs.WindowsVirtualMachineScaleSetNetworkInterfaceArgs;
 * import java.util.List;
 * import java.util.ArrayList;
 * import java.util.Map;
 * import java.io.File;
 * import java.nio.file.Files;
 * import java.nio.file.Paths;
 * 
 * public class App {
 *     public static void main(String[] args) {
 *         Pulumi.run(App::stack);
 *     }
 * 
 *     public static void stack(Context ctx) {
 *         var exampleResourceGroup = new ResourceGroup(&#34;exampleResourceGroup&#34;, ResourceGroupArgs.builder()        
 *             .location(&#34;West Europe&#34;)
 *             .build());
 * 
 *         var exampleVirtualNetwork = new VirtualNetwork(&#34;exampleVirtualNetwork&#34;, VirtualNetworkArgs.builder()        
 *             .resourceGroupName(exampleResourceGroup.name())
 *             .location(exampleResourceGroup.location())
 *             .addressSpaces(&#34;10.0.0.0/16&#34;)
 *             .build());
 * 
 *         var internal = new Subnet(&#34;internal&#34;, SubnetArgs.builder()        
 *             .resourceGroupName(exampleResourceGroup.name())
 *             .virtualNetworkName(exampleVirtualNetwork.name())
 *             .addressPrefixes(&#34;10.0.2.0/24&#34;)
 *             .build());
 * 
 *         var exampleWindowsVirtualMachineScaleSet = new WindowsVirtualMachineScaleSet(&#34;exampleWindowsVirtualMachineScaleSet&#34;, WindowsVirtualMachineScaleSetArgs.builder()        
 *             .resourceGroupName(exampleResourceGroup.name())
 *             .location(exampleResourceGroup.location())
 *             .sku(&#34;Standard_F2&#34;)
 *             .instances(1)
 *             .adminPassword(&#34;P@55w0rd1234!&#34;)
 *             .adminUsername(&#34;adminuser&#34;)
 *             .sourceImageReference(WindowsVirtualMachineScaleSetSourceImageReferenceArgs.builder()
 *                 .publisher(&#34;MicrosoftWindowsServer&#34;)
 *                 .offer(&#34;WindowsServer&#34;)
 *                 .sku(&#34;2016-Datacenter-Server-Core&#34;)
 *                 .version(&#34;latest&#34;)
 *                 .build())
 *             .osDisk(WindowsVirtualMachineScaleSetOsDiskArgs.builder()
 *                 .storageAccountType(&#34;Standard_LRS&#34;)
 *                 .caching(&#34;ReadWrite&#34;)
 *                 .build())
 *             .networkInterfaces(WindowsVirtualMachineScaleSetNetworkInterfaceArgs.builder()
 *                 .name(&#34;example&#34;)
 *                 .primary(true)
 *                 .ipConfigurations(WindowsVirtualMachineScaleSetNetworkInterfaceIpConfigurationArgs.builder()
 *                     .name(&#34;internal&#34;)
 *                     .primary(true)
 *                     .subnetId(internal.id())
 *                     .build())
 *                 .build())
 *             .build());
 * 
 *     }
 * }
 * ```
 * 
 * ## Import
 * 
 * Windows Virtual Machine Scale Sets can be imported using the `resource id`, e.g.
 * 
 * ```sh
 *  $ pulumi import azure:compute/windowsVirtualMachineScaleSet:WindowsVirtualMachineScaleSet example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Compute/virtualMachineScaleSets/scaleset1
 * ```
 * 
 */
@ResourceType(type="azure:compute/windowsVirtualMachineScaleSet:WindowsVirtualMachineScaleSet")
public class WindowsVirtualMachineScaleSet extends com.pulumi.resources.CustomResource {
    /**
     * An `additional_capabilities` block as defined below.
     * 
     */
    @Export(name="additionalCapabilities", refs={WindowsVirtualMachineScaleSetAdditionalCapabilities.class}, tree="[0]")
    private Output</* @Nullable */ WindowsVirtualMachineScaleSetAdditionalCapabilities> additionalCapabilities;

    /**
     * @return An `additional_capabilities` block as defined below.
     * 
     */
    public Output<Optional<WindowsVirtualMachineScaleSetAdditionalCapabilities>> additionalCapabilities() {
        return Codegen.optional(this.additionalCapabilities);
    }
    /**
     * One or more `additional_unattend_content` blocks as defined below. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="additionalUnattendContents", refs={List.class,WindowsVirtualMachineScaleSetAdditionalUnattendContent.class}, tree="[0,1]")
    private Output</* @Nullable */ List<WindowsVirtualMachineScaleSetAdditionalUnattendContent>> additionalUnattendContents;

    /**
     * @return One or more `additional_unattend_content` blocks as defined below. Changing this forces a new resource to be created.
     * 
     */
    public Output<Optional<List<WindowsVirtualMachineScaleSetAdditionalUnattendContent>>> additionalUnattendContents() {
        return Codegen.optional(this.additionalUnattendContents);
    }
    /**
     * The Password which should be used for the local-administrator on this Virtual Machine. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="adminPassword", refs={String.class}, tree="[0]")
    private Output<String> adminPassword;

    /**
     * @return The Password which should be used for the local-administrator on this Virtual Machine. Changing this forces a new resource to be created.
     * 
     */
    public Output<String> adminPassword() {
        return this.adminPassword;
    }
    /**
     * The username of the local administrator on each Virtual Machine Scale Set instance. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="adminUsername", refs={String.class}, tree="[0]")
    private Output<String> adminUsername;

    /**
     * @return The username of the local administrator on each Virtual Machine Scale Set instance. Changing this forces a new resource to be created.
     * 
     */
    public Output<String> adminUsername() {
        return this.adminUsername;
    }
    /**
     * An `automatic_instance_repair` block as defined below. To enable the automatic instance repair, this Virtual Machine Scale Set must have a valid `health_probe_id` or an [Application Health Extension](https://docs.microsoft.com/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-health-extension).
     * 
     * &gt; **NOTE:** For more information about Automatic Instance Repair, please refer to [this doc](https://docs.microsoft.com/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-automatic-instance-repairs).
     * 
     */
    @Export(name="automaticInstanceRepair", refs={WindowsVirtualMachineScaleSetAutomaticInstanceRepair.class}, tree="[0]")
    private Output<WindowsVirtualMachineScaleSetAutomaticInstanceRepair> automaticInstanceRepair;

    /**
     * @return An `automatic_instance_repair` block as defined below. To enable the automatic instance repair, this Virtual Machine Scale Set must have a valid `health_probe_id` or an [Application Health Extension](https://docs.microsoft.com/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-health-extension).
     * 
     * &gt; **NOTE:** For more information about Automatic Instance Repair, please refer to [this doc](https://docs.microsoft.com/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-automatic-instance-repairs).
     * 
     */
    public Output<WindowsVirtualMachineScaleSetAutomaticInstanceRepair> automaticInstanceRepair() {
        return this.automaticInstanceRepair;
    }
    /**
     * An `automatic_os_upgrade_policy` block as defined below. This can only be specified when `upgrade_mode` is set to either `Automatic` or `Rolling`.
     * 
     */
    @Export(name="automaticOsUpgradePolicy", refs={WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy.class}, tree="[0]")
    private Output</* @Nullable */ WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy> automaticOsUpgradePolicy;

    /**
     * @return An `automatic_os_upgrade_policy` block as defined below. This can only be specified when `upgrade_mode` is set to either `Automatic` or `Rolling`.
     * 
     */
    public Output<Optional<WindowsVirtualMachineScaleSetAutomaticOsUpgradePolicy>> automaticOsUpgradePolicy() {
        return Codegen.optional(this.automaticOsUpgradePolicy);
    }
    /**
     * A `boot_diagnostics` block as defined below.
     * 
     */
    @Export(name="bootDiagnostics", refs={WindowsVirtualMachineScaleSetBootDiagnostics.class}, tree="[0]")
    private Output</* @Nullable */ WindowsVirtualMachineScaleSetBootDiagnostics> bootDiagnostics;

    /**
     * @return A `boot_diagnostics` block as defined below.
     * 
     */
    public Output<Optional<WindowsVirtualMachineScaleSetBootDiagnostics>> bootDiagnostics() {
        return Codegen.optional(this.bootDiagnostics);
    }
    /**
     * Specifies the ID of the Capacity Reservation Group which the Virtual Machine Scale Set should be allocated to. Changing this forces a new resource to be created.
     * 
     * &gt; **NOTE:** `capacity_reservation_group_id` cannot be used with `proximity_placement_group_id`
     * 
     * &gt; **NOTE:** `single_placement_group` must be set to `false` when `capacity_reservation_group_id` is specified.
     * 
     */
    @Export(name="capacityReservationGroupId", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> capacityReservationGroupId;

    /**
     * @return Specifies the ID of the Capacity Reservation Group which the Virtual Machine Scale Set should be allocated to. Changing this forces a new resource to be created.
     * 
     * &gt; **NOTE:** `capacity_reservation_group_id` cannot be used with `proximity_placement_group_id`
     * 
     * &gt; **NOTE:** `single_placement_group` must be set to `false` when `capacity_reservation_group_id` is specified.
     * 
     */
    public Output<Optional<String>> capacityReservationGroupId() {
        return Codegen.optional(this.capacityReservationGroupId);
    }
    /**
     * The prefix which should be used for the name of the Virtual Machines in this Scale Set. If unspecified this defaults to the value for the `name` field. If the value of the `name` field is not a valid `computer_name_prefix`, then you must specify `computer_name_prefix`. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="computerNamePrefix", refs={String.class}, tree="[0]")
    private Output<String> computerNamePrefix;

    /**
     * @return The prefix which should be used for the name of the Virtual Machines in this Scale Set. If unspecified this defaults to the value for the `name` field. If the value of the `name` field is not a valid `computer_name_prefix`, then you must specify `computer_name_prefix`. Changing this forces a new resource to be created.
     * 
     */
    public Output<String> computerNamePrefix() {
        return this.computerNamePrefix;
    }
    /**
     * The Base64-Encoded Custom Data which should be used for this Virtual Machine Scale Set.
     * 
     * &gt; **NOTE:** When Custom Data has been configured, it&#39;s not possible to remove it without tainting the Virtual Machine Scale Set, due to a limitation of the Azure API.
     * 
     */
    @Export(name="customData", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> customData;

    /**
     * @return The Base64-Encoded Custom Data which should be used for this Virtual Machine Scale Set.
     * 
     * &gt; **NOTE:** When Custom Data has been configured, it&#39;s not possible to remove it without tainting the Virtual Machine Scale Set, due to a limitation of the Azure API.
     * 
     */
    public Output<Optional<String>> customData() {
        return Codegen.optional(this.customData);
    }
    /**
     * One or more `data_disk` blocks as defined below.
     * 
     */
    @Export(name="dataDisks", refs={List.class,WindowsVirtualMachineScaleSetDataDisk.class}, tree="[0,1]")
    private Output</* @Nullable */ List<WindowsVirtualMachineScaleSetDataDisk>> dataDisks;

    /**
     * @return One or more `data_disk` blocks as defined below.
     * 
     */
    public Output<Optional<List<WindowsVirtualMachineScaleSetDataDisk>>> dataDisks() {
        return Codegen.optional(this.dataDisks);
    }
    /**
     * Should Virtual Machine Extensions be run on Overprovisioned Virtual Machines in the Scale Set? Defaults to `false`.
     * 
     */
    @Export(name="doNotRunExtensionsOnOverprovisionedMachines", refs={Boolean.class}, tree="[0]")
    private Output</* @Nullable */ Boolean> doNotRunExtensionsOnOverprovisionedMachines;

    /**
     * @return Should Virtual Machine Extensions be run on Overprovisioned Virtual Machines in the Scale Set? Defaults to `false`.
     * 
     */
    public Output<Optional<Boolean>> doNotRunExtensionsOnOverprovisionedMachines() {
        return Codegen.optional(this.doNotRunExtensionsOnOverprovisionedMachines);
    }
    /**
     * Specifies the Edge Zone within the Azure Region where this Windows Virtual Machine Scale Set should exist. Changing this forces a new Windows Virtual Machine Scale Set to be created.
     * 
     */
    @Export(name="edgeZone", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> edgeZone;

    /**
     * @return Specifies the Edge Zone within the Azure Region where this Windows Virtual Machine Scale Set should exist. Changing this forces a new Windows Virtual Machine Scale Set to be created.
     * 
     */
    public Output<Optional<String>> edgeZone() {
        return Codegen.optional(this.edgeZone);
    }
    /**
     * Are automatic updates enabled for this Virtual Machine? Defaults to `true`.
     * 
     */
    @Export(name="enableAutomaticUpdates", refs={Boolean.class}, tree="[0]")
    private Output</* @Nullable */ Boolean> enableAutomaticUpdates;

    /**
     * @return Are automatic updates enabled for this Virtual Machine? Defaults to `true`.
     * 
     */
    public Output<Optional<Boolean>> enableAutomaticUpdates() {
        return Codegen.optional(this.enableAutomaticUpdates);
    }
    /**
     * Should all of the disks (including the temp disk) attached to this Virtual Machine be encrypted by enabling Encryption at Host?
     * 
     */
    @Export(name="encryptionAtHostEnabled", refs={Boolean.class}, tree="[0]")
    private Output</* @Nullable */ Boolean> encryptionAtHostEnabled;

    /**
     * @return Should all of the disks (including the temp disk) attached to this Virtual Machine be encrypted by enabling Encryption at Host?
     * 
     */
    public Output<Optional<Boolean>> encryptionAtHostEnabled() {
        return Codegen.optional(this.encryptionAtHostEnabled);
    }
    /**
     * Specifies the eviction policy for Virtual Machines in this Scale Set. Possible values are `Deallocate` and `Delete`. Changing this forces a new resource to be created.
     * 
     * &gt; **NOTE:** This can only be configured when `priority` is set to `Spot`.
     * 
     */
    @Export(name="evictionPolicy", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> evictionPolicy;

    /**
     * @return Specifies the eviction policy for Virtual Machines in this Scale Set. Possible values are `Deallocate` and `Delete`. Changing this forces a new resource to be created.
     * 
     * &gt; **NOTE:** This can only be configured when `priority` is set to `Spot`.
     * 
     */
    public Output<Optional<String>> evictionPolicy() {
        return Codegen.optional(this.evictionPolicy);
    }
    /**
     * Should extension operations be allowed on the Virtual Machine Scale Set? Possible values are `true` or `false`. Defaults to `true`. Changing this forces a new Windows Virtual Machine Scale Set to be created.
     * 
     * &gt; **NOTE:** `extension_operations_enabled` may only be set to `false` if there are no extensions defined in the `extension` field.
     * 
     */
    @Export(name="extensionOperationsEnabled", refs={Boolean.class}, tree="[0]")
    private Output<Boolean> extensionOperationsEnabled;

    /**
     * @return Should extension operations be allowed on the Virtual Machine Scale Set? Possible values are `true` or `false`. Defaults to `true`. Changing this forces a new Windows Virtual Machine Scale Set to be created.
     * 
     * &gt; **NOTE:** `extension_operations_enabled` may only be set to `false` if there are no extensions defined in the `extension` field.
     * 
     */
    public Output<Boolean> extensionOperationsEnabled() {
        return this.extensionOperationsEnabled;
    }
    /**
     * One or more `extension` blocks as defined below
     * 
     */
    @Export(name="extensions", refs={List.class,WindowsVirtualMachineScaleSetExtension.class}, tree="[0,1]")
    private Output<List<WindowsVirtualMachineScaleSetExtension>> extensions;

    /**
     * @return One or more `extension` blocks as defined below
     * 
     */
    public Output<List<WindowsVirtualMachineScaleSetExtension>> extensions() {
        return this.extensions;
    }
    /**
     * Specifies the duration allocated for all extensions to start. The time duration should be between `15` minutes and `120` minutes (inclusive) and should be specified in ISO 8601 format. Defaults to `90` minutes (`PT1H30M`).
     * 
     */
    @Export(name="extensionsTimeBudget", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> extensionsTimeBudget;

    /**
     * @return Specifies the duration allocated for all extensions to start. The time duration should be between `15` minutes and `120` minutes (inclusive) and should be specified in ISO 8601 format. Defaults to `90` minutes (`PT1H30M`).
     * 
     */
    public Output<Optional<String>> extensionsTimeBudget() {
        return Codegen.optional(this.extensionsTimeBudget);
    }
    /**
     * One or more `gallery_application` blocks as defined below.
     * 
     */
    @Export(name="galleryApplication", refs={List.class,WindowsVirtualMachineScaleSetGalleryApplication.class}, tree="[0,1]")
    private Output<List<WindowsVirtualMachineScaleSetGalleryApplication>> galleryApplication;

    /**
     * @return One or more `gallery_application` blocks as defined below.
     * 
     */
    public Output<List<WindowsVirtualMachineScaleSetGalleryApplication>> galleryApplication() {
        return this.galleryApplication;
    }
    /**
     * @deprecated
     * `gallery_applications` has been renamed to `gallery_application` and will be deprecated in 4.0
     * 
     */
    @Deprecated /* `gallery_applications` has been renamed to `gallery_application` and will be deprecated in 4.0 */
    @Export(name="galleryApplications", refs={List.class,WindowsVirtualMachineScaleSetGalleryApplication.class}, tree="[0,1]")
    private Output<List<WindowsVirtualMachineScaleSetGalleryApplication>> galleryApplications;

    public Output<List<WindowsVirtualMachineScaleSetGalleryApplication>> galleryApplications() {
        return this.galleryApplications;
    }
    /**
     * The ID of a Load Balancer Probe which should be used to determine the health of an instance. This is Required and can only be specified when `upgrade_mode` is set to `Automatic` or `Rolling`.
     * 
     */
    @Export(name="healthProbeId", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> healthProbeId;

    /**
     * @return The ID of a Load Balancer Probe which should be used to determine the health of an instance. This is Required and can only be specified when `upgrade_mode` is set to `Automatic` or `Rolling`.
     * 
     */
    public Output<Optional<String>> healthProbeId() {
        return Codegen.optional(this.healthProbeId);
    }
    /**
     * Specifies the ID of the dedicated host group that the virtual machine scale set resides in. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="hostGroupId", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> hostGroupId;

    /**
     * @return Specifies the ID of the dedicated host group that the virtual machine scale set resides in. Changing this forces a new resource to be created.
     * 
     */
    public Output<Optional<String>> hostGroupId() {
        return Codegen.optional(this.hostGroupId);
    }
    /**
     * An `identity` block as defined below.
     * 
     */
    @Export(name="identity", refs={WindowsVirtualMachineScaleSetIdentity.class}, tree="[0]")
    private Output</* @Nullable */ WindowsVirtualMachineScaleSetIdentity> identity;

    /**
     * @return An `identity` block as defined below.
     * 
     */
    public Output<Optional<WindowsVirtualMachineScaleSetIdentity>> identity() {
        return Codegen.optional(this.identity);
    }
    /**
     * The number of Virtual Machines in the Scale Set.
     * 
     * &gt; **NOTE:** If you&#39;re using AutoScaling, you may wish to use [`Ignore Changes` functionality](https://www.pulumi.com/docs/intro/concepts/programming-model/#ignorechanges) to ignore changes to this field.
     * 
     */
    @Export(name="instances", refs={Integer.class}, tree="[0]")
    private Output<Integer> instances;

    /**
     * @return The number of Virtual Machines in the Scale Set.
     * 
     * &gt; **NOTE:** If you&#39;re using AutoScaling, you may wish to use [`Ignore Changes` functionality](https://www.pulumi.com/docs/intro/concepts/programming-model/#ignorechanges) to ignore changes to this field.
     * 
     */
    public Output<Integer> instances() {
        return this.instances;
    }
    /**
     * Specifies the type of on-premise license (also known as [Azure Hybrid Use Benefit](https://docs.microsoft.com/azure/virtual-machines/virtual-machines-windows-hybrid-use-benefit-licensing)) which should be used for this Virtual Machine Scale Set. Possible values are `None`, `Windows_Client` and `Windows_Server`.
     * 
     */
    @Export(name="licenseType", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> licenseType;

    /**
     * @return Specifies the type of on-premise license (also known as [Azure Hybrid Use Benefit](https://docs.microsoft.com/azure/virtual-machines/virtual-machines-windows-hybrid-use-benefit-licensing)) which should be used for this Virtual Machine Scale Set. Possible values are `None`, `Windows_Client` and `Windows_Server`.
     * 
     */
    public Output<Optional<String>> licenseType() {
        return Codegen.optional(this.licenseType);
    }
    /**
     * The Azure location where the Windows Virtual Machine Scale Set should exist. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="location", refs={String.class}, tree="[0]")
    private Output<String> location;

    /**
     * @return The Azure location where the Windows Virtual Machine Scale Set should exist. Changing this forces a new resource to be created.
     * 
     */
    public Output<String> location() {
        return this.location;
    }
    /**
     * The maximum price you&#39;re willing to pay for each Virtual Machine in this Scale Set, in US Dollars; which must be greater than the current spot price. If this bid price falls below the current spot price the Virtual Machines in the Scale Set will be evicted using the `eviction_policy`. Defaults to `-1`, which means that each Virtual Machine in the Scale Set should not be evicted for price reasons.
     * 
     * &gt; **NOTE:** This can only be configured when `priority` is set to `Spot`.
     * 
     */
    @Export(name="maxBidPrice", refs={Double.class}, tree="[0]")
    private Output</* @Nullable */ Double> maxBidPrice;

    /**
     * @return The maximum price you&#39;re willing to pay for each Virtual Machine in this Scale Set, in US Dollars; which must be greater than the current spot price. If this bid price falls below the current spot price the Virtual Machines in the Scale Set will be evicted using the `eviction_policy`. Defaults to `-1`, which means that each Virtual Machine in the Scale Set should not be evicted for price reasons.
     * 
     * &gt; **NOTE:** This can only be configured when `priority` is set to `Spot`.
     * 
     */
    public Output<Optional<Double>> maxBidPrice() {
        return Codegen.optional(this.maxBidPrice);
    }
    /**
     * The name of the Windows Virtual Machine Scale Set. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="name", refs={String.class}, tree="[0]")
    private Output<String> name;

    /**
     * @return The name of the Windows Virtual Machine Scale Set. Changing this forces a new resource to be created.
     * 
     */
    public Output<String> name() {
        return this.name;
    }
    /**
     * One or more `network_interface` blocks as defined below.
     * 
     */
    @Export(name="networkInterfaces", refs={List.class,WindowsVirtualMachineScaleSetNetworkInterface.class}, tree="[0,1]")
    private Output<List<WindowsVirtualMachineScaleSetNetworkInterface>> networkInterfaces;

    /**
     * @return One or more `network_interface` blocks as defined below.
     * 
     */
    public Output<List<WindowsVirtualMachineScaleSetNetworkInterface>> networkInterfaces() {
        return this.networkInterfaces;
    }
    /**
     * An `os_disk` block as defined below.
     * 
     */
    @Export(name="osDisk", refs={WindowsVirtualMachineScaleSetOsDisk.class}, tree="[0]")
    private Output<WindowsVirtualMachineScaleSetOsDisk> osDisk;

    /**
     * @return An `os_disk` block as defined below.
     * 
     */
    public Output<WindowsVirtualMachineScaleSetOsDisk> osDisk() {
        return this.osDisk;
    }
    /**
     * Should Azure over-provision Virtual Machines in this Scale Set? This means that multiple Virtual Machines will be provisioned and Azure will keep the instances which become available first - which improves provisioning success rates and improves deployment time. You&#39;re not billed for these over-provisioned VM&#39;s and they don&#39;t count towards the Subscription Quota. Defaults to `true`.
     * 
     */
    @Export(name="overprovision", refs={Boolean.class}, tree="[0]")
    private Output</* @Nullable */ Boolean> overprovision;

    /**
     * @return Should Azure over-provision Virtual Machines in this Scale Set? This means that multiple Virtual Machines will be provisioned and Azure will keep the instances which become available first - which improves provisioning success rates and improves deployment time. You&#39;re not billed for these over-provisioned VM&#39;s and they don&#39;t count towards the Subscription Quota. Defaults to `true`.
     * 
     */
    public Output<Optional<Boolean>> overprovision() {
        return Codegen.optional(this.overprovision);
    }
    /**
     * A `plan` block as defined below. Changing this forces a new resource to be created.
     * 
     * &gt; **NOTE:** When using an image from Azure Marketplace a `plan` must be specified.
     * 
     */
    @Export(name="plan", refs={WindowsVirtualMachineScaleSetPlan.class}, tree="[0]")
    private Output</* @Nullable */ WindowsVirtualMachineScaleSetPlan> plan;

    /**
     * @return A `plan` block as defined below. Changing this forces a new resource to be created.
     * 
     * &gt; **NOTE:** When using an image from Azure Marketplace a `plan` must be specified.
     * 
     */
    public Output<Optional<WindowsVirtualMachineScaleSetPlan>> plan() {
        return Codegen.optional(this.plan);
    }
    /**
     * Specifies the number of fault domains that are used by this Linux Virtual Machine Scale Set. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="platformFaultDomainCount", refs={Integer.class}, tree="[0]")
    private Output<Integer> platformFaultDomainCount;

    /**
     * @return Specifies the number of fault domains that are used by this Linux Virtual Machine Scale Set. Changing this forces a new resource to be created.
     * 
     */
    public Output<Integer> platformFaultDomainCount() {
        return this.platformFaultDomainCount;
    }
    /**
     * The Priority of this Virtual Machine Scale Set. Possible values are `Regular` and `Spot`. Defaults to `Regular`. Changing this value forces a new resource.
     * 
     * &gt; **NOTE:** When `priority` is set to `Spot` an `eviction_policy` must be specified.
     * 
     */
    @Export(name="priority", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> priority;

    /**
     * @return The Priority of this Virtual Machine Scale Set. Possible values are `Regular` and `Spot`. Defaults to `Regular`. Changing this value forces a new resource.
     * 
     * &gt; **NOTE:** When `priority` is set to `Spot` an `eviction_policy` must be specified.
     * 
     */
    public Output<Optional<String>> priority() {
        return Codegen.optional(this.priority);
    }
    /**
     * Should the Azure VM Agent be provisioned on each Virtual Machine in the Scale Set? Defaults to `true`. Changing this value forces a new resource to be created.
     * 
     */
    @Export(name="provisionVmAgent", refs={Boolean.class}, tree="[0]")
    private Output</* @Nullable */ Boolean> provisionVmAgent;

    /**
     * @return Should the Azure VM Agent be provisioned on each Virtual Machine in the Scale Set? Defaults to `true`. Changing this value forces a new resource to be created.
     * 
     */
    public Output<Optional<Boolean>> provisionVmAgent() {
        return Codegen.optional(this.provisionVmAgent);
    }
    /**
     * The ID of the Proximity Placement Group in which the Virtual Machine Scale Set should be assigned to. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="proximityPlacementGroupId", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> proximityPlacementGroupId;

    /**
     * @return The ID of the Proximity Placement Group in which the Virtual Machine Scale Set should be assigned to. Changing this forces a new resource to be created.
     * 
     */
    public Output<Optional<String>> proximityPlacementGroupId() {
        return Codegen.optional(this.proximityPlacementGroupId);
    }
    /**
     * The name of the Resource Group in which the Windows Virtual Machine Scale Set should be exist. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="resourceGroupName", refs={String.class}, tree="[0]")
    private Output<String> resourceGroupName;

    /**
     * @return The name of the Resource Group in which the Windows Virtual Machine Scale Set should be exist. Changing this forces a new resource to be created.
     * 
     */
    public Output<String> resourceGroupName() {
        return this.resourceGroupName;
    }
    /**
     * A `rolling_upgrade_policy` block as defined below. This is Required and can only be specified when `upgrade_mode` is set to `Automatic` or `Rolling`. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="rollingUpgradePolicy", refs={WindowsVirtualMachineScaleSetRollingUpgradePolicy.class}, tree="[0]")
    private Output</* @Nullable */ WindowsVirtualMachineScaleSetRollingUpgradePolicy> rollingUpgradePolicy;

    /**
     * @return A `rolling_upgrade_policy` block as defined below. This is Required and can only be specified when `upgrade_mode` is set to `Automatic` or `Rolling`. Changing this forces a new resource to be created.
     * 
     */
    public Output<Optional<WindowsVirtualMachineScaleSetRollingUpgradePolicy>> rollingUpgradePolicy() {
        return Codegen.optional(this.rollingUpgradePolicy);
    }
    /**
     * A `scale_in` block as defined below.
     * 
     */
    @Export(name="scaleIn", refs={WindowsVirtualMachineScaleSetScaleIn.class}, tree="[0]")
    private Output<WindowsVirtualMachineScaleSetScaleIn> scaleIn;

    /**
     * @return A `scale_in` block as defined below.
     * 
     */
    public Output<WindowsVirtualMachineScaleSetScaleIn> scaleIn() {
        return this.scaleIn;
    }
    /**
     * @deprecated
     * `scale_in_policy` will be removed in favour of the `scale_in` code block in version 4.0 of the AzureRM Provider.
     * 
     */
    @Deprecated /* `scale_in_policy` will be removed in favour of the `scale_in` code block in version 4.0 of the AzureRM Provider. */
    @Export(name="scaleInPolicy", refs={String.class}, tree="[0]")
    private Output<String> scaleInPolicy;

    public Output<String> scaleInPolicy() {
        return this.scaleInPolicy;
    }
    /**
     * One or more `secret` blocks as defined below.
     * 
     */
    @Export(name="secrets", refs={List.class,WindowsVirtualMachineScaleSetSecret.class}, tree="[0,1]")
    private Output</* @Nullable */ List<WindowsVirtualMachineScaleSetSecret>> secrets;

    /**
     * @return One or more `secret` blocks as defined below.
     * 
     */
    public Output<Optional<List<WindowsVirtualMachineScaleSetSecret>>> secrets() {
        return Codegen.optional(this.secrets);
    }
    /**
     * Specifies if Secure Boot and Trusted Launch is enabled for the Virtual Machine. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="secureBootEnabled", refs={Boolean.class}, tree="[0]")
    private Output</* @Nullable */ Boolean> secureBootEnabled;

    /**
     * @return Specifies if Secure Boot and Trusted Launch is enabled for the Virtual Machine. Changing this forces a new resource to be created.
     * 
     */
    public Output<Optional<Boolean>> secureBootEnabled() {
        return Codegen.optional(this.secureBootEnabled);
    }
    /**
     * Should this Virtual Machine Scale Set be limited to a Single Placement Group, which means the number of instances will be capped at 100 Virtual Machines. Defaults to `true`.
     * 
     */
    @Export(name="singlePlacementGroup", refs={Boolean.class}, tree="[0]")
    private Output</* @Nullable */ Boolean> singlePlacementGroup;

    /**
     * @return Should this Virtual Machine Scale Set be limited to a Single Placement Group, which means the number of instances will be capped at 100 Virtual Machines. Defaults to `true`.
     * 
     */
    public Output<Optional<Boolean>> singlePlacementGroup() {
        return Codegen.optional(this.singlePlacementGroup);
    }
    /**
     * The Virtual Machine SKU for the Scale Set, such as `Standard_F2`.
     * 
     */
    @Export(name="sku", refs={String.class}, tree="[0]")
    private Output<String> sku;

    /**
     * @return The Virtual Machine SKU for the Scale Set, such as `Standard_F2`.
     * 
     */
    public Output<String> sku() {
        return this.sku;
    }
    /**
     * The ID of an Image which each Virtual Machine in this Scale Set should be based on. Possible Image ID types include `Image ID`s, `Shared Image ID`s, `Shared Image Version ID`s, `Community Gallery Image ID`s, `Community Gallery Image Version ID`s, `Shared Gallery Image ID`s and `Shared Gallery Image Version ID`s.
     * 
     * &gt; **NOTE:** One of either `source_image_id` or `source_image_reference` must be set.
     * 
     */
    @Export(name="sourceImageId", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> sourceImageId;

    /**
     * @return The ID of an Image which each Virtual Machine in this Scale Set should be based on. Possible Image ID types include `Image ID`s, `Shared Image ID`s, `Shared Image Version ID`s, `Community Gallery Image ID`s, `Community Gallery Image Version ID`s, `Shared Gallery Image ID`s and `Shared Gallery Image Version ID`s.
     * 
     * &gt; **NOTE:** One of either `source_image_id` or `source_image_reference` must be set.
     * 
     */
    public Output<Optional<String>> sourceImageId() {
        return Codegen.optional(this.sourceImageId);
    }
    /**
     * A `source_image_reference` block as defined below.
     * 
     * &gt; **NOTE:** One of either `source_image_id` or `source_image_reference` must be set.
     * 
     */
    @Export(name="sourceImageReference", refs={WindowsVirtualMachineScaleSetSourceImageReference.class}, tree="[0]")
    private Output</* @Nullable */ WindowsVirtualMachineScaleSetSourceImageReference> sourceImageReference;

    /**
     * @return A `source_image_reference` block as defined below.
     * 
     * &gt; **NOTE:** One of either `source_image_id` or `source_image_reference` must be set.
     * 
     */
    public Output<Optional<WindowsVirtualMachineScaleSetSourceImageReference>> sourceImageReference() {
        return Codegen.optional(this.sourceImageReference);
    }
    /**
     * A `spot_restore` block as defined below.
     * 
     */
    @Export(name="spotRestore", refs={WindowsVirtualMachineScaleSetSpotRestore.class}, tree="[0]")
    private Output<WindowsVirtualMachineScaleSetSpotRestore> spotRestore;

    /**
     * @return A `spot_restore` block as defined below.
     * 
     */
    public Output<WindowsVirtualMachineScaleSetSpotRestore> spotRestore() {
        return this.spotRestore;
    }
    /**
     * A mapping of tags which should be assigned to this Virtual Machine Scale Set.
     * 
     */
    @Export(name="tags", refs={Map.class,String.class}, tree="[0,1,1]")
    private Output</* @Nullable */ Map<String,String>> tags;

    /**
     * @return A mapping of tags which should be assigned to this Virtual Machine Scale Set.
     * 
     */
    public Output<Optional<Map<String,String>>> tags() {
        return Codegen.optional(this.tags);
    }
    /**
     * A `terminate_notification` block as defined below.
     * 
     * &gt; **Note:** This property has been deprecated in favour of the `termination_notification` property and will be removed in version 4.0 of the provider.
     * 
     * @deprecated
     * `terminate_notification` has been renamed to `termination_notification` and will be removed in 4.0.
     * 
     */
    @Deprecated /* `terminate_notification` has been renamed to `termination_notification` and will be removed in 4.0. */
    @Export(name="terminateNotification", refs={WindowsVirtualMachineScaleSetTerminateNotification.class}, tree="[0]")
    private Output<WindowsVirtualMachineScaleSetTerminateNotification> terminateNotification;

    /**
     * @return A `terminate_notification` block as defined below.
     * 
     * &gt; **Note:** This property has been deprecated in favour of the `termination_notification` property and will be removed in version 4.0 of the provider.
     * 
     */
    public Output<WindowsVirtualMachineScaleSetTerminateNotification> terminateNotification() {
        return this.terminateNotification;
    }
    /**
     * A `termination_notification` block as defined below.
     * 
     */
    @Export(name="terminationNotification", refs={WindowsVirtualMachineScaleSetTerminationNotification.class}, tree="[0]")
    private Output<WindowsVirtualMachineScaleSetTerminationNotification> terminationNotification;

    /**
     * @return A `termination_notification` block as defined below.
     * 
     */
    public Output<WindowsVirtualMachineScaleSetTerminationNotification> terminationNotification() {
        return this.terminationNotification;
    }
    /**
     * Specifies the time zone of the virtual machine, [the possible values are defined here](https://jackstromberg.com/2017/01/list-of-time-zones-consumed-by-azure/).
     * 
     */
    @Export(name="timezone", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> timezone;

    /**
     * @return Specifies the time zone of the virtual machine, [the possible values are defined here](https://jackstromberg.com/2017/01/list-of-time-zones-consumed-by-azure/).
     * 
     */
    public Output<Optional<String>> timezone() {
        return Codegen.optional(this.timezone);
    }
    /**
     * The Unique ID for this Windows Virtual Machine Scale Set.
     * 
     */
    @Export(name="uniqueId", refs={String.class}, tree="[0]")
    private Output<String> uniqueId;

    /**
     * @return The Unique ID for this Windows Virtual Machine Scale Set.
     * 
     */
    public Output<String> uniqueId() {
        return this.uniqueId;
    }
    /**
     * Specifies how Upgrades (e.g. changing the Image/SKU) should be performed to Virtual Machine Instances. Possible values are `Automatic`, `Manual` and `Rolling`. Defaults to `Manual`. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="upgradeMode", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> upgradeMode;

    /**
     * @return Specifies how Upgrades (e.g. changing the Image/SKU) should be performed to Virtual Machine Instances. Possible values are `Automatic`, `Manual` and `Rolling`. Defaults to `Manual`. Changing this forces a new resource to be created.
     * 
     */
    public Output<Optional<String>> upgradeMode() {
        return Codegen.optional(this.upgradeMode);
    }
    /**
     * The Base64-Encoded User Data which should be used for this Virtual Machine Scale Set.
     * 
     */
    @Export(name="userData", refs={String.class}, tree="[0]")
    private Output</* @Nullable */ String> userData;

    /**
     * @return The Base64-Encoded User Data which should be used for this Virtual Machine Scale Set.
     * 
     */
    public Output<Optional<String>> userData() {
        return Codegen.optional(this.userData);
    }
    /**
     * Specifies if vTPM (Virtual Trusted Platform Module) and Trusted Launch is enabled for the Virtual Machine. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="vtpmEnabled", refs={Boolean.class}, tree="[0]")
    private Output</* @Nullable */ Boolean> vtpmEnabled;

    /**
     * @return Specifies if vTPM (Virtual Trusted Platform Module) and Trusted Launch is enabled for the Virtual Machine. Changing this forces a new resource to be created.
     * 
     */
    public Output<Optional<Boolean>> vtpmEnabled() {
        return Codegen.optional(this.vtpmEnabled);
    }
    /**
     * One or more `winrm_listener` blocks as defined below. Changing this forces a new resource to be created.
     * 
     */
    @Export(name="winrmListeners", refs={List.class,WindowsVirtualMachineScaleSetWinrmListener.class}, tree="[0,1]")
    private Output</* @Nullable */ List<WindowsVirtualMachineScaleSetWinrmListener>> winrmListeners;

    /**
     * @return One or more `winrm_listener` blocks as defined below. Changing this forces a new resource to be created.
     * 
     */
    public Output<Optional<List<WindowsVirtualMachineScaleSetWinrmListener>>> winrmListeners() {
        return Codegen.optional(this.winrmListeners);
    }
    /**
     * Should the Virtual Machines in this Scale Set be strictly evenly distributed across Availability Zones? Defaults to `false`. Changing this forces a new resource to be created.
     * 
     * &gt; **NOTE:** This can only be set to `true` when one or more `zones` are configured.
     * 
     */
    @Export(name="zoneBalance", refs={Boolean.class}, tree="[0]")
    private Output</* @Nullable */ Boolean> zoneBalance;

    /**
     * @return Should the Virtual Machines in this Scale Set be strictly evenly distributed across Availability Zones? Defaults to `false`. Changing this forces a new resource to be created.
     * 
     * &gt; **NOTE:** This can only be set to `true` when one or more `zones` are configured.
     * 
     */
    public Output<Optional<Boolean>> zoneBalance() {
        return Codegen.optional(this.zoneBalance);
    }
    /**
     * Specifies a list of Availability Zones in which this Windows Virtual Machine Scale Set should be located. Changing this forces a new Windows Virtual Machine Scale Set to be created.
     * 
     */
    @Export(name="zones", refs={List.class,String.class}, tree="[0,1]")
    private Output</* @Nullable */ List<String>> zones;

    /**
     * @return Specifies a list of Availability Zones in which this Windows Virtual Machine Scale Set should be located. Changing this forces a new Windows Virtual Machine Scale Set to be created.
     * 
     */
    public Output<Optional<List<String>>> zones() {
        return Codegen.optional(this.zones);
    }

    /**
     *
     * @param name The _unique_ name of the resulting resource.
     */
    public WindowsVirtualMachineScaleSet(String name) {
        this(name, WindowsVirtualMachineScaleSetArgs.Empty);
    }
    /**
     *
     * @param name The _unique_ name of the resulting resource.
     * @param args The arguments to use to populate this resource's properties.
     */
    public WindowsVirtualMachineScaleSet(String name, WindowsVirtualMachineScaleSetArgs args) {
        this(name, args, null);
    }
    /**
     *
     * @param name The _unique_ name of the resulting resource.
     * @param args The arguments to use to populate this resource's properties.
     * @param options A bag of options that control this resource's behavior.
     */
    public WindowsVirtualMachineScaleSet(String name, WindowsVirtualMachineScaleSetArgs args, @Nullable com.pulumi.resources.CustomResourceOptions options) {
        super("azure:compute/windowsVirtualMachineScaleSet:WindowsVirtualMachineScaleSet", name, args == null ? WindowsVirtualMachineScaleSetArgs.Empty : args, makeResourceOptions(options, Codegen.empty()));
    }

    private WindowsVirtualMachineScaleSet(String name, Output<String> id, @Nullable WindowsVirtualMachineScaleSetState state, @Nullable com.pulumi.resources.CustomResourceOptions options) {
        super("azure:compute/windowsVirtualMachineScaleSet:WindowsVirtualMachineScaleSet", name, state, makeResourceOptions(options, id));
    }

    private static com.pulumi.resources.CustomResourceOptions makeResourceOptions(@Nullable com.pulumi.resources.CustomResourceOptions options, @Nullable Output<String> id) {
        var defaultOptions = com.pulumi.resources.CustomResourceOptions.builder()
            .version(Utilities.getVersion())
            .additionalSecretOutputs(List.of(
                "adminPassword",
                "customData"
            ))
            .build();
        return com.pulumi.resources.CustomResourceOptions.merge(defaultOptions, options, id);
    }

    /**
     * Get an existing Host resource's state with the given name, ID, and optional extra
     * properties used to qualify the lookup.
     *
     * @param name The _unique_ name of the resulting resource.
     * @param id The _unique_ provider ID of the resource to lookup.
     * @param state
     * @param options Optional settings to control the behavior of the CustomResource.
     */
    public static WindowsVirtualMachineScaleSet get(String name, Output<String> id, @Nullable WindowsVirtualMachineScaleSetState state, @Nullable com.pulumi.resources.CustomResourceOptions options) {
        return new WindowsVirtualMachineScaleSet(name, id, state, options);
    }
}
