From db06ee4cac6e74356462211244dfddde2bea6fbd Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Thu, 7 Jan 2021 18:59:06 +0100 Subject: [PATCH 01/13] changed ide.3 behaviour --- nutanix/resource_nutanix_virtual_machine.go | 34 +++++++++-- nutanix/structure.go | 67 +++++++++++++++++++-- 2 files changed, 91 insertions(+), 10 deletions(-) diff --git a/nutanix/resource_nutanix_virtual_machine.go b/nutanix/resource_nutanix_virtual_machine.go index e9f143e2b..adf4808b4 100644 --- a/nutanix/resource_nutanix_virtual_machine.go +++ b/nutanix/resource_nutanix_virtual_machine.go @@ -45,6 +45,11 @@ func resourceNutanixVirtualMachine() *schema.Resource { }, }, Schema: map[string]*schema.Schema{ + "cloud_init_cdrom_uuid": { + Type: schema.TypeString, + Computed: true, + Optional: true, + }, "metadata": { Type: schema.TypeMap, Computed: true, @@ -915,10 +920,15 @@ func resourceNutanixVirtualMachineCreate(d *schema.ResourceData, meta interface{ // Set terraform state id d.SetId(uuid) + d.Set("cloud_init_cdrom_uuid", "") return resourceNutanixVirtualMachineRead(d, meta) } func resourceNutanixVirtualMachineRead(d *schema.ResourceData, meta interface{}) error { + initialDiskList := d.Get("disk_list") + utils.PrintToJSON(initialDiskList, "machine read disk_list start") + cloudInitCDromUUID := d.Get("cloud_init_cdrom_uuid") + utils.PrintToJSON(cloudInitCDromUUID, "machine read cloud_init_cdrom_uuid start") // Get client connection conn := meta.(*Client).API setVMTimeout(meta) @@ -967,8 +977,8 @@ func resourceNutanixVirtualMachineRead(d *schema.ResourceData, meta interface{}) if err := d.Set("nic_list_status", flattenNicListStatus(resp.Status.Resources.NicList)); err != nil { return fmt.Errorf("error setting nic_list_status for Virtual Machine %s: %s", d.Id(), err) } - - if err := d.Set("disk_list", flattenDiskList(resp.Spec.Resources.DiskList)); err != nil { + // if err := d.Set("disk_list", flattenDiskList(resp.Spec.Resources.DiskList)); err != nil { + if err := d.Set("disk_list", flattenDiskListFilterCloudInit(d, resp.Spec.Resources.DiskList)); err != nil { return fmt.Errorf("error setting disk_list for Virtual Machine %s: %s", d.Id(), err) } @@ -2120,13 +2130,25 @@ func waitForIPRefreshFunc(client *v3.Client, vmUUID string) resource.StateRefres } } -func CountDiskListCdrom(dl []*v3.VMDisk) (int, error) { - counter := 0 +func GetCdromDiskList(dl []*v3.VMDisk) []*v3.VMDisk { + cdList := make([]*v3.VMDisk, 0) for _, v := range dl { - if v.DeviceProperties != nil && *v.DeviceProperties.DeviceType == "CDROM" { - counter++ + if isCdromDisk(v) { + cdList = append(cdList, v) } } + return cdList +} + +func isCdromDisk(d *v3.VMDisk) bool { + if d.DeviceProperties != nil && *d.DeviceProperties.DeviceType == "CDROM" { + return true + } + return false +} + +func CountDiskListCdrom(dl []*v3.VMDisk) (int, error) { + counter := len(GetCdromDiskList(dl)) return counter, nil } diff --git a/nutanix/structure.go b/nutanix/structure.go index 5fa221390..2e751fca4 100644 --- a/nutanix/structure.go +++ b/nutanix/structure.go @@ -2,6 +2,7 @@ package nutanix import ( "fmt" + "log" "strconv" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" @@ -103,7 +104,61 @@ func flattenNicList(nics []*v3.VMNic) []map[string]interface{} { return nicLists } +func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) []map[string]interface{} { + cloudInitCdromUUIDInput := d.Get("cloud_init_cdrom_uuid") + cloudInitCdromUUID := cloudInitCdromUUIDInput.(string) + filteredDiskList := disks + if cloudInitCdromUUID == "" { + log.Printf("Entering search for cloudInitCdromUUID") + filteredDiskList = make([]*v3.VMDisk, 0) + //expand the user inputted list of disks + expandedOrgDiskList := expandDiskList(d) + utils.PrintToJSON(expandedOrgDiskList, "expandedOrgDiskList: ") + //extract the CD-rom drives + userCdromDiskList := GetCdromDiskList(expandedOrgDiskList) + for _, eDisk := range disks { + //if existing disk is not CD-rom, append it to the list and continue + utils.PrintToJSON(eDisk, "edisk: ") + log.Print(isCdromDisk(eDisk)) + if !isCdromDisk(eDisk) { + filteredDiskList = append(filteredDiskList, eDisk) + log.Print("appended!") + continue + } else { + //Get existing CDrom device Index + eDiskIndex := *eDisk.DeviceProperties.DiskAddress.DeviceIndex + match := false + // Loop over the user defined cdrom drives + for _, uDisk := range userCdromDiskList { + //extract the device index of the user defined cdrom + uDiskIndex := *uDisk.DeviceProperties.DiskAddress.DeviceIndex + // if there is a matching device index for a userdefined and an existing cdrom, it is not the cloud-init one + if eDiskIndex == uDiskIndex { + filteredDiskList = append(filteredDiskList, eDisk) + match = true + break + } + } + if !match { + cloudInitCdromUUID = *eDisk.UUID + d.Set("cloud_init_cdrom_uuid", cloudInitCdromUUID) + } + } + } + log.Printf("flattenDiskListFilterCloudInit") + utils.PrintToJSON(disks, "disks: ") + utils.PrintToJSON(userCdromDiskList, "userCdromDiskList: ") + utils.PrintToJSON(filteredDiskList, "filteredDiskList: ") + log.Printf("cloudInitCdromUUID: %s", cloudInitCdromUUID) + } + fDiskList := flattenDiskListHelper(filteredDiskList, cloudInitCdromUUID) + utils.PrintToJSON(fDiskList, "fDiskList: ") + return fDiskList +} func flattenDiskList(disks []*v3.VMDisk) []map[string]interface{} { + return flattenDiskListHelper(disks, "") +} +func flattenDiskListHelper(disks []*v3.VMDisk, cloudInitCdromUUID string) []map[string]interface{} { diskList := make([]map[string]interface{}, 0) for _, v := range disks { var deviceProps []map[string]interface{} @@ -114,9 +169,9 @@ func flattenDiskList(disks []*v3.VMDisk) []map[string]interface{} { index := fmt.Sprintf("%d", utils.Int64Value(v.DeviceProperties.DiskAddress.DeviceIndex)) adapter := v.DeviceProperties.DiskAddress.AdapterType - if index == "3" && *adapter == IDE { - continue - } + // if index == "3" && *adapter == IDE { + // continue + // } deviceProps[0] = map[string]interface{}{ "device_type": v.DeviceProperties.DeviceType, @@ -141,8 +196,12 @@ func flattenDiskList(disks []*v3.VMDisk) []map[string]interface{} { }) } + diskUUID := utils.StringValue(v.UUID) + if cloudInitCdromUUID == diskUUID { + continue + } diskList = append(diskList, map[string]interface{}{ - "uuid": utils.StringValue(v.UUID), + "uuid": diskUUID, "disk_size_bytes": utils.Int64Value(v.DiskSizeBytes), "disk_size_mib": utils.Int64Value(v.DiskSizeMib), "device_properties": deviceProps, From 2557f1549ca46dad150be9d5ac226550cabb0856 Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Thu, 7 Jan 2021 19:54:21 +0100 Subject: [PATCH 02/13] added check for guest customization --- nutanix/structure.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/nutanix/structure.go b/nutanix/structure.go index 2e751fca4..45f4ed3fa 100644 --- a/nutanix/structure.go +++ b/nutanix/structure.go @@ -104,11 +104,29 @@ func flattenNicList(nics []*v3.VMNic) []map[string]interface{} { return nicLists } +func usesGuestCustomization(d *schema.ResourceData) bool { + keys := []string{ + "guest_customization_cloud_init_user_data", + "guest_customization_cloud_init_meta_data", + "guest_customization_cloud_init_custom_key_values", + "guest_customization_is_overridable", + "guest_customization_sysprep", + "guest_customization_sysprep_custom_key_values"} + for _, k := range keys { + if _, ok := d.GetOk(k); ok { + return true + } + } + return false +} + func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) []map[string]interface{} { + //todo check if guestcust is passed -> if it is not passed, just continue without searching for cloud-init uuid + // reason: no device_index or disk id will result in crash cloudInitCdromUUIDInput := d.Get("cloud_init_cdrom_uuid") cloudInitCdromUUID := cloudInitCdromUUIDInput.(string) filteredDiskList := disks - if cloudInitCdromUUID == "" { + if cloudInitCdromUUID == "" && usesGuestCustomization(d) == true { log.Printf("Entering search for cloudInitCdromUUID") filteredDiskList = make([]*v3.VMDisk, 0) //expand the user inputted list of disks @@ -150,6 +168,8 @@ func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) utils.PrintToJSON(userCdromDiskList, "userCdromDiskList: ") utils.PrintToJSON(filteredDiskList, "filteredDiskList: ") log.Printf("cloudInitCdromUUID: %s", cloudInitCdromUUID) + } else { + log.Printf("Will not search for cloudInitCdromUUID") } fDiskList := flattenDiskListHelper(filteredDiskList, cloudInitCdromUUID) utils.PrintToJSON(fDiskList, "fDiskList: ") From fcda7038d421417e89bf2ed2faf2ff31c5844f19 Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Thu, 7 Jan 2021 20:47:51 +0100 Subject: [PATCH 03/13] added additional error handling --- nutanix/resource_nutanix_virtual_machine.go | 6 ++- nutanix/structure.go | 42 ++++++++++++++++++--- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/nutanix/resource_nutanix_virtual_machine.go b/nutanix/resource_nutanix_virtual_machine.go index adf4808b4..7f3587afb 100644 --- a/nutanix/resource_nutanix_virtual_machine.go +++ b/nutanix/resource_nutanix_virtual_machine.go @@ -978,7 +978,11 @@ func resourceNutanixVirtualMachineRead(d *schema.ResourceData, meta interface{}) return fmt.Errorf("error setting nic_list_status for Virtual Machine %s: %s", d.Id(), err) } // if err := d.Set("disk_list", flattenDiskList(resp.Spec.Resources.DiskList)); err != nil { - if err := d.Set("disk_list", flattenDiskListFilterCloudInit(d, resp.Spec.Resources.DiskList)); err != nil { + flatDiskList, err := flattenDiskListFilterCloudInit(d, resp.Spec.Resources.DiskList) + if err != nil { + return fmt.Errorf("error flattening disk list for vm %s: %s", d.Id(), err) + } + if err := d.Set("disk_list", flatDiskList); err != nil { return fmt.Errorf("error setting disk_list for Virtual Machine %s: %s", d.Id(), err) } diff --git a/nutanix/structure.go b/nutanix/structure.go index 45f4ed3fa..8ec13c5fd 100644 --- a/nutanix/structure.go +++ b/nutanix/structure.go @@ -120,12 +120,27 @@ func usesGuestCustomization(d *schema.ResourceData) bool { return false } -func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) []map[string]interface{} { +func getDeviceIndexForDisk(disk *v3.VMDisk) (*int64, error) { + if disk.DeviceProperties == nil { + return nil, fmt.Errorf("deviceproperties was nil for disk") + } + if disk.DeviceProperties.DiskAddress == nil { + return nil, fmt.Errorf("disk address was nil for disk") + } + if disk.DeviceProperties.DiskAddress.DeviceIndex == nil { + return nil, fmt.Errorf("device index was nil for disk") + } + diskIndex := *disk.DeviceProperties.DiskAddress.DeviceIndex + return &diskIndex, nil +} + +func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) ([]map[string]interface{}, error) { //todo check if guestcust is passed -> if it is not passed, just continue without searching for cloud-init uuid // reason: no device_index or disk id will result in crash cloudInitCdromUUIDInput := d.Get("cloud_init_cdrom_uuid") cloudInitCdromUUID := cloudInitCdromUUIDInput.(string) filteredDiskList := disks + potentialCloudInitIDs := make([]string, 0) if cloudInitCdromUUID == "" && usesGuestCustomization(d) == true { log.Printf("Entering search for cloudInitCdromUUID") filteredDiskList = make([]*v3.VMDisk, 0) @@ -144,12 +159,21 @@ func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) continue } else { //Get existing CDrom device Index - eDiskIndex := *eDisk.DeviceProperties.DiskAddress.DeviceIndex + + eDiskIndexP, err := getDeviceIndexForDisk(eDisk) //*eDisk.DeviceProperties.DiskAddress.DeviceIndex + if err != nil { + return nil, err + } + eDiskIndex := *eDiskIndexP match := false // Loop over the user defined cdrom drives for _, uDisk := range userCdromDiskList { //extract the device index of the user defined cdrom - uDiskIndex := *uDisk.DeviceProperties.DiskAddress.DeviceIndex + uDiskIndexP, err := getDeviceIndexForDisk(uDisk) + if err != nil { + return nil, err + } + uDiskIndex := *uDiskIndexP // if there is a matching device index for a userdefined and an existing cdrom, it is not the cloud-init one if eDiskIndex == uDiskIndex { filteredDiskList = append(filteredDiskList, eDisk) @@ -158,11 +182,19 @@ func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) } } if !match { - cloudInitCdromUUID = *eDisk.UUID + potentialCloudInitIDs = append(potentialCloudInitIDs, *eDisk.UUID) + // cloudInitCdromUUID = *eDisk.UUID d.Set("cloud_init_cdrom_uuid", cloudInitCdromUUID) } } } + if len(potentialCloudInitIDs) == 1 { + cloudInitCdromUUID = potentialCloudInitIDs[0] + } + if len(potentialCloudInitIDs) > 1 { + return nil, fmt.Errorf("more than 1 unknown cd-rom device: %v", potentialCloudInitIDs) + } + log.Printf("flattenDiskListFilterCloudInit") utils.PrintToJSON(disks, "disks: ") utils.PrintToJSON(userCdromDiskList, "userCdromDiskList: ") @@ -173,7 +205,7 @@ func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) } fDiskList := flattenDiskListHelper(filteredDiskList, cloudInitCdromUUID) utils.PrintToJSON(fDiskList, "fDiskList: ") - return fDiskList + return fDiskList, nil } func flattenDiskList(disks []*v3.VMDisk) []map[string]interface{} { return flattenDiskListHelper(disks, "") From c6d78fbf91ca455e135321b6c15843568ef9e875 Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Fri, 8 Jan 2021 13:32:47 +0100 Subject: [PATCH 04/13] fixed bug where cloud_init_cdrom_uuid was not set --- nutanix/structure.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nutanix/structure.go b/nutanix/structure.go index 8ec13c5fd..584fcf0d8 100644 --- a/nutanix/structure.go +++ b/nutanix/structure.go @@ -184,12 +184,12 @@ func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) if !match { potentialCloudInitIDs = append(potentialCloudInitIDs, *eDisk.UUID) // cloudInitCdromUUID = *eDisk.UUID - d.Set("cloud_init_cdrom_uuid", cloudInitCdromUUID) } } } if len(potentialCloudInitIDs) == 1 { cloudInitCdromUUID = potentialCloudInitIDs[0] + d.Set("cloud_init_cdrom_uuid", cloudInitCdromUUID) } if len(potentialCloudInitIDs) > 1 { return nil, fmt.Errorf("more than 1 unknown cd-rom device: %v", potentialCloudInitIDs) From 026de85eaafd81cdc70d4f5ec3a803feddcfbbc7 Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Fri, 8 Jan 2021 16:41:51 +0100 Subject: [PATCH 05/13] removed additional ide.3 reference --- nutanix/resource_nutanix_virtual_machine.go | 23 ++++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/nutanix/resource_nutanix_virtual_machine.go b/nutanix/resource_nutanix_virtual_machine.go index 7f3587afb..d679c105b 100644 --- a/nutanix/resource_nutanix_virtual_machine.go +++ b/nutanix/resource_nutanix_virtual_machine.go @@ -1306,14 +1306,16 @@ func resourceNutanixVirtualMachineUpdate(d *schema.ResourceData, meta interface{ if err != nil { return err } - + log.Printf("preCdromCount: %d", preCdromCount) res.DiskList = expandDiskListUpdate(d, response) postCdromCount, err := CountDiskListCdrom(res.DiskList) if err != nil { return err } + log.Printf("postCdromCount: %d", postCdromCount) if preCdromCount != postCdromCount { + log.Printf("cdrom hotplugchange!") hotPlugChange = false } } @@ -1812,18 +1814,23 @@ func expandIPAddressList(ipl []interface{}) []*v3.IPAddress { func expandDiskListUpdate(d *schema.ResourceData, vm *v3.VMIntentResponse) []*v3.VMDisk { eDiskList := expandDiskList(d) - - if vm.Spec != nil && vm.Spec.Resources != nil { - for _, disk := range vm.Spec.Resources.DiskList { - if disk.DeviceProperties != nil && disk.DeviceProperties.DiskAddress != nil { - index := disk.DeviceProperties.DiskAddress.DeviceIndex - adapterType := disk.DeviceProperties.DiskAddress.AdapterType - if *index == 3 && *adapterType == IDE { + utils.PrintToJSON(eDiskList, "pre expandDiskListUpdate: ") + if cloudInitCdromUUIDInt, ok := d.GetOk("cloud_init_cdrom_uuid"); ok { + cloudInitCdromUUID := cloudInitCdromUUIDInt.(string) + if cloudInitCdromUUID != "" && vm.Spec != nil && vm.Spec.Resources != nil { + for _, disk := range vm.Spec.Resources.DiskList { + if disk.UUID != nil && *disk.UUID == cloudInitCdromUUID { + // if disk.DeviceProperties != nil && disk.DeviceProperties.DiskAddress != nil { + // index := disk.DeviceProperties.DiskAddress.DeviceIndex + // adapterType := disk.DeviceProperties.DiskAddress.AdapterType + // if *index == 3 && *adapterType == IDE { eDiskList = append(eDiskList, disk) + // } } } } } + utils.PrintToJSON(eDiskList, "post expandDiskListUpdate: ") return eDiskList } From 0ca6f11d2dd8d8bba98dc6bdf2d393fde298c908 Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Fri, 8 Jan 2021 20:15:59 +0100 Subject: [PATCH 06/13] fix linting --- nutanix/structure.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nutanix/structure.go b/nutanix/structure.go index 584fcf0d8..03873cc39 100644 --- a/nutanix/structure.go +++ b/nutanix/structure.go @@ -141,7 +141,7 @@ func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) cloudInitCdromUUID := cloudInitCdromUUIDInput.(string) filteredDiskList := disks potentialCloudInitIDs := make([]string, 0) - if cloudInitCdromUUID == "" && usesGuestCustomization(d) == true { + if cloudInitCdromUUID == "" && usesGuestCustomization(d) { log.Printf("Entering search for cloudInitCdromUUID") filteredDiskList = make([]*v3.VMDisk, 0) //expand the user inputted list of disks From ffdd426ef7acb7e9236bb4c92a4c825e41cecfc7 Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Fri, 15 Jan 2021 11:41:45 +0100 Subject: [PATCH 07/13] removed set of cloud_init_cdrom_uuid during create --- nutanix/resource_nutanix_virtual_machine.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nutanix/resource_nutanix_virtual_machine.go b/nutanix/resource_nutanix_virtual_machine.go index d679c105b..d93d54d91 100644 --- a/nutanix/resource_nutanix_virtual_machine.go +++ b/nutanix/resource_nutanix_virtual_machine.go @@ -920,7 +920,7 @@ func resourceNutanixVirtualMachineCreate(d *schema.ResourceData, meta interface{ // Set terraform state id d.SetId(uuid) - d.Set("cloud_init_cdrom_uuid", "") + // d.Set("cloud_init_cdrom_uuid", "") return resourceNutanixVirtualMachineRead(d, meta) } From 42128ddf4b325fb98fb9332f6dadc55009c8f765 Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Tue, 19 Jan 2021 12:44:01 +0100 Subject: [PATCH 08/13] fix import failures --- nutanix/structure.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/nutanix/structure.go b/nutanix/structure.go index 03873cc39..ecd0e05ac 100644 --- a/nutanix/structure.go +++ b/nutanix/structure.go @@ -141,7 +141,12 @@ func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) cloudInitCdromUUID := cloudInitCdromUUIDInput.(string) filteredDiskList := disks potentialCloudInitIDs := make([]string, 0) - if cloudInitCdromUUID == "" && usesGuestCustomization(d) { + //Check if name is set: + // if name is not set, it indicates an import action + _, nameOk := d.GetOk("name") + log.Printf("NameOk value: %t", nameOk) + // search of cloudinit-cdrom uuid if the uuid is not yet set AND (guest customisation keys are passed OR name was not set -> import action) + if cloudInitCdromUUID == "" && (usesGuestCustomization(d) || !nameOk) { log.Printf("Entering search for cloudInitCdromUUID") filteredDiskList = make([]*v3.VMDisk, 0) //expand the user inputted list of disks From 8daa6bdecd26ba04adb180962184c55e16ea1122 Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Tue, 19 Jan 2021 19:34:25 +0100 Subject: [PATCH 09/13] Revert "fix import failures" This reverts commit f39dfddc3d8763d0bdc7ddfad0bdaba1f5d75ed5. --- nutanix/structure.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/nutanix/structure.go b/nutanix/structure.go index ecd0e05ac..03873cc39 100644 --- a/nutanix/structure.go +++ b/nutanix/structure.go @@ -141,12 +141,7 @@ func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) cloudInitCdromUUID := cloudInitCdromUUIDInput.(string) filteredDiskList := disks potentialCloudInitIDs := make([]string, 0) - //Check if name is set: - // if name is not set, it indicates an import action - _, nameOk := d.GetOk("name") - log.Printf("NameOk value: %t", nameOk) - // search of cloudinit-cdrom uuid if the uuid is not yet set AND (guest customisation keys are passed OR name was not set -> import action) - if cloudInitCdromUUID == "" && (usesGuestCustomization(d) || !nameOk) { + if cloudInitCdromUUID == "" && usesGuestCustomization(d) { log.Printf("Entering search for cloudInitCdromUUID") filteredDiskList = make([]*v3.VMDisk, 0) //expand the user inputted list of disks From e55fe7b0006ce1a683bc09e94700f7581a03e4bd Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Wed, 20 Jan 2021 22:30:31 +0100 Subject: [PATCH 10/13] removed logs --- nutanix/resource_nutanix_virtual_machine.go | 14 -------------- nutanix/structure.go | 20 -------------------- 2 files changed, 34 deletions(-) diff --git a/nutanix/resource_nutanix_virtual_machine.go b/nutanix/resource_nutanix_virtual_machine.go index d93d54d91..fdabce746 100644 --- a/nutanix/resource_nutanix_virtual_machine.go +++ b/nutanix/resource_nutanix_virtual_machine.go @@ -920,15 +920,12 @@ func resourceNutanixVirtualMachineCreate(d *schema.ResourceData, meta interface{ // Set terraform state id d.SetId(uuid) - // d.Set("cloud_init_cdrom_uuid", "") return resourceNutanixVirtualMachineRead(d, meta) } func resourceNutanixVirtualMachineRead(d *schema.ResourceData, meta interface{}) error { initialDiskList := d.Get("disk_list") - utils.PrintToJSON(initialDiskList, "machine read disk_list start") cloudInitCDromUUID := d.Get("cloud_init_cdrom_uuid") - utils.PrintToJSON(cloudInitCDromUUID, "machine read cloud_init_cdrom_uuid start") // Get client connection conn := meta.(*Client).API setVMTimeout(meta) @@ -977,7 +974,6 @@ func resourceNutanixVirtualMachineRead(d *schema.ResourceData, meta interface{}) if err := d.Set("nic_list_status", flattenNicListStatus(resp.Status.Resources.NicList)); err != nil { return fmt.Errorf("error setting nic_list_status for Virtual Machine %s: %s", d.Id(), err) } - // if err := d.Set("disk_list", flattenDiskList(resp.Spec.Resources.DiskList)); err != nil { flatDiskList, err := flattenDiskListFilterCloudInit(d, resp.Spec.Resources.DiskList) if err != nil { return fmt.Errorf("error flattening disk list for vm %s: %s", d.Id(), err) @@ -1306,16 +1302,13 @@ func resourceNutanixVirtualMachineUpdate(d *schema.ResourceData, meta interface{ if err != nil { return err } - log.Printf("preCdromCount: %d", preCdromCount) res.DiskList = expandDiskListUpdate(d, response) postCdromCount, err := CountDiskListCdrom(res.DiskList) if err != nil { return err } - log.Printf("postCdromCount: %d", postCdromCount) if preCdromCount != postCdromCount { - log.Printf("cdrom hotplugchange!") hotPlugChange = false } } @@ -1814,23 +1807,16 @@ func expandIPAddressList(ipl []interface{}) []*v3.IPAddress { func expandDiskListUpdate(d *schema.ResourceData, vm *v3.VMIntentResponse) []*v3.VMDisk { eDiskList := expandDiskList(d) - utils.PrintToJSON(eDiskList, "pre expandDiskListUpdate: ") if cloudInitCdromUUIDInt, ok := d.GetOk("cloud_init_cdrom_uuid"); ok { cloudInitCdromUUID := cloudInitCdromUUIDInt.(string) if cloudInitCdromUUID != "" && vm.Spec != nil && vm.Spec.Resources != nil { for _, disk := range vm.Spec.Resources.DiskList { if disk.UUID != nil && *disk.UUID == cloudInitCdromUUID { - // if disk.DeviceProperties != nil && disk.DeviceProperties.DiskAddress != nil { - // index := disk.DeviceProperties.DiskAddress.DeviceIndex - // adapterType := disk.DeviceProperties.DiskAddress.AdapterType - // if *index == 3 && *adapterType == IDE { eDiskList = append(eDiskList, disk) - // } } } } } - utils.PrintToJSON(eDiskList, "post expandDiskListUpdate: ") return eDiskList } diff --git a/nutanix/structure.go b/nutanix/structure.go index 03873cc39..6cdf575d1 100644 --- a/nutanix/structure.go +++ b/nutanix/structure.go @@ -2,7 +2,6 @@ package nutanix import ( "fmt" - "log" "strconv" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" @@ -142,20 +141,15 @@ func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) filteredDiskList := disks potentialCloudInitIDs := make([]string, 0) if cloudInitCdromUUID == "" && usesGuestCustomization(d) { - log.Printf("Entering search for cloudInitCdromUUID") filteredDiskList = make([]*v3.VMDisk, 0) //expand the user inputted list of disks expandedOrgDiskList := expandDiskList(d) - utils.PrintToJSON(expandedOrgDiskList, "expandedOrgDiskList: ") //extract the CD-rom drives userCdromDiskList := GetCdromDiskList(expandedOrgDiskList) for _, eDisk := range disks { //if existing disk is not CD-rom, append it to the list and continue - utils.PrintToJSON(eDisk, "edisk: ") - log.Print(isCdromDisk(eDisk)) if !isCdromDisk(eDisk) { filteredDiskList = append(filteredDiskList, eDisk) - log.Print("appended!") continue } else { //Get existing CDrom device Index @@ -183,7 +177,6 @@ func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) } if !match { potentialCloudInitIDs = append(potentialCloudInitIDs, *eDisk.UUID) - // cloudInitCdromUUID = *eDisk.UUID } } } @@ -194,17 +187,8 @@ func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) if len(potentialCloudInitIDs) > 1 { return nil, fmt.Errorf("more than 1 unknown cd-rom device: %v", potentialCloudInitIDs) } - - log.Printf("flattenDiskListFilterCloudInit") - utils.PrintToJSON(disks, "disks: ") - utils.PrintToJSON(userCdromDiskList, "userCdromDiskList: ") - utils.PrintToJSON(filteredDiskList, "filteredDiskList: ") - log.Printf("cloudInitCdromUUID: %s", cloudInitCdromUUID) - } else { - log.Printf("Will not search for cloudInitCdromUUID") } fDiskList := flattenDiskListHelper(filteredDiskList, cloudInitCdromUUID) - utils.PrintToJSON(fDiskList, "fDiskList: ") return fDiskList, nil } func flattenDiskList(disks []*v3.VMDisk) []map[string]interface{} { @@ -221,10 +205,6 @@ func flattenDiskListHelper(disks []*v3.VMDisk, cloudInitCdromUUID string) []map[ index := fmt.Sprintf("%d", utils.Int64Value(v.DeviceProperties.DiskAddress.DeviceIndex)) adapter := v.DeviceProperties.DiskAddress.AdapterType - // if index == "3" && *adapter == IDE { - // continue - // } - deviceProps[0] = map[string]interface{}{ "device_type": v.DeviceProperties.DeviceType, "disk_address": map[string]interface{}{ From 2c306e41cce917227399fe2b01153b4c2f800ec9 Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Fri, 22 Jan 2021 16:14:00 +0100 Subject: [PATCH 11/13] remove newline --- nutanix/structure.go | 1 - 1 file changed, 1 deletion(-) diff --git a/nutanix/structure.go b/nutanix/structure.go index 6cdf575d1..cd754c437 100644 --- a/nutanix/structure.go +++ b/nutanix/structure.go @@ -153,7 +153,6 @@ func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) continue } else { //Get existing CDrom device Index - eDiskIndexP, err := getDeviceIndexForDisk(eDisk) //*eDisk.DeviceProperties.DiskAddress.DeviceIndex if err != nil { return nil, err From 768ffd40b026d362f4746b497e7875283dc476c5 Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Fri, 22 Jan 2021 16:16:19 +0100 Subject: [PATCH 12/13] used getOk for cloud_init_cdrom_uuid --- nutanix/resource_nutanix_virtual_machine.go | 2 -- nutanix/structure.go | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/nutanix/resource_nutanix_virtual_machine.go b/nutanix/resource_nutanix_virtual_machine.go index fdabce746..da6dd1911 100644 --- a/nutanix/resource_nutanix_virtual_machine.go +++ b/nutanix/resource_nutanix_virtual_machine.go @@ -924,8 +924,6 @@ func resourceNutanixVirtualMachineCreate(d *schema.ResourceData, meta interface{ } func resourceNutanixVirtualMachineRead(d *schema.ResourceData, meta interface{}) error { - initialDiskList := d.Get("disk_list") - cloudInitCDromUUID := d.Get("cloud_init_cdrom_uuid") // Get client connection conn := meta.(*Client).API setVMTimeout(meta) diff --git a/nutanix/structure.go b/nutanix/structure.go index cd754c437..2014ce25b 100644 --- a/nutanix/structure.go +++ b/nutanix/structure.go @@ -136,8 +136,10 @@ func getDeviceIndexForDisk(disk *v3.VMDisk) (*int64, error) { func flattenDiskListFilterCloudInit(d *schema.ResourceData, disks []*v3.VMDisk) ([]map[string]interface{}, error) { //todo check if guestcust is passed -> if it is not passed, just continue without searching for cloud-init uuid // reason: no device_index or disk id will result in crash - cloudInitCdromUUIDInput := d.Get("cloud_init_cdrom_uuid") - cloudInitCdromUUID := cloudInitCdromUUIDInput.(string) + cloudInitCdromUUID := "" + if cloudInitCdromUUIDInput, cliOk := d.GetOk("cloud_init_cdrom_uuid"); cliOk { + cloudInitCdromUUID = cloudInitCdromUUIDInput.(string) + } filteredDiskList := disks potentialCloudInitIDs := make([]string, 0) if cloudInitCdromUUID == "" && usesGuestCustomization(d) { From 2fb9addf0854a89563f05f4f92065b2e121e1e6c Mon Sep 17 00:00:00 2001 From: Yannick Struyf Date: Fri, 22 Jan 2021 16:23:34 +0100 Subject: [PATCH 13/13] fix linting --- nutanix/resource_nutanix_virtual_machine.go | 34 +++++++++++---------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/nutanix/resource_nutanix_virtual_machine.go b/nutanix/resource_nutanix_virtual_machine.go index da6dd1911..308014eae 100644 --- a/nutanix/resource_nutanix_virtual_machine.go +++ b/nutanix/resource_nutanix_virtual_machine.go @@ -927,6 +927,8 @@ func resourceNutanixVirtualMachineRead(d *schema.ResourceData, meta interface{}) // Get client connection conn := meta.(*Client).API setVMTimeout(meta) + + var err error // Make request to the API resp, err := conn.V3.GetVM(d.Id()) @@ -945,61 +947,61 @@ func resourceNutanixVirtualMachineRead(d *schema.ResourceData, meta interface{}) return nil } - if err := flattenClusterReference(resp.Status.ClusterReference, d); err != nil { + if err = flattenClusterReference(resp.Status.ClusterReference, d); err != nil { return fmt.Errorf("error setting cluster information for Virtual Machine %s: %s", d.Id(), err) } m, c := setRSEntityMetadata(resp.Metadata) - if err := d.Set("metadata", m); err != nil { + if err = d.Set("metadata", m); err != nil { return fmt.Errorf("error setting metadata for Virtual Machine %s: %s", d.Id(), err) } - if err := d.Set("categories", c); err != nil { + if err = d.Set("categories", c); err != nil { return fmt.Errorf("error setting categories for Virtual Machine %s: %s", d.Id(), err) } - if err := d.Set("project_reference", flattenReferenceValues(resp.Metadata.ProjectReference)); err != nil { + if err = d.Set("project_reference", flattenReferenceValues(resp.Metadata.ProjectReference)); err != nil { return fmt.Errorf("error setting project_reference for Virtual Machine %s: %s", d.Id(), err) } - if err := d.Set("owner_reference", flattenReferenceValues(resp.Metadata.OwnerReference)); err != nil { + if err = d.Set("owner_reference", flattenReferenceValues(resp.Metadata.OwnerReference)); err != nil { return fmt.Errorf("error setting owner_reference for Virtual Machine %s: %s", d.Id(), err) } - if err := d.Set("availability_zone_reference", flattenReferenceValues(resp.Status.AvailabilityZoneReference)); err != nil { + if err = d.Set("availability_zone_reference", flattenReferenceValues(resp.Status.AvailabilityZoneReference)); err != nil { return fmt.Errorf("error setting availability_zone_reference for Virtual Machine %s: %s", d.Id(), err) } - if err := d.Set("nic_list", flattenNicList(resp.Spec.Resources.NicList)); err != nil { + if err = d.Set("nic_list", flattenNicList(resp.Spec.Resources.NicList)); err != nil { return fmt.Errorf("error setting nic_list for Virtual Machine %s: %s", d.Id(), err) } - if err := d.Set("nic_list_status", flattenNicListStatus(resp.Status.Resources.NicList)); err != nil { + if err = d.Set("nic_list_status", flattenNicListStatus(resp.Status.Resources.NicList)); err != nil { return fmt.Errorf("error setting nic_list_status for Virtual Machine %s: %s", d.Id(), err) } flatDiskList, err := flattenDiskListFilterCloudInit(d, resp.Spec.Resources.DiskList) if err != nil { return fmt.Errorf("error flattening disk list for vm %s: %s", d.Id(), err) } - if err := d.Set("disk_list", flatDiskList); err != nil { + if err = d.Set("disk_list", flatDiskList); err != nil { return fmt.Errorf("error setting disk_list for Virtual Machine %s: %s", d.Id(), err) } - if err := d.Set("serial_port_list", flattenSerialPortList(resp.Status.Resources.SerialPortList)); err != nil { + if err = d.Set("serial_port_list", flattenSerialPortList(resp.Status.Resources.SerialPortList)); err != nil { return fmt.Errorf("error setting serial_port_list for Virtual Machine %s: %s", d.Id(), err) } - if err := d.Set("host_reference", flattenReferenceValues(resp.Status.Resources.HostReference)); err != nil { + if err = d.Set("host_reference", flattenReferenceValues(resp.Status.Resources.HostReference)); err != nil { return fmt.Errorf("error setting host_reference for Virtual Machine %s: %s", d.Id(), err) } - if err := flattenNutanixGuestTools(d, resp.Status.Resources.GuestTools); err != nil { + if err = flattenNutanixGuestTools(d, resp.Status.Resources.GuestTools); err != nil { return fmt.Errorf("error setting nutanix_guest_tools for Virtual Machine %s: %s", d.Id(), err) } - if err := d.Set("gpu_list", flattenGPUList(resp.Status.Resources.GpuList)); err != nil { + if err = d.Set("gpu_list", flattenGPUList(resp.Status.Resources.GpuList)); err != nil { return fmt.Errorf("error setting gpu_list for Virtual Machine %s: %s", d.Id(), err) } - if err := d.Set("parent_reference", flattenReferenceValues(resp.Status.Resources.ParentReference)); err != nil { + if err = d.Set("parent_reference", flattenReferenceValues(resp.Status.Resources.ParentReference)); err != nil { return fmt.Errorf("error setting parent_reference for Virtual Machine %s: %s", d.Id(), err) } if uha, ok := d.GetOkExists("use_hot_add"); ok { useHotAdd = uha.(bool) } - if err := d.Set("use_hot_add", useHotAdd); err != nil { + if err = d.Set("use_hot_add", useHotAdd); err != nil { return fmt.Errorf("error setting use_hot_add for Virtual Machine %s: %s", d.Id(), err) } @@ -1027,7 +1029,7 @@ func resourceNutanixVirtualMachineRead(d *schema.ResourceData, meta interface{}) } } - if err := d.Set("boot_device_order_list", b); err != nil { + if err = d.Set("boot_device_order_list", b); err != nil { return fmt.Errorf("error setting boot_device_order_list %s", err) }