0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-07-06 14:03:58 +00:00

fix(vm): Prevent file_format override with default qcow2 in TF state (#275)

* fix(vm): Fix for `raw` file format for new empty disks

* make file_format computed

* apply default file_format for disc cloning as well
This commit is contained in:
Pavel Boldyrev 2023-03-25 10:18:42 -04:00 committed by GitHub
parent fdb9dc7714
commit 17dca987eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -516,7 +516,6 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
return []interface{}{ return []interface{}{
map[string]interface{}{ map[string]interface{}{
mkResourceVirtualEnvironmentVMDiskDatastoreID: dvResourceVirtualEnvironmentVMDiskDatastoreID, mkResourceVirtualEnvironmentVMDiskDatastoreID: dvResourceVirtualEnvironmentVMDiskDatastoreID,
mkResourceVirtualEnvironmentVMDiskFileFormat: dvResourceVirtualEnvironmentVMDiskFileFormat,
mkResourceVirtualEnvironmentVMDiskFileID: dvResourceVirtualEnvironmentVMDiskFileID, mkResourceVirtualEnvironmentVMDiskFileID: dvResourceVirtualEnvironmentVMDiskFileID,
mkResourceVirtualEnvironmentVMDiskInterface: dvResourceVirtualEnvironmentVMDiskInterface, mkResourceVirtualEnvironmentVMDiskInterface: dvResourceVirtualEnvironmentVMDiskInterface,
mkResourceVirtualEnvironmentVMDiskSize: dvResourceVirtualEnvironmentVMDiskSize, mkResourceVirtualEnvironmentVMDiskSize: dvResourceVirtualEnvironmentVMDiskSize,
@ -544,7 +543,7 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Description: "The file format", Description: "The file format",
Optional: true, Optional: true,
ForceNew: true, ForceNew: true,
Default: dvResourceVirtualEnvironmentVMDiskFileFormat, Computed: true,
ValidateDiagFunc: getFileFormatValidator(), ValidateDiagFunc: getFileFormatValidator(),
}, },
mkResourceVirtualEnvironmentVMDiskFileID: { mkResourceVirtualEnvironmentVMDiskFileID: {
@ -2044,6 +2043,14 @@ func resourceVirtualEnvironmentVMCreateCustom(
d.SetId(strconv.Itoa(vmID)) d.SetId(strconv.Itoa(vmID))
// TODO: The VM creation is not atomic, and not synchronous. This means that the VM might not be
// available immediately after the creation, or its state reported by the API might not be
// up to date. This is a problem for the following operations, which rely on the VM information
// returned by API calls, particularly read-back to populate the Terraform state.
// Would it be possible to wait for the VM to be fully available, or to wait for the API to report
// the correct state?
// time.Sleep(5 * time.Second)
return resourceVirtualEnvironmentVMCreateCustomDisks(ctx, d, m) return resourceVirtualEnvironmentVMCreateCustomDisks(ctx, d, m)
} }
@ -2106,6 +2113,10 @@ func resourceVirtualEnvironmentVMCreateCustomDisks(
ssd := proxmox.CustomBool(block[mkResourceVirtualEnvironmentVMDiskSSD].(bool)) ssd := proxmox.CustomBool(block[mkResourceVirtualEnvironmentVMDiskSSD].(bool))
discard, _ := block[mkResourceVirtualEnvironmentVMDiskDiscard].(string) discard, _ := block[mkResourceVirtualEnvironmentVMDiskDiscard].(string)
if fileFormat == "" {
fileFormat = dvResourceVirtualEnvironmentVMDiskFileFormat
}
if len(speed) == 0 { if len(speed) == 0 {
diskSpeedDefault, err := diskSpeedResource.DefaultValue() diskSpeedDefault, err := diskSpeedResource.DefaultValue()
if err != nil { if err != nil {
@ -2461,6 +2472,9 @@ func resourceVirtualEnvironmentVMGetDiskDeviceObjects(
return diskDeviceObjects, err return diskDeviceObjects, err
} }
if fileFormat == "" {
fileFormat = dvResourceVirtualEnvironmentVMDiskFileFormat
}
if fileID != "" { if fileID != "" {
diskDevice.Enabled = false diskDevice.Enabled = false
} else { } else {
@ -2776,6 +2790,7 @@ func resourceVirtualEnvironmentVMReadCustom(
return diags return diags
} }
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
clone := d.Get(mkResourceVirtualEnvironmentVMClone).([]interface{}) clone := d.Get(mkResourceVirtualEnvironmentVMClone).([]interface{})
// Compare the agent configuration to the one stored in the state. // Compare the agent configuration to the one stored in the state.
@ -3012,7 +3027,20 @@ func resourceVirtualEnvironmentVMReadCustom(
disk[mkResourceVirtualEnvironmentVMDiskDatastoreID] = fileIDParts[0] disk[mkResourceVirtualEnvironmentVMDiskDatastoreID] = fileIDParts[0]
if dd.Format == nil { if dd.Format == nil {
disk[mkResourceVirtualEnvironmentVMDiskFileFormat] = "qcow2" disk[mkResourceVirtualEnvironmentVMDiskFileFormat] = dvResourceVirtualEnvironmentVMDiskFileFormat
// disk format may not be returned by config API if it is default for the storage, and that may be different
// from the default qcow2, so we need to read it from the storage API to make sure we have the correct value
files, err := veClient.ListDatastoreFiles(ctx, nodeName, fileIDParts[0])
if err != nil {
diags = append(diags, diag.FromErr(err)...)
continue
}
for _, v := range files {
if v.VolumeID == dd.FileVolume {
disk[mkResourceVirtualEnvironmentVMDiskFileFormat] = v.FileFormat
break
}
}
} else { } else {
disk[mkResourceVirtualEnvironmentVMDiskFileFormat] = dd.Format disk[mkResourceVirtualEnvironmentVMDiskFileFormat] = dd.Format
} }