Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update azurerm_linux|windows_virtual_machine - support platform_fault_domain for VMSS Flex support #10803

Merged
merged 9 commits into from
Mar 11, 2021
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,15 @@ func resourceLinuxVirtualMachine() *schema.Resource {
ValidateFunc: computeValidate.VirtualMachineScaleSetID,
},

"platform_fault_domain": {
Type: schema.TypeInt,
Optional: true,
Default: -1,
ForceNew: true,
RequiredWith: []string{"virtual_machine_scale_set_id"},
ValidateFunc: validation.IntAtLeast(-1),
},

"tags": tags.Schema(),

"zone": {
Expand Down Expand Up @@ -459,6 +468,11 @@ func resourceLinuxVirtualMachineCreate(d *schema.ResourceData, meta interface{})
}
}

platformFaultDomain := d.Get("platform_fault_domain").(int)
if platformFaultDomain != -1 {
params.PlatformFaultDomain = utils.Int32(int32(platformFaultDomain))
}

if v, ok := d.GetOk("zone"); ok {
params.Zones = &[]string{
v.(string),
Expand Down Expand Up @@ -595,6 +609,11 @@ func resourceLinuxVirtualMachineRead(d *schema.ResourceData, meta interface{}) e
virtualMachineScaleSetId = *props.VirtualMachineScaleSet.ID
}
d.Set("virtual_machine_scale_set_id", virtualMachineScaleSetId)
platformFaultDomain := -1
if props.PlatformFaultDomain != nil {
platformFaultDomain = int(*props.PlatformFaultDomain)
}
d.Set("platform_fault_domain", platformFaultDomain)

if profile := props.OsProfile; profile != nil {
d.Set("admin_username", profile.AdminUsername)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance/check"
)

func TestAccAzureRMLinuxVirtualMachine_orchestratedZonal(t *testing.T) {
func TestAccLinuxVirtualMachine_orchestratedZonal(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_linux_virtual_machine", "test")
r := LinuxVirtualMachineResource{}

Expand All @@ -24,7 +24,22 @@ func TestAccAzureRMLinuxVirtualMachine_orchestratedZonal(t *testing.T) {
})
}

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

data.ResourceTest(t, r, []resource.TestStep{
{
Config: r.orchestratedWithPlatformFaultDomain(data),
Check: resource.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep("admin_password"),
})
}

func TestAccLinuxVirtualMachine_orchestratedZonalWithProximityPlacementGroup(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_linux_virtual_machine", "test")
r := LinuxVirtualMachineResource{}

Expand All @@ -39,7 +54,7 @@ func TestAccAzureRMLinuxVirtualMachine_orchestratedZonalWithProximityPlacementGr
})
}

func TestAccAzureRMLinuxVirtualMachine_orchestratedNonZonal(t *testing.T) {
func TestAccLinuxVirtualMachine_orchestratedNonZonal(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_linux_virtual_machine", "test")
r := LinuxVirtualMachineResource{}

Expand All @@ -54,7 +69,7 @@ func TestAccAzureRMLinuxVirtualMachine_orchestratedNonZonal(t *testing.T) {
})
}

func TestAccAzureRMLinuxVirtualMachine_orchestratedMultipleZonal(t *testing.T) {
func TestAccLinuxVirtualMachine_orchestratedMultipleZonal(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_linux_virtual_machine", "test")
r := LinuxVirtualMachineResource{}

Expand All @@ -69,7 +84,7 @@ func TestAccAzureRMLinuxVirtualMachine_orchestratedMultipleZonal(t *testing.T) {
})
}

