Skip to content

Commit

Permalink
add placement option ResourceDisk to resources:
Browse files Browse the repository at this point in the history
* orchestrated_virtual_machine_scale_set
* virtual_machine_scale_set: os_disk
* windows_virtual_machine_scale_set
  • Loading branch information
sergelogvinov committed Jun 27, 2022
1 parent 3d53cda commit 2c5832b
Show file tree
Hide file tree
Showing 8 changed files with 311 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,21 @@ func TestAccLinuxVirtualMachineScaleSet_disksOSDiskEphemeral(t *testing.T) {
})
}

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

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

func TestAccLinuxVirtualMachineScaleSet_disksOSDiskStorageAccountTypeStandardLRS(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_linux_virtual_machine_scale_set", "test")
r := LinuxVirtualMachineScaleSetResource{}
Expand Down Expand Up @@ -482,6 +497,52 @@ resource "azurerm_linux_virtual_machine_scale_set" "test" {
`, r.template(data), data.RandomInteger)
}

func (r LinuxVirtualMachineScaleSetResource) disksOSDiskEphemeralResourceDisk(data acceptance.TestData) string {
return fmt.Sprintf(`
%s
resource "azurerm_linux_virtual_machine_scale_set" "test" {
name = "acctestvmss-%d"
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
sku = "Standard_F2s_v2"
instances = 1
admin_username = "adminuser"
admin_password = "P@ssword1234!"
disable_password_authentication = false
source_image_reference {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "16.04-LTS"
version = "latest"
}
os_disk {
storage_account_type = "Standard_LRS"
caching = "ReadOnly"
diff_disk_settings {
option = "Local"
placement = "ResourceDisk"
}
}
network_interface {
name = "example"
primary = true
ip_configuration {
name = "internal"
primary = true
subnet_id = azurerm_subnet.test.id
}
}
}
`, r.template(data), data.RandomInteger)
}

func (r LinuxVirtualMachineScaleSetResource) disksOSDiskStorageAccountType(data acceptance.TestData, storageAccountType string) string {
return fmt.Sprintf(`
%s
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -559,7 +559,16 @@ func OrchestratedVirtualMachineScaleSetOSDiskSchema() *pluginsdk.Schema {
string(compute.DiffDiskOptionsLocal),
}, false),
},
},
"placement": {
Type: pluginsdk.TypeString,
Optional: true,
ForceNew: true,
Default: string(compute.DiffDiskPlacementCacheDisk),
ValidateFunc: validation.StringInSlice([]string{
string(compute.DiffDiskPlacementCacheDisk),
string(compute.DiffDiskPlacementResourceDisk),
}, false),
}},
},
},

