From b039380f2afc3dba45bf1a8074600ba5186f94fb Mon Sep 17 00:00:00 2001 From: Dan Petersen Date: Mon, 30 Dec 2019 06:28:52 +0100 Subject: [PATCH] Continued work on VM resource --- proxmoxtf/resource_virtual_environment_vm.go | 151 +++++++++++++------ 1 file changed, 102 insertions(+), 49 deletions(-) diff --git a/proxmoxtf/resource_virtual_environment_vm.go b/proxmoxtf/resource_virtual_environment_vm.go index fbdaced8..667b9af3 100644 --- a/proxmoxtf/resource_virtual_environment_vm.go +++ b/proxmoxtf/resource_virtual_environment_vm.go @@ -740,55 +740,10 @@ func resourceVirtualEnvironmentVMCreate(d *schema.ResourceData, m interface{}) e cpuSockets := cpuBlock[mkResourceVirtualEnvironmentVMCPUSockets].(int) description := d.Get(mkResourceVirtualEnvironmentVMDescription).(string) - disk := d.Get(mkResourceVirtualEnvironmentVMDisk).([]interface{}) - scsiDevices := make(proxmox.CustomStorageDevices, len(disk)) + diskDeviceObjects, err := resourceVirtualEnvironmentVMGetDiskDeviceObjects(d, m) - for i, diskEntry := range disk { - diskDevice := proxmox.CustomStorageDevice{ - Enabled: true, - } - - block := diskEntry.(map[string]interface{}) - datastoreID, _ := block[mkResourceVirtualEnvironmentVMDiskDatastoreID].(string) - fileID, _ := block[mkResourceVirtualEnvironmentVMDiskFileID].(string) - size, _ := block[mkResourceVirtualEnvironmentVMDiskSize].(int) - - speedBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMDisk, mkResourceVirtualEnvironmentVMDiskSpeed}, 0, false) - - if err != nil { - return err - } - - if fileID != "" { - diskDevice.Enabled = false - } else { - diskDevice.FileVolume = fmt.Sprintf("%s:%d", datastoreID, size) - } - - if len(speedBlock) > 0 { - speedLimitRead := speedBlock[mkResourceVirtualEnvironmentVMDiskSpeedRead].(int) - speedLimitReadBurstable := speedBlock[mkResourceVirtualEnvironmentVMDiskSpeedReadBurstable].(int) - speedLimitWrite := speedBlock[mkResourceVirtualEnvironmentVMDiskSpeedWrite].(int) - speedLimitWriteBurstable := speedBlock[mkResourceVirtualEnvironmentVMDiskSpeedWriteBurstable].(int) - - if speedLimitRead > 0 { - diskDevice.MaxReadSpeedMbps = &speedLimitRead - } - - if speedLimitReadBurstable > 0 { - diskDevice.BurstableReadSpeedMbps = &speedLimitReadBurstable - } - - if speedLimitWrite > 0 { - diskDevice.MaxWriteSpeedMbps = &speedLimitWrite - } - - if speedLimitWriteBurstable > 0 { - diskDevice.BurstableWriteSpeedMbps = &speedLimitWriteBurstable - } - } - - scsiDevices[i] = diskDevice + if err != nil { + return err } keyboardLayout := d.Get(mkResourceVirtualEnvironmentVMKeyboardLayout).(string) @@ -879,7 +834,7 @@ func resourceVirtualEnvironmentVMCreate(d *schema.ResourceData, m interface{}) e NetworkDevices: networkDeviceObjects, OSType: &osType, PoolID: &poolID, - SCSIDevices: scsiDevices, + SCSIDevices: diskDeviceObjects, SCSIHardware: &scsiHardware, SerialDevices: []string{"socket"}, SharedMemory: memorySharedObject, @@ -1176,6 +1131,62 @@ func resourceVirtualEnvironmentVMGetCloudConfig(d *schema.ResourceData, m interf return cloudInitConfig, nil } +func resourceVirtualEnvironmentVMGetDiskDeviceObjects(d *schema.ResourceData, m interface{}) (proxmox.CustomStorageDevices, error) { + diskDevice := d.Get(mkResourceVirtualEnvironmentVMDisk).([]interface{}) + diskDeviceObjects := make(proxmox.CustomStorageDevices, len(diskDevice)) + resource := resourceVirtualEnvironmentVM() + + for i, diskEntry := range diskDevice { + diskDevice := proxmox.CustomStorageDevice{ + Enabled: true, + } + + block := diskEntry.(map[string]interface{}) + datastoreID, _ := block[mkResourceVirtualEnvironmentVMDiskDatastoreID].(string) + fileID, _ := block[mkResourceVirtualEnvironmentVMDiskFileID].(string) + size, _ := block[mkResourceVirtualEnvironmentVMDiskSize].(int) + + speedBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMDisk, mkResourceVirtualEnvironmentVMDiskSpeed}, 0, false) + + if err != nil { + return diskDeviceObjects, err + } + + if fileID != "" { + diskDevice.Enabled = false + } else { + diskDevice.FileVolume = fmt.Sprintf("%s:%d", datastoreID, size) + } + + if len(speedBlock) > 0 { + speedLimitRead := speedBlock[mkResourceVirtualEnvironmentVMDiskSpeedRead].(int) + speedLimitReadBurstable := speedBlock[mkResourceVirtualEnvironmentVMDiskSpeedReadBurstable].(int) + speedLimitWrite := speedBlock[mkResourceVirtualEnvironmentVMDiskSpeedWrite].(int) + speedLimitWriteBurstable := speedBlock[mkResourceVirtualEnvironmentVMDiskSpeedWriteBurstable].(int) + + if speedLimitRead > 0 { + diskDevice.MaxReadSpeedMbps = &speedLimitRead + } + + if speedLimitReadBurstable > 0 { + diskDevice.BurstableReadSpeedMbps = &speedLimitReadBurstable + } + + if speedLimitWrite > 0 { + diskDevice.MaxWriteSpeedMbps = &speedLimitWrite + } + + if speedLimitWriteBurstable > 0 { + diskDevice.BurstableWriteSpeedMbps = &speedLimitWriteBurstable + } + } + + diskDeviceObjects[i] = diskDevice + } + + return diskDeviceObjects, nil +} + func resourceVirtualEnvironmentVMGetNetworkDeviceObjects(d *schema.ResourceData, m interface{}) (proxmox.CustomNetworkDevices, error) { networkDevice := d.Get(mkResourceVirtualEnvironmentVMNetworkDevice).([]interface{}) networkDeviceObjects := make(proxmox.CustomNetworkDevices, len(networkDevice)) @@ -1862,6 +1873,48 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e rebootRequired = true } + // Prepare the new disk device configuration. + if d.HasChange(mkResourceVirtualEnvironmentVMDisk) { + diskDeviceObjects, err := resourceVirtualEnvironmentVMGetDiskDeviceObjects(d, m) + + if err != nil { + return err + } + + scsiDevices := []*proxmox.CustomStorageDevice{ + vmConfig.SCSIDevice0, + vmConfig.SCSIDevice1, + vmConfig.SCSIDevice2, + vmConfig.SCSIDevice3, + vmConfig.SCSIDevice4, + vmConfig.SCSIDevice5, + vmConfig.SCSIDevice6, + vmConfig.SCSIDevice7, + vmConfig.SCSIDevice8, + vmConfig.SCSIDevice9, + vmConfig.SCSIDevice10, + vmConfig.SCSIDevice11, + vmConfig.SCSIDevice12, + vmConfig.SCSIDevice13, + } + + body.SCSIDevices = make(proxmox.CustomStorageDevices, len(diskDeviceObjects)) + + for di, do := range diskDeviceObjects { + if scsiDevices[di] == nil { + return fmt.Errorf("Missing SCSI device %d (scsi%d)", di, di) + } + + body.SCSIDevices[di] = *scsiDevices[di] + body.SCSIDevices[di].BurstableReadSpeedMbps = do.BurstableReadSpeedMbps + body.SCSIDevices[di].BurstableWriteSpeedMbps = do.BurstableWriteSpeedMbps + body.SCSIDevices[di].MaxReadSpeedMbps = do.MaxReadSpeedMbps + body.SCSIDevices[di].MaxWriteSpeedMbps = do.MaxWriteSpeedMbps + } + + rebootRequired = true + } + // Prepare the new memory configuration. if d.HasChange(mkResourceVirtualEnvironmentVMMemory) { memoryBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMMemory}, 0, true)