func TestAccAzureRMLinuxVirtualMachine_orchestratedMultipleNonZonal(t *testing.T) {
func TestAccLinuxVirtualMachine_orchestratedMultipleNonZonal(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_linux_virtual_machine", "test")
r := LinuxVirtualMachineResource{}

Expand Down Expand Up @@ -144,6 +159,64 @@ resource "azurerm_linux_virtual_machine" "test" {
`, r.templateBaseForOchestratedVMSS(data), data.RandomInteger, data.RandomInteger, data.RandomInteger)
}

func (r LinuxVirtualMachineResource) orchestratedWithPlatformFaultDomain(data acceptance.TestData) string {
return fmt.Sprintf(`
%s

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 = 2

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
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
platform_fault_domain = 0
}
`, r.templateBaseForOchestratedVMSS(data), data.RandomInteger, data.RandomInteger, data.RandomInteger)
}

func (r LinuxVirtualMachineResource) orchestratedZonalWithProximityPlacementGroup(data acceptance.TestData) string {
return fmt.Sprintf(`
%s
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,15 @@ func resourceWindowsVirtualMachine() *schema.Resource {
ValidateFunc: computeValidate.VirtualMachineScaleSetID,
},

"platform_fault_domain": {
Type: schema.TypeInt,
Optional: true,
Default: -1,
ForceNew: true,
RequiredWith: []string{"virtual_machine_scale_set_id"},
ValidateFunc: validation.IntAtLeast(-1),
},

"winrm_listener": winRmListenerSchema(),

"zone": {
Expand Down Expand Up @@ -515,6 +524,11 @@ func resourceWindowsVirtualMachineCreate(d *schema.ResourceData, meta interface{
}
}

platformFaultDomain := d.Get("platform_fault_domain").(int)
if platformFaultDomain != -1 {
params.PlatformFaultDomain = utils.Int32(int32(platformFaultDomain))
}

if v, ok := d.GetOk("timezone"); ok {
params.VirtualMachineProperties.OsProfile.WindowsConfiguration.TimeZone = utils.String(v.(string))
}
Expand Down Expand Up @@ -644,6 +658,11 @@ func resourceWindowsVirtualMachineRead(d *schema.ResourceData, meta interface{})
virtualMachineScaleSetId = *props.VirtualMachineScaleSet.ID
}
d.Set("virtual_machine_scale_set_id", virtualMachineScaleSetId)
platformFaultDomain := -1
if props.PlatformFaultDomain != nil {
platformFaultDomain = int(*props.PlatformFaultDomain)
}
d.Set("platform_fault_domain", platformFaultDomain)

if profile := props.OsProfile; profile != nil {
d.Set("admin_username", profile.AdminUsername)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,21 @@ func TestAccWindowsVirtualMachine_orchestratedZonal(t *testing.T) {
})
}

func TestAccWindowsVirtualMachine_orchestratedWithPlatformFaultDomain(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_windows_virtual_machine", "test")
r := WindowsVirtualMachineResource{}

data.ResourceTest(t, r, []resource.TestStep{
{
Config: r.orchestratedWithPlatformFaultDomain(data),
Check: resource.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep("admin_password"),
})
}

func TestAccWindowsVirtualMachine_orchestratedZonalWithProximityPlacementGroup(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_windows_virtual_machine", "test")
r := WindowsVirtualMachineResource{}
Expand Down Expand Up @@ -143,6 +158,63 @@ resource "azurerm_windows_virtual_machine" "test" {
`, r.templateBaseForOchestratedVMSS(data), data.RandomInteger, data.RandomInteger)
}

func (r WindowsVirtualMachineResource) orchestratedWithPlatformFaultDomain(data acceptance.TestData) string {
return fmt.Sprintf(`
%s

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 = 2

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!"
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
platform_fault_domain = 0
}
`, r.templateBaseForOchestratedVMSS(data), data.RandomInteger, data.RandomInteger)
}

func (r WindowsVirtualMachineResource) orchestratedZonalWithProximityPlacementGroup(data acceptance.TestData) string {
return fmt.Sprintf(`
%s
Expand Down
2 changes: 2 additions & 0 deletions website/docs/r/linux_virtual_machine.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,8 @@ The following arguments are supported:

* `plan` - (Optional) A `plan` block as defined below. Changing this forces a new resource to be created.

* `platform_fault_domain` - (Optional) Specifies the Platform Fault Domain in which this Linux Virtual Machine should be created. Defaults to `-1`, which means this will be automatically assigned to a fault domain that best maintains balance across the available fault domains. Changing this forces a new Linux Virtual Machine to be created.

* `priority`- (Optional) Specifies the priority of this Virtual Machine. Possible values are `Regular` and `Spot`. Defaults to `Regular`. Changing this forces a new resource to be created.

* `provision_vm_agent` - (Optional) Should the Azure VM Agent be provisioned on this Virtual Machine? Defaults to `true`. Changing this forces a new resource to be created.
Expand Down
2 changes: 2 additions & 0 deletions website/docs/r/windows_virtual_machine.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ The following arguments are supported:

* `plan` - (Optional) A `plan` block as defined below. Changing this forces a new resource to be created.

* `platform_fault_domain` - (Optional) Specifies the Platform Fault Domain in which this Windows Virtual Machine should be created. Defaults to `-1`, which means this will be automatically assigned to a fault domain that best maintains balance across the available fault domains. Changing this forces a new Windows Virtual Machine to be created.

* `priority`- (Optional) Specifies the priority of this Virtual Machine. Possible values are `Regular` and `Spot`. Defaults to `Regular`. Changing this forces a new resource to be created.

* `provision_vm_agent` - (Optional) Should the Azure VM Agent be provisioned on this Virtual Machine? Defaults to `true`. Changing this forces a new resource to be created.
Expand Down