Skip to content

Commit

Permalink
Update azurerm_orchestrated_virtual_machine_scale_set - Add proximi…
Browse files Browse the repository at this point in the history
…ty placement group support (#7510)
  • Loading branch information
ArcturusZhang authored Jul 14, 2020
1 parent da36af7 commit b46afd2
Show file tree
Hide file tree
Showing 6 changed files with 211 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ func resourceArmLinuxVirtualMachineScaleSet() *schema.Resource {
Optional: true,
ForceNew: true,
ValidateFunc: validate.ProximityPlacementGroupID,
// the Compute API is broken and returns the Resource Group name in UPPERCASE :shrug:
// the Compute API is broken and returns the Resource Group name in UPPERCASE :shrug:, github issue: https://github.com/Azure/azure-rest-api-specs/issues/10016
DiffSuppressFunc: suppress.CaseDifference,
},

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/suppress"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/location"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/compute/parse"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/compute/validate"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tags"
azSchema "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tf/schema"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts"
Expand Down Expand Up @@ -58,6 +60,15 @@ func resourceArmOrchestratedVirtualMachineScaleSet() *schema.Resource {
ValidateFunc: validation.IntBetween(0, 5),
},

"proximity_placement_group_id": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
ValidateFunc: validate.ProximityPlacementGroupID,
// the Compute/VM API is broken and returns the Resource Group name in UPPERCASE :shrug:, github issue: https://github.com/Azure/azure-rest-api-specs/issues/10016
DiffSuppressFunc: suppress.CaseDifference,
},

"single_placement_group": {
Type: schema.TypeBool,
Optional: true,
Expand Down Expand Up @@ -111,6 +122,12 @@ func resourceArmOrchestratedVirtualMachineScaleSetCreateUpdate(d *schema.Resourc
Zones: azure.ExpandZones(d.Get("zones").([]interface{})),
}

if v, ok := d.GetOk("proximity_placement_group_id"); ok {
props.VirtualMachineScaleSetProperties.ProximityPlacementGroup = &compute.SubResource{
ID: utils.String(v.(string)),
}
}

future, err := client.CreateOrUpdate(ctx, resourceGroup, name, props)
if err != nil {
return fmt.Errorf("creating Orchestrated Virtual Machine Scale Set %q (Resource Group %q): %+v", name, resourceGroup, err)
Expand Down Expand Up @@ -161,6 +178,11 @@ func resourceArmOrchestratedVirtualMachineScaleSetRead(d *schema.ResourceData, m
if props := resp.VirtualMachineScaleSetProperties; props != nil {
d.Set("platform_fault_domain_count", props.PlatformFaultDomainCount)
d.Set("single_placement_group", props.SinglePlacementGroup)
proximityPlacementGroupID := ""
if props.ProximityPlacementGroup != nil && props.ProximityPlacementGroup.ID != nil {
proximityPlacementGroupID = *props.ProximityPlacementGroup.ID
}
d.Set("proximity_placement_group_id", proximityPlacementGroupID)
d.Set("unique_id", props.UniqueID)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,26 @@ func TestAccAzureRMLinuxVirtualMachine_orchestratedZonal(t *testing.T) {
checkLinuxVirtualMachineExists(data.ResourceName),
),
},
data.ImportStep("admin_password"),
},
})
}

func TestAccAzureRMLinuxVirtualMachine_orchestratedZonalWithProximityPlacementGroup(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_linux_virtual_machine", "test")

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acceptance.PreCheck(t) },
Providers: acceptance.SupportedProviders,
CheckDestroy: checkLinuxVirtualMachineIsDestroyed,
Steps: []resource.TestStep{
{
Config: testAccAzureRMLinuxVirtualMachine_orchestratedZonalWithProximityPlacementGroup(data),
Check: resource.ComposeTestCheckFunc(
checkLinuxVirtualMachineExists(data.ResourceName),
),
},
data.ImportStep("admin_password"),
},
})
}
Expand All @@ -40,6 +60,7 @@ func TestAccAzureRMLinuxVirtualMachine_orchestratedNonZonal(t *testing.T) {
checkLinuxVirtualMachineExists(data.ResourceName),
),
},
data.ImportStep("admin_password"),
},
})
}
Expand All @@ -58,6 +79,7 @@ func TestAccAzureRMLinuxVirtualMachine_orchestratedMultipleZonal(t *testing.T) {
checkLinuxVirtualMachineExists(data.ResourceName),
),
},
data.ImportStep("admin_password"),
},
})
}
Expand All @@ -76,6 +98,7 @@ func TestAccAzureRMLinuxVirtualMachine_orchestratedMultipleNonZonal(t *testing.T
checkLinuxVirtualMachineExists(data.ResourceName),
),
},
data.ImportStep("admin_password"),
},
})
}
Expand Down Expand Up @@ -141,6 +164,78 @@ resource "azurerm_linux_virtual_machine" "test" {
`, template, data.RandomInteger, data.RandomInteger, data.RandomInteger)
}

func testAccAzureRMLinuxVirtualMachine_orchestratedZonalWithProximityPlacementGroup(data acceptance.TestData) string {
template := testLinuxVirtualMachine_templateBaseForOchestratedVMSS(data)
return fmt.Sprintf(`
%s
resource "azurerm_proximity_placement_group" "test" {
name = "acctestPPG-%d"
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
}
resource "azurerm_network_interface" "test" {
name = "acctestnic-%d"
location = azurerm_resource_group.test.location
resource_group_name = azurerm_resource_group.test.name
ip_configuration {
name = "internal"
subnet_id = azurerm_subnet.test.id
private_ip_address_allocation = "Dynamic"
}
}
resource "azurerm_orchestrated_virtual_machine_scale_set" "test" {
name = "acctestVMO-%d"
location = azurerm_resource_group.test.location
resource_group_name = azurerm_resource_group.test.name
platform_fault_domain_count = 1
proximity_placement_group_id = azurerm_proximity_placement_group.test.id
zones = ["1"]
tags = {
ENV = "Test"
}
}
resource "azurerm_linux_virtual_machine" "test" {
name = "acctestVM-%d"
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
size = "Standard_F2"
admin_username = "adminuser"
admin_password = "P@ssw0rd1234!"
disable_password_authentication = false
proximity_placement_group_id = azurerm_proximity_placement_group.test.id
network_interface_ids = [
azurerm_network_interface.test.id,
]
source_image_reference {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "16.04-LTS"
version = "latest"
}
os_disk {
storage_account_type = "Standard_LRS"
caching = "ReadWrite"
}
virtual_machine_scale_set_id = azurerm_orchestrated_virtual_machine_scale_set.test.id
zone = azurerm_orchestrated_virtual_machine_scale_set.test.zones.0
}
`, template, data.RandomInteger, data.RandomInteger, data.RandomInteger, data.RandomInteger)
}

func testAccAzureRMLinuxVirtualMachine_orchestratedNonZonal(data acceptance.TestData) string {
template := testLinuxVirtualMachine_templateBaseForOchestratedVMSS(data)
return fmt.Sprintf(`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,25 @@ func TestAccAzureRMWindowsVirtualMachine_orchestratedZonal(t *testing.T) {
})
}

