provider/azurerm: add option to delete VMs Data disks on termination (#7793)

```
TF_ACC=1 go test ./builtin/providers/azurerm -v -run TestAccAzureRMVirtualMachine_deleteVHD -timeout 120m
=== RUN   TestAccAzureRMVirtualMachine_deleteVHDOptOut
--- PASS: TestAccAzureRMVirtualMachine_deleteVHDOptOut (621.84s)
=== RUN   TestAccAzureRMVirtualMachine_deleteVHDOptIn
--- PASS: TestAccAzureRMVirtualMachine_deleteVHDOptIn (623.95s)
PASS
ok  	github.com/hashicorp/terraform/builtin/providers/azurerm	1245.930s
```
This commit is contained in:
Peter McAtominey 2016-07-25 17:57:02 +01:00 committed by Paul Stack
parent 31b8cde45c
commit 1c13cc994b
3 changed files with 69 additions and 20 deletions

View File

@ -206,6 +206,12 @@ func resourceArmVirtualMachine() *schema.Resource {
},
},
"delete_data_disks_on_termination": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
"os_profile": {
Type: schema.TypeSet,
Required: true,
@ -561,19 +567,43 @@ func resourceArmVirtualMachineDelete(d *schema.ResourceData, meta interface{}) e
return err
}
if deleteOsDisk := d.Get("delete_os_disk_on_termination").(bool); !deleteOsDisk {
log.Printf("[INFO] delete_os_disk_on_termination is false, skipping delete")
return nil
}
// delete OS Disk if opted in
if deleteOsDisk := d.Get("delete_os_disk_on_termination").(bool); deleteOsDisk {
log.Printf("[INFO] delete_os_disk_on_termination is enabled, deleting")
osDisk, err := expandAzureRmVirtualMachineOsDisk(d)
if err != nil {
return fmt.Errorf("Error expanding OS Disk")
return fmt.Errorf("Error expanding OS Disk: %s", err)
}
vhdURL, err := url.Parse(*osDisk.Vhd.URI)
if err = resourceArmVirtualMachineDeleteVhd(*osDisk.Vhd.URI, resGroup, meta); err != nil {
return fmt.Errorf("Error deleting OS Disk VHD: %s", err)
}
}
// delete Data disks if opted in
if deleteDataDisks := d.Get("delete_data_disks_on_termination").(bool); deleteDataDisks {
log.Printf("[INFO] delete_data_disks_on_termination is enabled, deleting each data disk")
disks, err := expandAzureRmVirtualMachineDataDisk(d)
if err != nil {
return fmt.Errorf("Cannot parse OS Disk VHD URI: %s", err)
return fmt.Errorf("Error expanding Data Disks: %s", err)
}
for _, disk := range disks {
if err = resourceArmVirtualMachineDeleteVhd(*disk.Vhd.URI, resGroup, meta); err != nil {
return fmt.Errorf("Error deleting Data Disk VHD: %s", err)
}
}
}
return nil
}
func resourceArmVirtualMachineDeleteVhd(uri, resGroup string, meta interface{}) error {
vhdURL, err := url.Parse(uri)
if err != nil {
return fmt.Errorf("Cannot parse Disk VHD URI: %s", err)
}
// VHD URI is in the form: https://storageAccountName.blob.core.windows.net/containerName/blobName
@ -582,12 +612,12 @@ func resourceArmVirtualMachineDelete(d *schema.ResourceData, meta interface{}) e
containerName := path[0]
blobName := path[1]
blobClient, storageAccountExists, err := meta.(*ArmClient).getBlobStorageClientForStorageAccount(id.ResourceGroup, storageAccountName)
blobClient, saExists, err := meta.(*ArmClient).getBlobStorageClientForStorageAccount(resGroup, storageAccountName)
if err != nil {
return fmt.Errorf("Error creating blob store account for VHD deletion: %s", err)
return fmt.Errorf("Error creating blob store client for VHD deletion: %s", err)
}
if !storageAccountExists {
if !saExists {
log.Printf("[INFO] Storage Account %q doesn't exist so the VHD blob won't exist", storageAccountName)
return nil
}

View File

@ -181,7 +181,7 @@ func TestAccAzureRMVirtualMachine_winRMConfig(t *testing.T) {
func TestAccAzureRMVirtualMachine_deleteVHDOptOut(t *testing.T) {
var vm compute.VirtualMachine
ri := acctest.RandInt()
preConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachine, ri, ri, ri, ri, ri, ri, ri)
preConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_withDataDisk, ri, ri, ri, ri, ri, ri, ri)
postConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachineDeleteVM, ri, ri, ri, ri, ri)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
@ -196,7 +196,10 @@ func TestAccAzureRMVirtualMachine_deleteVHDOptOut(t *testing.T) {
},
{
Config: postConfig,
Check: testCheckAzureRMVirtualMachineOSDiskVHDExistance(true),
Check: resource.ComposeTestCheckFunc(
testCheckAzureRMVirtualMachineVHDExistance("myosdisk1.vhd", true),
testCheckAzureRMVirtualMachineVHDExistance("mydatadisk1.vhd", true),
),
},
},
})
@ -205,7 +208,7 @@ func TestAccAzureRMVirtualMachine_deleteVHDOptOut(t *testing.T) {
func TestAccAzureRMVirtualMachine_deleteVHDOptIn(t *testing.T) {
var vm compute.VirtualMachine
ri := acctest.RandInt()
preConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachineDestroyOSDisk, ri, ri, ri, ri, ri, ri, ri)
preConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachineDestroyDisks, ri, ri, ri, ri, ri, ri, ri)
postConfig := fmt.Sprintf(testAccAzureRMVirtualMachine_basicLinuxMachineDeleteVM, ri, ri, ri, ri, ri)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
@ -220,7 +223,10 @@ func TestAccAzureRMVirtualMachine_deleteVHDOptIn(t *testing.T) {
},
{
Config: postConfig,
Check: testCheckAzureRMVirtualMachineOSDiskVHDExistance(false),
Check: resource.ComposeTestCheckFunc(
testCheckAzureRMVirtualMachineVHDExistance("myosdisk1.vhd", false),
testCheckAzureRMVirtualMachineVHDExistance("mydatadisk1.vhd", false),
),
},
},
})
@ -322,7 +328,7 @@ func testCheckAzureRMVirtualMachineDestroy(s *terraform.State) error {
return nil
}
func testCheckAzureRMVirtualMachineOSDiskVHDExistance(shouldExist bool) resource.TestCheckFunc {
func testCheckAzureRMVirtualMachineVHDExistance(name string, shouldExist bool) resource.TestCheckFunc {
return func(s *terraform.State) error {
for _, rs := range s.RootModule().Resources {
if rs.Type != "azurerm_storage_container" {
@ -338,13 +344,15 @@ func testCheckAzureRMVirtualMachineOSDiskVHDExistance(shouldExist bool) resource
return fmt.Errorf("Error creating Blob storage client: %s", err)
}
exists, err := storageClient.BlobExists(containerName, "myosdisk1.vhd")
exists, err := storageClient.BlobExists(containerName, name)
if err != nil {
return fmt.Errorf("Error checking if OS Disk VHD Blob exists: %s", err)
return fmt.Errorf("Error checking if Disk VHD Blob exists: %s", err)
}
if exists && !shouldExist {
return fmt.Errorf("OS Disk VHD Blob still exists")
return fmt.Errorf("Disk VHD Blob still exists")
} else if !exists && shouldExist {
return fmt.Errorf("Disk VHD Blob should exist")
}
}
@ -529,7 +537,7 @@ resource "azurerm_virtual_machine" "test" {
}
`
var testAccAzureRMVirtualMachine_basicLinuxMachineDestroyOSDisk = `
var testAccAzureRMVirtualMachine_basicLinuxMachineDestroyDisks = `
resource "azurerm_resource_group" "test" {
name = "acctestrg-%d"
location = "West US"
@ -602,6 +610,16 @@ resource "azurerm_virtual_machine" "test" {
delete_os_disk_on_termination = true
storage_data_disk {
name = "mydatadisk1"
vhd_uri = "${azurerm_storage_account.test.primary_blob_endpoint}${azurerm_storage_container.test.name}/mydatadisk1.vhd"
disk_size_gb = "1023"
create_option = "Empty"
lun = 0
}
delete_data_disks_on_termination = true
os_profile {
computer_name = "hostname%d"
admin_username = "testadmin"

View File

@ -212,6 +212,7 @@ The following arguments are supported:
* `storage_os_disk` - (Required) A Storage OS Disk block as referenced below.
* `delete_os_disk_on_termination` - (Optional) Flag to enable deletion of the OS Disk VHD blob when the VM is deleted, defaults to `false`
* `storage_data_disk` - (Optional) A list of Storage Data disk blocks as referenced below.
* `delete_data_disks_on_termination` - (Optional) Flag to enable deletion of Storage Disk VHD blobs when the VM is deleted, defaults to `false`
* `os_profile` - (Required) An OS Profile block as documented below.
* `os_profile_windows_config` - (Required, when a windows machine) A Windows config block as documented below.
* `os_profile_linux_config` - (Required, when a linux machine) A Linux config block as documented below.