diff --git a/example/resource_virtual_environment_vm.tf b/example/resource_virtual_environment_vm.tf index 081cabfa..68c27cee 100644 --- a/example/resource_virtual_environment_vm.tf +++ b/example/resource_virtual_environment_vm.tf @@ -9,8 +9,15 @@ resource "proxmox_virtual_environment_vm" "example_template" { datastore_id = element(data.proxmox_virtual_environment_datastores.example.datastore_ids, index(data.proxmox_virtual_environment_datastores.example.datastore_ids, "local-lvm")) file_id = proxmox_virtual_environment_file.ubuntu_cloud_image.id interface = "scsi0" + iothread = true } +# disk { +# datastore_id = "nfs" +# interface = "scsi1" +# iothread = true +# } + initialization { datastore_id = element(data.proxmox_virtual_environment_datastores.example.datastore_ids, index(data.proxmox_virtual_environment_datastores.example.datastore_ids, "local-lvm")) diff --git a/proxmox/virtual_environment_vm_types.go b/proxmox/virtual_environment_vm_types.go index 04c3ca52..0c0255ed 100644 --- a/proxmox/virtual_environment_vm_types.go +++ b/proxmox/virtual_environment_vm_types.go @@ -163,6 +163,7 @@ type CustomStorageDevice struct { Media *string `json:"media,omitempty" url:"media,omitempty"` Size *string `json:"size,omitempty" url:"size,omitempty"` Format *string `json:"format,omitempty" url:"format,omitempty"` + IOThread *CustomBool `json:"iothread,omitempty" url:"iothread,omitempty,int"` Interface *string ID *string FileID *string @@ -1059,6 +1060,14 @@ func (r CustomStorageDevice) EncodeValues(key string, v *url.Values) error { values = append(values, fmt.Sprintf("size=%s", *r.Size)) } + if r.IOThread != nil { + if *r.IOThread { + values = append(values, "iothread=1") + } else { + values = append(values, "iothread=0") + } + } + v.Add(key, strings.Join(values, ",")) return nil @@ -1588,6 +1597,9 @@ func (r *CustomStorageDevice) UnmarshalJSON(b []byte) error { r.Size = &v[1] case "format": r.Format = &v[1] + case "iothread": + bv := CustomBool(v[1] == "1") + r.IOThread = &bv } } } diff --git a/proxmoxtf/resource_virtual_environment_vm.go b/proxmoxtf/resource_virtual_environment_vm.go index 5ce6e7bc..b98af283 100644 --- a/proxmoxtf/resource_virtual_environment_vm.go +++ b/proxmoxtf/resource_virtual_environment_vm.go @@ -49,6 +49,7 @@ const ( dvResourceVirtualEnvironmentVMDiskFileFormat = "qcow2" dvResourceVirtualEnvironmentVMDiskFileID = "" dvResourceVirtualEnvironmentVMDiskSize = 8 + dvResourceVirtualEnvironmentVMDiskIOThread = false dvResourceVirtualEnvironmentVMDiskSpeedRead = 0 dvResourceVirtualEnvironmentVMDiskSpeedReadBurstable = 0 dvResourceVirtualEnvironmentVMDiskSpeedWrite = 0 @@ -132,6 +133,7 @@ const ( mkResourceVirtualEnvironmentVMDiskFileFormat = "file_format" mkResourceVirtualEnvironmentVMDiskFileID = "file_id" mkResourceVirtualEnvironmentVMDiskSize = "size" + mkResourceVirtualEnvironmentVMDiskIOThread = "iothread" mkResourceVirtualEnvironmentVMDiskSpeed = "speed" mkResourceVirtualEnvironmentVMDiskSpeedRead = "read" mkResourceVirtualEnvironmentVMDiskSpeedReadBurstable = "read_burstable" @@ -478,6 +480,7 @@ func resourceVirtualEnvironmentVM() *schema.Resource { mkResourceVirtualEnvironmentVMDiskFileID: dvResourceVirtualEnvironmentVMDiskFileID, mkResourceVirtualEnvironmentVMDiskInterface: dvResourceVirtualEnvironmentVMDiskInterface, mkResourceVirtualEnvironmentVMDiskSize: dvResourceVirtualEnvironmentVMDiskSize, + mkResourceVirtualEnvironmentVMDiskIOThread: dvResourceVirtualEnvironmentVMDiskIOThread, }, }, nil }, @@ -517,6 +520,12 @@ func resourceVirtualEnvironmentVM() *schema.Resource { Default: dvResourceVirtualEnvironmentVMDiskSize, ValidateDiagFunc: validation.ToDiagFunc(validation.IntAtLeast(1)), }, + mkResourceVirtualEnvironmentVMDiskIOThread: { + Type: schema.TypeBool, + Description: "Whether to use iothreads for this disk drive", + Optional: true, + Default: dvResourceVirtualEnvironmentVMDiskIOThread, + }, mkResourceVirtualEnvironmentVMDiskSpeed: { Type: schema.TypeList, Description: "The speed limits", @@ -1783,6 +1792,7 @@ func resourceVirtualEnvironmentVMCreateCustomDisks(ctx context.Context, d *schem size, _ := block[mkResourceVirtualEnvironmentVMDiskSize].(int) speed := block[mkResourceVirtualEnvironmentVMDiskSpeed].([]interface{}) diskInterface, _ := block[mkResourceVirtualEnvironmentVMDiskInterface].(string) + ioThread := proxmox.CustomBool(block[mkResourceVirtualEnvironmentVMDiskIOThread].(bool)) if len(speed) == 0 { diskSpeedDefault, err := diskSpeedResource.DefaultValue() @@ -1800,6 +1810,10 @@ func resourceVirtualEnvironmentVMCreateCustomDisks(ctx context.Context, d *schem diskOptions := "" + if ioThread { + diskOptions += ",iothread=1" + } + if speedLimitRead > 0 { diskOptions += fmt.Sprintf(",mbps_rd=%d", speedLimitRead) } @@ -2083,6 +2097,7 @@ func resourceVirtualEnvironmentVMGetDiskDeviceObjects(d *schema.ResourceData, di fileID, _ := block[mkResourceVirtualEnvironmentVMDiskFileID].(string) size, _ := block[mkResourceVirtualEnvironmentVMDiskSize].(int) diskInterface, _ := block[mkResourceVirtualEnvironmentVMDiskInterface].(string) + ioThread := proxmox.CustomBool(block[mkResourceVirtualEnvironmentVMDiskIOThread].(bool)) speedBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMDisk, mkResourceVirtualEnvironmentVMDiskSpeed}, 0, false) @@ -2102,6 +2117,7 @@ func resourceVirtualEnvironmentVMGetDiskDeviceObjects(d *schema.ResourceData, di sizeString := fmt.Sprintf("%dG", size) diskDevice.Size = &sizeString diskDevice.SizeInt = &size + diskDevice.IOThread = &ioThread if len(speedBlock) > 0 { speedLimitRead := speedBlock[mkResourceVirtualEnvironmentVMDiskSpeedRead].(int)