From af46a9c71af8d8ffe687c0b5a87de9f0ca4f1a37 Mon Sep 17 00:00:00 2001 From: Pavel Boldyrev <627562+bpg@users.noreply.github.com> Date: Sat, 29 Mar 2025 11:42:07 -0400 Subject: [PATCH] fix(vm): remove `qcow2` as the default for `disk.file_format` (#1862) No more need to explicitly set `file_format = "raw"` when defining new disks! Signed-off-by: Pavel Boldyrev <627562+bpg@users.noreply.github.com> --- docs/guides/clone-vm.md | 1 - docs/resources/virtual_environment_vm.md | 7 ++----- example/resource_virtual_environment_vm.tf | 6 ------ examples/guides/clone-vm/template.tf | 1 - fwprovider/test/resource_vm_disks_test.go | 23 ---------------------- proxmoxtf/resource/vm/disk/disk.go | 22 ++++++++++----------- proxmoxtf/resource/vm/disk/schema.go | 1 - 7 files changed, 12 insertions(+), 49 deletions(-) diff --git a/docs/guides/clone-vm.md b/docs/guides/clone-vm.md index 5b0d5391..813850f8 100644 --- a/docs/guides/clone-vm.md +++ b/docs/guides/clone-vm.md @@ -36,7 +36,6 @@ resource "proxmox_virtual_environment_vm" "ubuntu_template" { efi_disk { datastore_id = "local" - file_format = "raw" type = "4m" } diff --git a/docs/resources/virtual_environment_vm.md b/docs/resources/virtual_environment_vm.md index 27c45448..53610427 100755 --- a/docs/resources/virtual_environment_vm.md +++ b/docs/resources/virtual_environment_vm.md @@ -273,11 +273,11 @@ output "ubuntu_vm_public_key" { - `discard` - (Optional) Whether to pass discard/trim requests to the underlying storage. Supported values are `on`/`ignore` (defaults to `ignore`). - - `file_format` - (Optional) The file format (defaults to `qcow2`). + - `file_format` - (Optional) The file format. - `qcow2` - QEMU Disk Image v2. - `raw` - Raw Disk Image. - `vmdk` - VMware Disk Image. - - `file_id` - (Optional) The file ID for a disk image. The ID format is + - `file_id` - (Optional) The file ID for a disk image when importing a disk into VM. The ID format is `:/`, for example `local:iso/centos8.img`. Can be also taken from `proxmox_virtual_environment_download_file` resource. - `interface` - (Required) The disk interface for Proxmox, currently `scsi`, @@ -685,14 +685,12 @@ resource "proxmox_virtual_environment_vm" "data_vm" { disk { datastore_id = "local-zfs" - file_format = "raw" interface = "scsi0" size = 1 } disk { datastore_id = "local-zfs" - file_format = "raw" interface = "scsi1" size = 4 } @@ -702,7 +700,6 @@ resource "proxmox_virtual_environment_vm" "data_user_vm" { # boot disk disk { datastore_id = "local-zfs" - file_format = "raw" interface = "scsi0" size = 8 } diff --git a/example/resource_virtual_environment_vm.tf b/example/resource_virtual_environment_vm.tf index e4b70b3b..1fa29555 100644 --- a/example/resource_virtual_environment_vm.tf +++ b/example/resource_virtual_environment_vm.tf @@ -31,7 +31,6 @@ resource "proxmox_virtual_environment_vm" "example_template" { efi_disk { datastore_id = local.datastore_id - file_format = "raw" type = "4m" } @@ -42,7 +41,6 @@ resource "proxmox_virtual_environment_vm" "example_template" { disk { datastore_id = local.datastore_id - file_format = "raw" interface = "ide0" size = 8 } @@ -61,7 +59,6 @@ resource "proxmox_virtual_environment_vm" "example_template" { # datastore_id = "nfs" # interface = "scsi1" # discard = "ignore" - # file_format = "raw" # } initialization { @@ -166,7 +163,6 @@ resource "proxmox_virtual_environment_vm" "example" { efi_disk { datastore_id = local.datastore_id - file_format = "raw" type = "4m" } @@ -234,13 +230,11 @@ resource "proxmox_virtual_environment_vm" "data_vm" { disk { datastore_id = local.datastore_id - file_format = "raw" interface = "scsi0" size = 1 } disk { datastore_id = local.datastore_id - file_format = "raw" interface = "scsi1" size = 4 } diff --git a/examples/guides/clone-vm/template.tf b/examples/guides/clone-vm/template.tf index ec93fa42..c96dd86b 100644 --- a/examples/guides/clone-vm/template.tf +++ b/examples/guides/clone-vm/template.tf @@ -19,7 +19,6 @@ resource "proxmox_virtual_environment_vm" "ubuntu_template" { efi_disk { datastore_id = "local" - file_format = "raw" type = "4m" } diff --git a/fwprovider/test/resource_vm_disks_test.go b/fwprovider/test/resource_vm_disks_test.go index 113aea04..7a068ad3 100644 --- a/fwprovider/test/resource_vm_disks_test.go +++ b/fwprovider/test/resource_vm_disks_test.go @@ -34,8 +34,6 @@ func TestAccResourceVMDisks(t *testing.T) { name = "test-disk" disk { - // note: default qcow2 is not supported by lvm (?) - file_format = "raw" datastore_id = "local-lvm" interface = "virtio0" size = 8 @@ -67,8 +65,6 @@ func TestAccResourceVMDisks(t *testing.T) { name = "test-disk" disk { - // note: default qcow2 is not supported by lvm (?) - file_format = "raw" datastore_id = "local-lvm" interface = "virtio0" serial = "-dead_beef-" @@ -155,7 +151,6 @@ func TestAccResourceVMDisks(t *testing.T) { template = "true" disk { - file_format = "raw" datastore_id = "local-lvm" interface = "virtio0" size = 8 @@ -190,13 +185,11 @@ func TestAccResourceVMDisks(t *testing.T) { template = "true" disk { - file_format = "raw" datastore_id = "local-lvm" interface = "virtio0" size = 8 } disk { - file_format = "raw" datastore_id = "local-lvm" interface = "scsi0" size = 8 @@ -222,7 +215,6 @@ func TestAccResourceVMDisks(t *testing.T) { name = "test-disk" disk { - file_format = "raw" datastore_id = "local-lvm" interface = "scsi0" size = 8 @@ -241,14 +233,12 @@ func TestAccResourceVMDisks(t *testing.T) { name = "test-disk" disk { - file_format = "raw" datastore_id = "local-lvm" interface = "scsi0" size = 8 } disk { - file_format = "raw" datastore_id = "local-lvm" interface = "scsi1" size = 8 @@ -279,14 +269,12 @@ func TestAccResourceVMDisks(t *testing.T) { name = "test-disk" disk { - file_format = "raw" datastore_id = "local-lvm" interface = "scsi0" size = 8 } disk { - file_format = "raw" datastore_id = "local-lvm" interface = "scsi1" size = 8 @@ -307,7 +295,6 @@ func TestAccResourceVMDisks(t *testing.T) { name = "test-disk" disk { - file_format = "raw" datastore_id = "local-lvm" interface = "scsi0" size = 8 @@ -349,7 +336,6 @@ func TestAccResourceVMDisks(t *testing.T) { name = "test-disks-ide" disk { - file_format = "raw" datastore_id = "local-lvm" interface = "ide0" size = 8 @@ -368,13 +354,11 @@ func TestAccResourceVMDisks(t *testing.T) { name = "test-disks-ide" disk { - file_format = "raw" datastore_id = "local-lvm" interface = "ide0" size = 8 } disk { - file_format = "raw" datastore_id = "local-lvm" interface = "ide1" size = 8 @@ -402,7 +386,6 @@ func TestAccResourceVMDisks(t *testing.T) { template = "true" disk { - file_format = "raw" datastore_id = "local-lvm" interface = "scsi0" size = 8 @@ -451,7 +434,6 @@ func TestAccResourceVMDisks(t *testing.T) { template = "true" disk { - file_format = "raw" datastore_id = "local-lvm" interface = "virtio0" size = 8 @@ -498,7 +480,6 @@ func TestAccResourceVMDisks(t *testing.T) { template = "true" disk { - file_format = "raw" datastore_id = "local-lvm" interface = "virtio0" size = 8 @@ -514,7 +495,6 @@ func TestAccResourceVMDisks(t *testing.T) { } disk { - file_format = "raw" datastore_id = "local-lvm" interface = "scsi0" size = 10 @@ -543,7 +523,6 @@ func TestAccResourceVMDisks(t *testing.T) { disk { datastore_id = "local-lvm" interface = "virtio0" - file_format = "raw" size = 20 } } @@ -591,7 +570,6 @@ func TestAccResourceVMDisks(t *testing.T) { disk { datastore_id = "local-lvm" interface = "virtio0" - file_format = "raw" size = 20 } } @@ -604,7 +582,6 @@ func TestAccResourceVMDisks(t *testing.T) { disk { datastore_id = "tank" interface = "virtio0" - file_format = "raw" size = 20 } }`), diff --git a/proxmoxtf/resource/vm/disk/disk.go b/proxmoxtf/resource/vm/disk/disk.go index a71035c4..b3bf02d7 100644 --- a/proxmoxtf/resource/vm/disk/disk.go +++ b/proxmoxtf/resource/vm/disk/disk.go @@ -39,8 +39,8 @@ func GetInfo(resp *vms.GetResponseData, d *schema.ResourceData) vms.CustomStorag for k, v := range storageDevices { if v != nil && diskMap[k] != nil { - if d, ok := diskMap[k].(map[string]interface{}); ok { - if fileID, ok := d[mkDiskFileID].(string); ok && fileID != "" { + if disk, ok := diskMap[k].(map[string]interface{}); ok { + if fileID, ok := disk[mkDiskFileID].(string); ok && fileID != "" { v.FileID = &fileID } } @@ -195,15 +195,11 @@ func GetDiskDeviceObjects( return diskDeviceObjects, fmt.Errorf("error getting disk speed block: %w", err) } - if fileFormat == "" { - fileFormat = dvDiskFileFormat - } - if pathInDatastore != "" { if datastoreID != "" { diskDevice.FileVolume = fmt.Sprintf("%s:%s", datastoreID, pathInDatastore) } else { - // FileVolume is absolute path in the host filesystem + // FileVolume is the absolute path in the host filesystem diskDevice.FileVolume = pathInDatastore } } else { @@ -216,11 +212,14 @@ func GetDiskDeviceObjects( diskDevice.DatastoreID = &datastoreID diskDevice.Discard = &discard diskDevice.FileID = &fileID - diskDevice.Format = &fileFormat diskDevice.Replicate = &replicate diskDevice.Serial = &serial diskDevice.Size = types.DiskSizeFromGigabytes(int64(size)) + if fileFormat != "" { + diskDevice.Format = &fileFormat + } + if !strings.HasPrefix(diskInterface, "virtio") { diskDevice.SSD = &ssd } @@ -316,7 +315,8 @@ func createCustomDisk( iface string, disk vms.CustomStorageDevice, ) error { - fileFormat := dvDiskFileFormat + // use "old default" specifically here. + fileFormat := "qcow2" if disk.Format != nil && *disk.Format != "" { fileFormat = *disk.Format } @@ -332,7 +332,7 @@ func createCustomDisk( fmt.Sprintf(`disk_options="%s"`, disk.EncodeOptions()), fmt.Sprintf(`disk_interface="%s"`, iface), `source_image=$(try_sudo "pvesm path $file_id")`, - `imported_disk="$(try_sudo "qm importdisk $vm_id $source_image $datastore_id_target -format $file_format" | grep "unused0" | cut -d ":" -f 3 | cut -d "'" -f 1)"`, + `imported_disk="$(try_sudo "qm disk import $vm_id $source_image $datastore_id_target -format $file_format" | grep "unused0" | cut -d ":" -f 3 | cut -d "'" -f 1)"`, `disk_id="${datastore_id_target}:$imported_disk,${disk_options}"`, `try_sudo "qm set $vm_id -${disk_interface} $disk_id"`, } @@ -399,8 +399,6 @@ func Read( disk[mkDiskPathInDatastore] = pathInDatastore if dd.Format == nil { - disk[mkDiskFileFormat] = dvDiskFileFormat - if datastoreID != "" { // 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 diff --git a/proxmoxtf/resource/vm/disk/schema.go b/proxmoxtf/resource/vm/disk/schema.go index 7fa9cf82..b3d5c73a 100644 --- a/proxmoxtf/resource/vm/disk/schema.go +++ b/proxmoxtf/resource/vm/disk/schema.go @@ -17,7 +17,6 @@ import ( const ( dvDiskInterface = "scsi0" dvDiskDatastoreID = "local-lvm" - dvDiskFileFormat = "qcow2" dvDiskSize = 8 dvDiskAIO = "io_uring" dvDiskDiscard = "ignore"