diff --git a/internal/services/compute/linux_virtual_machine_scale_set_resource.go b/internal/services/compute/linux_virtual_machine_scale_set_resource.go index 894c38633d80..0559d4d367b3 100644 --- a/internal/services/compute/linux_virtual_machine_scale_set_resource.go +++ b/internal/services/compute/linux_virtual_machine_scale_set_resource.go @@ -124,6 +124,7 @@ func resourceLinuxVirtualMachineScaleSetCreate(d *pluginsdk.ResourceData, meta i sshKeysRaw := d.Get("admin_ssh_key").(*pluginsdk.Set).List() sshKeys := expandSSHKeysVMSS(sshKeysRaw) + overProvision := d.Get("overprovision").(bool) provisionVMAgent := d.Get("provision_vm_agent").(bool) zones := zones.ExpandUntyped(d.Get("zones").(*schema.Set).List()) healthProbeId := d.Get("health_probe_id").(string) @@ -131,7 +132,7 @@ func resourceLinuxVirtualMachineScaleSetCreate(d *pluginsdk.ResourceData, meta i automaticOSUpgradePolicyRaw := d.Get("automatic_os_upgrade_policy").([]interface{}) automaticOSUpgradePolicy := ExpandVirtualMachineScaleSetAutomaticUpgradePolicy(automaticOSUpgradePolicyRaw) rollingUpgradePolicyRaw := d.Get("rolling_upgrade_policy").([]interface{}) - rollingUpgradePolicy, err := ExpandVirtualMachineScaleSetRollingUpgradePolicy(rollingUpgradePolicyRaw, len(zones) > 0) + rollingUpgradePolicy, err := ExpandVirtualMachineScaleSetRollingUpgradePolicy(rollingUpgradePolicyRaw, len(zones) > 0, overProvision) if err != nil { return err } @@ -533,7 +534,7 @@ func resourceLinuxVirtualMachineScaleSetUpdate(d *pluginsdk.ResourceData, meta i if d.HasChange("rolling_upgrade_policy") { rollingRaw := d.Get("rolling_upgrade_policy").([]interface{}) zones := zones.ExpandUntyped(d.Get("zones").(*schema.Set).List()) - rollingUpgradePolicy, err := ExpandVirtualMachineScaleSetRollingUpgradePolicy(rollingRaw, len(zones) > 0) + rollingUpgradePolicy, err := ExpandVirtualMachineScaleSetRollingUpgradePolicy(rollingRaw, len(zones) > 0, d.Get("overprovision").(bool)) if err != nil { return err } diff --git a/internal/services/compute/linux_virtual_machine_scale_set_resource_other_test.go b/internal/services/compute/linux_virtual_machine_scale_set_resource_other_test.go index b68f30457910..284285a36483 100644 --- a/internal/services/compute/linux_virtual_machine_scale_set_resource_other_test.go +++ b/internal/services/compute/linux_virtual_machine_scale_set_resource_other_test.go @@ -665,14 +665,14 @@ func TestAccLinuxVirtualMachineScaleSet_otherRollingUpgradePolicyUpdate(t *testi data.ResourceTest(t, r, []acceptance.TestStep{ { - Config: r.otherRollingUpgradePolicyUpdate(data, true, 10, 10, 10, "PT0S", true), + Config: r.otherRollingUpgradePolicyUpdate(data, true, 10, 10, 10, "PT0S", true, false), Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), ), }, data.ImportStep("admin_password"), { - Config: r.otherRollingUpgradePolicyUpdate(data, false, 20, 20, 20, "PT1S", false), + Config: r.otherRollingUpgradePolicyUpdate(data, false, 20, 20, 20, "PT1S", false, true), Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), ), @@ -2727,7 +2727,7 @@ resource "azurerm_linux_virtual_machine_scale_set" "test" { `, r.template(data), data.RandomInteger) } -func (r LinuxVirtualMachineScaleSetResource) otherRollingUpgradePolicyUpdate(data acceptance.TestData, cross_zone_upgrades_enabled bool, max_batch_instance_percent, max_unhealthy_instance_percent, max_unhealthy_upgraded_instance_percent int, pause_time_between_batches string, prioritize_unhealthy_instances_enabled bool) string { +func (r LinuxVirtualMachineScaleSetResource) otherRollingUpgradePolicyUpdate(data acceptance.TestData, cross_zone_upgrades_enabled bool, max_batch_instance_percent, max_unhealthy_instance_percent, max_unhealthy_upgraded_instance_percent int, pause_time_between_batches string, prioritize_unhealthy_instances_enabled bool, maximum_surge_instances bool) string { return fmt.Sprintf(` %s @@ -2786,6 +2786,7 @@ resource "azurerm_linux_virtual_machine_scale_set" "test" { upgrade_mode = "Rolling" health_probe_id = azurerm_lb_probe.test.id + overprovision = false rolling_upgrade_policy { cross_zone_upgrades_enabled = %t @@ -2794,6 +2795,7 @@ resource "azurerm_linux_virtual_machine_scale_set" "test" { max_unhealthy_upgraded_instance_percent = %d pause_time_between_batches = "%s" prioritize_unhealthy_instances_enabled = %t + maximum_surge_instances = %t } source_image_reference { @@ -2822,7 +2824,7 @@ resource "azurerm_linux_virtual_machine_scale_set" "test" { depends_on = [azurerm_lb_rule.test] } -`, r.template(data), data.RandomInteger, cross_zone_upgrades_enabled, max_batch_instance_percent, max_unhealthy_instance_percent, max_unhealthy_upgraded_instance_percent, pause_time_between_batches, prioritize_unhealthy_instances_enabled) +`, r.template(data), data.RandomInteger, cross_zone_upgrades_enabled, max_batch_instance_percent, max_unhealthy_instance_percent, max_unhealthy_upgraded_instance_percent, pause_time_between_batches, prioritize_unhealthy_instances_enabled, maximum_surge_instances) } func (r LinuxVirtualMachineScaleSetResource) otherHealthProbe(data acceptance.TestData) string { diff --git a/internal/services/compute/virtual_machine_scale_set.go b/internal/services/compute/virtual_machine_scale_set.go index 2ee21c701b3e..ce3433e5f87a 100644 --- a/internal/services/compute/virtual_machine_scale_set.go +++ b/internal/services/compute/virtual_machine_scale_set.go @@ -1738,12 +1738,16 @@ func VirtualMachineScaleSetRollingUpgradePolicySchema() *pluginsdk.Schema { Type: pluginsdk.TypeBool, Optional: true, }, + "maximum_surge_instances": { + Type: pluginsdk.TypeBool, + Optional: true, + }, }, }, } } -func ExpandVirtualMachineScaleSetRollingUpgradePolicy(input []interface{}, isZonal bool) (*virtualmachinescalesets.RollingUpgradePolicy, error) { +func ExpandVirtualMachineScaleSetRollingUpgradePolicy(input []interface{}, isZonal, overProvision bool) (*virtualmachinescalesets.RollingUpgradePolicy, error) { if len(input) == 0 { return nil, nil } @@ -1756,6 +1760,7 @@ func ExpandVirtualMachineScaleSetRollingUpgradePolicy(input []interface{}, isZon MaxUnhealthyUpgradedInstancePercent: pointer.To(int64(raw["max_unhealthy_upgraded_instance_percent"].(int))), PauseTimeBetweenBatches: pointer.To(raw["pause_time_between_batches"].(string)), PrioritizeUnhealthyInstances: pointer.To(raw["prioritize_unhealthy_instances_enabled"].(bool)), + MaxSurge: pointer.To(raw["maximum_surge_instances"].(bool)), } enableCrossZoneUpgrade := raw["cross_zone_upgrades_enabled"].(bool) @@ -1766,6 +1771,12 @@ func ExpandVirtualMachineScaleSetRollingUpgradePolicy(input []interface{}, isZon return nil, fmt.Errorf("`rolling_upgrade_policy.0.cross_zone_upgrades_enabled` can only be set to `true` when `zones` is specified") } + maxSurge := raw["maximum_surge_instances"].(bool) + if overProvision && maxSurge { + // MaxSurge can only be set when overprovision is set to false + return nil, fmt.Errorf("`rolling_upgrade_policy.0.maximum_surge_instances` can only be set to `true` when `overprovision` is disabled (set to `false`)") + } + return rollingUpgradePolicy, nil } @@ -1804,6 +1815,11 @@ func FlattenVirtualMachineScaleSetRollingUpgradePolicy(input *virtualmachinescal prioritizeUnhealthyInstances = *input.PrioritizeUnhealthyInstances } + maxSurge := false + if input.MaxSurge != nil { + maxSurge = *input.MaxSurge + } + return []interface{}{ map[string]interface{}{ "cross_zone_upgrades_enabled": enableCrossZoneUpgrade, @@ -1812,6 +1828,7 @@ func FlattenVirtualMachineScaleSetRollingUpgradePolicy(input *virtualmachinescal "max_unhealthy_upgraded_instance_percent": maxUnhealthyUpgradedInstancePercent, "pause_time_between_batches": pauseTimeBetweenBatches, "prioritize_unhealthy_instances_enabled": prioritizeUnhealthyInstances, + "maximum_surge_instances": maxSurge, }, } } diff --git a/internal/services/compute/windows_virtual_machine_scale_set_resource.go b/internal/services/compute/windows_virtual_machine_scale_set_resource.go index a919a93f3ede..1bebc358bb06 100644 --- a/internal/services/compute/windows_virtual_machine_scale_set_resource.go +++ b/internal/services/compute/windows_virtual_machine_scale_set_resource.go @@ -121,6 +121,7 @@ func resourceWindowsVirtualMachineScaleSetCreate(d *pluginsdk.ResourceData, meta sourceImageId := d.Get("source_image_id").(string) sourceImageReference := expandSourceImageReferenceVMSS(sourceImageReferenceRaw, sourceImageId) + overProvision := d.Get("overprovision").(bool) provisionVMAgent := d.Get("provision_vm_agent").(bool) zones := zones.ExpandUntyped(d.Get("zones").(*schema.Set).List()) healthProbeId := d.Get("health_probe_id").(string) @@ -128,7 +129,7 @@ func resourceWindowsVirtualMachineScaleSetCreate(d *pluginsdk.ResourceData, meta automaticOSUpgradePolicyRaw := d.Get("automatic_os_upgrade_policy").([]interface{}) automaticOSUpgradePolicy := ExpandVirtualMachineScaleSetAutomaticUpgradePolicy(automaticOSUpgradePolicyRaw) rollingUpgradePolicyRaw := d.Get("rolling_upgrade_policy").([]interface{}) - rollingUpgradePolicy, err := ExpandVirtualMachineScaleSetRollingUpgradePolicy(rollingUpgradePolicyRaw, len(zones) > 0) + rollingUpgradePolicy, err := ExpandVirtualMachineScaleSetRollingUpgradePolicy(rollingUpgradePolicyRaw, len(zones) > 0, overProvision) if err != nil { return err } @@ -540,7 +541,7 @@ func resourceWindowsVirtualMachineScaleSetUpdate(d *pluginsdk.ResourceData, meta if d.HasChange("rolling_upgrade_policy") { rollingRaw := d.Get("rolling_upgrade_policy").([]interface{}) zones := zones.ExpandUntyped(d.Get("zones").(*schema.Set).List()) - rollingUpgradePolicy, err := ExpandVirtualMachineScaleSetRollingUpgradePolicy(rollingRaw, len(zones) > 0) + rollingUpgradePolicy, err := ExpandVirtualMachineScaleSetRollingUpgradePolicy(rollingRaw, len(zones) > 0, d.Get("overprovision").(bool)) if err != nil { return err } diff --git a/website/docs/r/linux_virtual_machine_scale_set.html.markdown b/website/docs/r/linux_virtual_machine_scale_set.html.markdown index 8d4115f936d6..7e22fa081435 100644 --- a/website/docs/r/linux_virtual_machine_scale_set.html.markdown +++ b/website/docs/r/linux_virtual_machine_scale_set.html.markdown @@ -540,6 +540,10 @@ A `rolling_upgrade_policy` block supports the following: * `prioritize_unhealthy_instances_enabled` - (Optional) Upgrade all unhealthy instances in a scale set before any healthy instances. Possible values are `true` or `false`. +* `maximum_surge_instances` - (Optional) Create new virtual machines to upgrade the scale set, rather than updating the existing virtual machines. Existing virtual machines will be deleted once the new virtual machines are created for each batch. Possible values are `true` or `false`. + +-> **NOTE:** `overprovision` must be set to `false` when `maximum_surge_instances` is specified. + --- A `secret` block supports the following: diff --git a/website/docs/r/windows_virtual_machine_scale_set.html.markdown b/website/docs/r/windows_virtual_machine_scale_set.html.markdown index 62bcb654c6a8..7b7c54dcddf2 100644 --- a/website/docs/r/windows_virtual_machine_scale_set.html.markdown +++ b/website/docs/r/windows_virtual_machine_scale_set.html.markdown @@ -529,6 +529,10 @@ A `rolling_upgrade_policy` block supports the following: * `prioritize_unhealthy_instances_enabled` - (Optional) Upgrade all unhealthy instances in a scale set before any healthy instances. Possible values are `true` or `false`. +* `maximum_surge_instances` - (Optional) Create new virtual machines to upgrade the scale set, rather than updating the existing virtual machines. Existing virtual machines will be deleted once the new virtual machines are created for each batch. Possible values are `true` or `false`. + +-> **NOTE:** `overprovision` must be set to `false` when `maximum_surge_instances` is specified. + --- A `secret` block supports the following: