From 4b9b42dbf08953119186ba537efe3f4c7d36b698 Mon Sep 17 00:00:00 2001 From: Dan Allegood Date: Tue, 26 Jul 2016 16:25:56 -0700 Subject: [PATCH] Fixes the hasBootableVmdk flag when attaching multiple disks (#7804) The hasBootableFlag logic had a bug where it would only be set properly if the bootable disk was the last specified. Adding some bool logic resolves the issue. Also adding check to ensure only one bootable disk is given, and cleaning up a redundant var. --- .../vsphere/resource_vsphere_virtual_machine.go | 11 ++++++----- .../vsphere/resource_vsphere_virtual_machine_test.go | 11 ++++++++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/builtin/providers/vsphere/resource_vsphere_virtual_machine.go b/builtin/providers/vsphere/resource_vsphere_virtual_machine.go index a946517d7f..444e10877e 100644 --- a/builtin/providers/vsphere/resource_vsphere_virtual_machine.go +++ b/builtin/providers/vsphere/resource_vsphere_virtual_machine.go @@ -789,7 +789,6 @@ func resourceVSphereVirtualMachineCreate(d *schema.ResourceData, meta interface{ if diskSet, ok := vL.(*schema.Set); ok { disks := []hardDisk{} - hasBootableDisk := false for _, value := range diskSet.List() { disk := value.(map[string]interface{}) newDisk := hardDisk{} @@ -799,10 +798,10 @@ func resourceVSphereVirtualMachineCreate(d *schema.ResourceData, meta interface{ return fmt.Errorf("Cannot specify name of a template") } vm.template = v - if hasBootableDisk { + if vm.hasBootableVmdk { return fmt.Errorf("[ERROR] Only one bootable disk or template may be given") } - hasBootableDisk = true + vm.hasBootableVmdk = true } if v, ok := disk["type"].(string); ok && v != "" { @@ -846,9 +845,11 @@ func resourceVSphereVirtualMachineCreate(d *schema.ResourceData, meta interface{ return fmt.Errorf("Cannot specify name of a vmdk") } if vBootable, ok := disk["bootable"].(bool); ok { - hasBootableDisk = true + if vBootable && vm.hasBootableVmdk { + return fmt.Errorf("[ERROR] Only one bootable disk or template may be given") + } newDisk.bootable = vBootable - vm.hasBootableVmdk = vBootable + vm.hasBootableVmdk = vm.hasBootableVmdk || vBootable } newDisk.vmdkPath = vVmdk } diff --git a/builtin/providers/vsphere/resource_vsphere_virtual_machine_test.go b/builtin/providers/vsphere/resource_vsphere_virtual_machine_test.go index 3c063d0063..56f2db226b 100644 --- a/builtin/providers/vsphere/resource_vsphere_virtual_machine_test.go +++ b/builtin/providers/vsphere/resource_vsphere_virtual_machine_test.go @@ -606,7 +606,12 @@ resource "vsphere_virtual_machine" "with_existing_vmdk" { disk { %s vmdk = "%s" - bootable = true + bootable = true + } + disk { + size = 1 + iops = 500 + name = "one" } } ` @@ -635,7 +640,7 @@ func TestAccVSphereVirtualMachine_createWithExistingVmdk(t *testing.T) { Config: config, Check: resource.ComposeTestCheckFunc( TestFuncData{vm: vm, label: data.label, vmName: "vsphere_virtual_machine.with_existing_vmdk", - vmResource: "terraform-test-with-existing-vmdk"}.testCheckFuncBasic(), + vmResource: "terraform-test-with-existing-vmdk", numDisks: "2"}.testCheckFuncBasic(), //resource.TestCheckResourceAttr( // "vsphere_virtual_machine.with_existing_vmdk", "disk.2393891804.vmdk", vmdk_path), //resource.TestCheckResourceAttr( @@ -766,7 +771,7 @@ resource "vsphere_virtual_machine" "ipv4ipv6" { disk { size = 1 iops = 500 - name = "one" + name = "one" } } `