From 1c13cc994b593496a045437453d2280cf03384c4 Mon Sep 17 00:00:00 2001 From: Peter McAtominey Date: Mon, 25 Jul 2016 17:57:02 +0100 Subject: [PATCH] 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 ``` --- .../azurerm/resource_arm_virtual_machine.go | 52 +++++++++++++++---- .../resource_arm_virtual_machine_test.go | 36 +++++++++---- .../azurerm/r/virtual_machine.html.markdown | 1 + 3 files changed, 69 insertions(+), 20 deletions(-) diff --git a/builtin/providers/azurerm/resource_arm_virtual_machine.go b/builtin/providers/azurerm/resource_arm_virtual_machine.go index b2121df8a..dfd9f6d90 100644 --- a/builtin/providers/azurerm/resource_arm_virtual_machine.go +++ b/builtin/providers/azurerm/resource_arm_virtual_machine.go @@ -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: %s", err) + } + + if err = resourceArmVirtualMachineDeleteVhd(*osDisk.Vhd.URI, resGroup, meta); err != nil { + return fmt.Errorf("Error deleting OS Disk VHD: %s", err) + } } - osDisk, err := expandAzureRmVirtualMachineOsDisk(d) - if err != nil { - return fmt.Errorf("Error expanding OS Disk") + // 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("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) + } + } } - vhdURL, err := url.Parse(*osDisk.Vhd.URI) + return nil +} + +func resourceArmVirtualMachineDeleteVhd(uri, resGroup string, meta interface{}) error { + vhdURL, err := url.Parse(uri) if err != nil { - return fmt.Errorf("Cannot parse OS Disk VHD URI: %s", err) + 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 } diff --git a/builtin/providers/azurerm/resource_arm_virtual_machine_test.go b/builtin/providers/azurerm/resource_arm_virtual_machine_test.go index 39a138577..91418877c 100644 --- a/builtin/providers/azurerm/resource_arm_virtual_machine_test.go +++ b/builtin/providers/azurerm/resource_arm_virtual_machine_test.go @@ -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" diff --git a/website/source/docs/providers/azurerm/r/virtual_machine.html.markdown b/website/source/docs/providers/azurerm/r/virtual_machine.html.markdown index 7f719337c..accf830dd 100644 --- a/website/source/docs/providers/azurerm/r/virtual_machine.html.markdown +++ b/website/source/docs/providers/azurerm/r/virtual_machine.html.markdown @@ -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.