Expand Down Expand Up @@ -1211,7 +1220,8 @@ func ExpandOrchestratedVirtualMachineScaleSetOSDisk(input []interface{}, osType
if diffDiskSettingsRaw := raw["diff_disk_settings"].([]interface{}); len(diffDiskSettingsRaw) > 0 {
diffDiskRaw := diffDiskSettingsRaw[0].(map[string]interface{})
disk.DiffDiskSettings = &compute.DiffDiskSettings{
Option: compute.DiffDiskOptions(diffDiskRaw["option"].(string)),
Option: compute.DiffDiskOptions(diffDiskRaw["option"].(string)),
Placement: compute.DiffDiskPlacement(diffDiskRaw["placement"].(string)),
}
}

Expand Down Expand Up @@ -1781,7 +1791,8 @@ func FlattenOrchestratedVirtualMachineScaleSetOSDisk(input *compute.VirtualMachi
diffDiskSettings := make([]interface{}, 0)
if input.DiffDiskSettings != nil {
diffDiskSettings = append(diffDiskSettings, map[string]interface{}{
"option": string(input.DiffDiskSettings.Option),
"option": string(input.DiffDiskSettings.Option),
"placement": string(input.DiffDiskSettings.Placement),
})
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package compute_test

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance"
"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance/check"
)

func TestAccOrchestratedVirtualMachineScaleSet_disksOSDiskCaching(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_orchestrated_virtual_machine_scale_set", "test")
r := OrchestratedVirtualMachineScaleSetResource{}

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.disksOSDiskEphemeral(data, "CacheDisk"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep("os_profile.0.linux_configuration.0.admin_password"),
{
Config: r.disksOSDiskEphemeral(data, "ResourceDisk"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep("os_profile.0.linux_configuration.0.admin_password"),
})
}

func (r OrchestratedVirtualMachineScaleSetResource) disksOSDiskEphemeral(data acceptance.TestData, placement string) string {
return fmt.Sprintf(`
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "test" {
name = "acctestRG-OVMSS-%[1]d"
location = "%[2]s"
}
resource "azurerm_virtual_network" "test" {
name = "acctvn-%[1]d"
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.test.location
resource_group_name = azurerm_resource_group.test.name
}
resource "azurerm_subnet" "test" {
name = "acctsub-%[1]d"
resource_group_name = azurerm_resource_group.test.name
virtual_network_name = azurerm_virtual_network.test.name
address_prefixes = ["10.0.2.0/24"]
}
resource "azurerm_orchestrated_virtual_machine_scale_set" "test" {
name = "acctestOVMSS-%[1]d"
location = azurerm_resource_group.test.location
resource_group_name = azurerm_resource_group.test.name
sku_name = "Standard_F2"
instances = 1
platform_fault_domain_count = 2
os_profile {
linux_configuration {
computer_name_prefix = "testvm-%[1]d"
admin_username = "myadmin"
admin_password = "Passwword1234"
disable_password_authentication = false
}
}
network_interface {
name = "TestNetworkProfile"
primary = true
ip_configuration {
name = "TestIPConfiguration"
primary = true
subnet_id = azurerm_subnet.test.id
}
}
os_disk {
storage_account_type = "Standard_LRS"
caching = "ReadOnly"
diff_disk_settings {
option = "Local"
placement = "%s"
}
}
source_image_reference {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "16.04.0-LTS"
version = "latest"
}
}
`, data.RandomInteger, data.Locations.Primary)
}
24 changes: 21 additions & 3 deletions internal/services/compute/virtual_machine_scale_set.go
Original file line number Diff line number Diff line change
Expand Up @@ -1101,6 +1101,16 @@ func VirtualMachineScaleSetOSDiskSchema() *pluginsdk.Schema {
string(compute.DiffDiskOptionsLocal),
}, false),
},
"placement": {
Type: pluginsdk.TypeString,
Optional: true,
ForceNew: true,
Default: string(compute.DiffDiskPlacementCacheDisk),
ValidateFunc: validation.StringInSlice([]string{
string(compute.DiffDiskPlacementCacheDisk),
string(compute.DiffDiskPlacementResourceDisk),
}, false),
},
},
},
},
Expand Down Expand Up @@ -1153,8 +1163,9 @@ func VirtualMachineScaleSetOSDiskSchema() *pluginsdk.Schema {

func ExpandVirtualMachineScaleSetOSDisk(input []interface{}, osType compute.OperatingSystemTypes) (*compute.VirtualMachineScaleSetOSDisk, error) {
raw := input[0].(map[string]interface{})
caching := raw["caching"].(string)
disk := compute.VirtualMachineScaleSetOSDisk{
Caching: compute.CachingTypes(raw["caching"].(string)),
Caching: compute.CachingTypes(caching),
ManagedDisk: &compute.VirtualMachineScaleSetManagedDiskParameters{
StorageAccountType: compute.StorageAccountTypes(raw["storage_account_type"].(string)),
},
Expand Down Expand Up @@ -1191,9 +1202,15 @@ func ExpandVirtualMachineScaleSetOSDisk(input []interface{}, osType compute.Oper
}

if diffDiskSettingsRaw := raw["diff_disk_settings"].([]interface{}); len(diffDiskSettingsRaw) > 0 {
if caching != string(compute.CachingTypesReadOnly) {
// Restriction per https://docs.microsoft.com/azure/virtual-machines/ephemeral-os-disks-deploy#vm-template-deployment
return nil, fmt.Errorf("`diff_disk_settings` can only be set when `caching` is set to `ReadOnly`")
}

diffDiskRaw := diffDiskSettingsRaw[0].(map[string]interface{})
disk.DiffDiskSettings = &compute.DiffDiskSettings{
Option: compute.DiffDiskOptions(diffDiskRaw["option"].(string)),
Option: compute.DiffDiskOptions(diffDiskRaw["option"].(string)),
Placement: compute.DiffDiskPlacement(diffDiskRaw["placement"].(string)),
}
}

Expand Down Expand Up @@ -1231,7 +1248,8 @@ func FlattenVirtualMachineScaleSetOSDisk(input *compute.VirtualMachineScaleSetOS
diffDiskSettings := make([]interface{}, 0)
if input.DiffDiskSettings != nil {
diffDiskSettings = append(diffDiskSettings, map[string]interface{}{
"option": string(input.DiffDiskSettings.Option),
"option": string(input.DiffDiskSettings.Option),
"placement": string(input.DiffDiskSettings.Placement),
})
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,21 @@ func TestAccWindowsVirtualMachineScaleSet_disksOSDiskEphemeral(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_windows_virtual_machine_scale_set", "test")
r := WindowsVirtualMachineScaleSetResource{}

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

func TestAccWindowsVirtualMachineScaleSet_disksOSDiskEphemeralResourceDisk(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_windows_virtual_machine_scale_set", "test")
r := WindowsVirtualMachineScaleSetResource{}

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.disksOSDiskEphemeral(data),
Expand Down Expand Up @@ -478,6 +493,50 @@ resource "azurerm_windows_virtual_machine_scale_set" "test" {
`, r.template(data))
}

func (r WindowsVirtualMachineScaleSetResource) disksOSDiskEphemeralResourceDisk(data acceptance.TestData) string {
return fmt.Sprintf(`
%s
resource "azurerm_windows_virtual_machine_scale_set" "test" {
name = local.vm_name
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
sku = "Standard_F8s_v2" # has to be this large for ephemeral disks on Windows
instances = 1
admin_username = "adminuser"
admin_password = "P@ssword1234!"
source_image_reference {
publisher = "MicrosoftWindowsServer"
offer = "WindowsServer"
sku = "2019-Datacenter"
version = "latest"
}
os_disk {
storage_account_type = "Standard_LRS"
caching = "ReadOnly"
diff_disk_settings {
option = "Local"
placement = "ResourceDisk"
}
}
network_interface {
name = "example"
primary = true
ip_configuration {
name = "internal"
primary = true
subnet_id = azurerm_subnet.test.id
}
}
}
`, r.template(data))
}

func (r WindowsVirtualMachineScaleSetResource) disksOSDiskStorageAccountType(data acceptance.TestData, storageAccountType string) string {
return fmt.Sprintf(`
%s
Expand Down
4 changes: 3 additions & 1 deletion website/docs/r/linux_virtual_machine_scale_set.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,9 @@ A `data_disk` block supports the following:

A `diff_disk_settings` block supports the following:

`option` - (Required) Specifies the Ephemeral Disk Settings for the OS Disk. At this time the only possible value is `Local`. Changing this forces a new resource to be created.
* `option` - (Required) Specifies the Ephemeral Disk Settings for the OS Disk. At this time the only possible value is `Local`. Changing this forces a new resource to be created.

* `placement` - (Optional) Specifies where to store the Ephemeral Disk. Possible values are `CacheDisk` and `ResourceDisk`. Defaults to `CacheDisk`. Changing this forces a new resource to be created.

---

Expand Down
Loading

0 comments on commit 2c5832b

Please sign in to comment.