func TestAccAzureRMWindowsVirtualMachine_orchestratedZonalWithProximityPlacementGroup(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_windows_virtual_machine", "test")

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acceptance.PreCheck(t) },
Providers: acceptance.SupportedProviders,
CheckDestroy: checkWindowsVirtualMachineIsDestroyed,
Steps: []resource.TestStep{
{
Config: testAccAzureRMWindowsVirtualMachine_orchestratedZonalWithProximityPlacementGroup(data),
Check: resource.ComposeTestCheckFunc(
checkWindowsVirtualMachineExists(data.ResourceName),
),
},
data.ImportStep("admin_password"),
},
})
}

func TestAccAzureRMWindowsVirtualMachine_orchestratedNonZonal(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_windows_virtual_machine", "test")

Expand Down Expand Up @@ -144,6 +163,77 @@ resource "azurerm_windows_virtual_machine" "test" {
`, template, data.RandomInteger, data.RandomInteger)
}

func testAccAzureRMWindowsVirtualMachine_orchestratedZonalWithProximityPlacementGroup(data acceptance.TestData) string {
template := testWindowsVirtualMachine_templateBaseForOchestratedVMSS(data)
return fmt.Sprintf(`
%s
resource "azurerm_proximity_placement_group" "test" {
name = "acctestPPG-%d"
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
}
resource "azurerm_network_interface" "test" {
name = "acctestnic-%d"
location = azurerm_resource_group.test.location
resource_group_name = azurerm_resource_group.test.name
ip_configuration {
name = "internal"
subnet_id = azurerm_subnet.test.id
private_ip_address_allocation = "Dynamic"
}
}
resource "azurerm_orchestrated_virtual_machine_scale_set" "test" {
name = "acctestVMO-%d"
location = azurerm_resource_group.test.location
resource_group_name = azurerm_resource_group.test.name
platform_fault_domain_count = 1
proximity_placement_group_id = azurerm_proximity_placement_group.test.id
zones = ["1"]
tags = {
ENV = "Test"
}
}
resource "azurerm_windows_virtual_machine" "test" {
name = local.vm_name
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
size = "Standard_F2"
admin_username = "adminuser"
admin_password = "P@ssw0rd1234!"
proximity_placement_group_id = azurerm_proximity_placement_group.test.id
network_interface_ids = [
azurerm_network_interface.test.id,
]
source_image_reference {
publisher = "MicrosoftWindowsServer"
offer = "WindowsServer"
sku = "2016-Datacenter"
version = "latest"
}
os_disk {
storage_account_type = "Standard_LRS"
caching = "ReadWrite"
}
virtual_machine_scale_set_id = azurerm_orchestrated_virtual_machine_scale_set.test.id
zone = azurerm_orchestrated_virtual_machine_scale_set.test.zones.0
}
`, template, data.RandomInteger, data.RandomInteger, data.RandomInteger)
}

func testAccAzureRMWindowsVirtualMachine_orchestratedNonZonal(data acceptance.TestData) string {
template := testWindowsVirtualMachine_templateBaseForOchestratedVMSS(data)
return fmt.Sprintf(`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ func resourceArmWindowsVirtualMachineScaleSet() *schema.Resource {
Optional: true,
ForceNew: true,
ValidateFunc: azure.ValidateResourceID,
// the Compute API is broken and returns the Resource Group name in UPPERCASE :shrug:
// the Compute API is broken and returns the Resource Group name in UPPERCASE :shrug:, github issue: https://github.com/Azure/azure-rest-api-specs/issues/10016
DiffSuppressFunc: suppress.CaseDifference,
},

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ The following arguments are supported:

~> **NOTE:** The number of Fault Domains varies depending on which Azure Region you're using - a list can be found [here](https://github.com/MicrosoftDocs/azure-docs/blob/master/includes/managed-disks-common-fault-domain-region-list.md).

* `proximity_placement_group_id` - (Optional) The ID of the Proximity Placement Group which the Virtual Machine should be assigned to. Changing this forces a new resource to be created.

* `single_placement_group` - (Optional / **Deprecated**) Should the Orchestrated Virtual Machine Scale Set use single placement group?

~> **NOTE:** Due to a limitation of the Azure API at this time, you can only assign `single_placement_group` to `false`.
Expand Down

0 comments on commit b46afd2

Please sign in to comment.