diff --git a/example/resource_virtual_environment_vm.tf b/example/resource_virtual_environment_vm.tf index 68c27cee..322ad8e4 100644 --- a/example/resource_virtual_environment_vm.tf +++ b/example/resource_virtual_environment_vm.tf @@ -9,12 +9,14 @@ 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" + discard = "on" iothread = true } # disk { # datastore_id = "nfs" # interface = "scsi1" +# discard = "ignore" # iothread = true # } diff --git a/proxmox/virtual_environment_vm_types.go b/proxmox/virtual_environment_vm_types.go index 0c0255ed..435281b9 100644 --- a/proxmox/virtual_environment_vm_types.go +++ b/proxmox/virtual_environment_vm_types.go @@ -156,14 +156,15 @@ type CustomStorageDevice struct { BackupEnabled *CustomBool `json:"backup,omitempty" url:"backup,omitempty,int"` BurstableReadSpeedMbps *int `json:"mbps_rd_max,omitempty" url:"mbps_rd_max,omitempty"` BurstableWriteSpeedMbps *int `json:"mbps_wr_max,omitempty" url:"mbps_wr_max,omitempty"` + Discard *string `json:"discard,omitempty" url:"discard,omitempty"` Enabled bool `json:"-" url:"-"` FileVolume string `json:"file" url:"file"` + Format *string `json:"format,omitempty" url:"format,omitempty"` + IOThread *CustomBool `json:"iothread,omitempty" url:"iothread,omitempty,int"` MaxReadSpeedMbps *int `json:"mbps_rd,omitempty" url:"mbps_rd,omitempty"` MaxWriteSpeedMbps *int `json:"mbps_wr,omitempty" url:"mbps_wr,omitempty"` 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 @@ -1068,6 +1069,10 @@ func (r CustomStorageDevice) EncodeValues(key string, v *url.Values) error { } } + if r.Discard != nil && *r.Discard != "" { + values = append(values, fmt.Sprintf("discard=%s", *r.Discard)) + } + v.Add(key, strings.Join(values, ",")) return nil @@ -1600,6 +1605,8 @@ func (r *CustomStorageDevice) UnmarshalJSON(b []byte) error { case "iothread": bv := CustomBool(v[1] == "1") r.IOThread = &bv + case "discard": + r.Discard = &v[1] } } } diff --git a/proxmoxtf/resource_virtual_environment_vm.go b/proxmoxtf/resource_virtual_environment_vm.go index 280406e6..5578704e 100644 --- a/proxmoxtf/resource_virtual_environment_vm.go +++ b/proxmoxtf/resource_virtual_environment_vm.go @@ -51,6 +51,7 @@ const ( dvResourceVirtualEnvironmentVMDiskFileID = "" dvResourceVirtualEnvironmentVMDiskSize = 8 dvResourceVirtualEnvironmentVMDiskIOThread = false + dvResourceVirtualEnvironmentVMDiskDiscard = "" dvResourceVirtualEnvironmentVMDiskSpeedRead = 0 dvResourceVirtualEnvironmentVMDiskSpeedReadBurstable = 0 dvResourceVirtualEnvironmentVMDiskSpeedWrite = 0 @@ -135,6 +136,7 @@ const ( mkResourceVirtualEnvironmentVMDiskFileID = "file_id" mkResourceVirtualEnvironmentVMDiskSize = "size" mkResourceVirtualEnvironmentVMDiskIOThread = "iothread" + mkResourceVirtualEnvironmentVMDiskDiscard = "discard" mkResourceVirtualEnvironmentVMDiskSpeed = "speed" mkResourceVirtualEnvironmentVMDiskSpeedRead = "read" mkResourceVirtualEnvironmentVMDiskSpeedReadBurstable = "read_burstable" @@ -482,6 +484,7 @@ func resourceVirtualEnvironmentVM() *schema.Resource { mkResourceVirtualEnvironmentVMDiskInterface: dvResourceVirtualEnvironmentVMDiskInterface, mkResourceVirtualEnvironmentVMDiskSize: dvResourceVirtualEnvironmentVMDiskSize, mkResourceVirtualEnvironmentVMDiskIOThread: dvResourceVirtualEnvironmentVMDiskIOThread, + mkResourceVirtualEnvironmentVMDiskDiscard: dvResourceVirtualEnvironmentVMDiskDiscard, }, }, nil }, @@ -527,6 +530,12 @@ func resourceVirtualEnvironmentVM() *schema.Resource { Optional: true, Default: dvResourceVirtualEnvironmentVMDiskIOThread, }, + mkResourceVirtualEnvironmentVMDiskDiscard: { + Type: schema.TypeString, + Description: "Whether to pass discard/trim requests to the underlying storage.", + Optional: true, + Default: dvResourceVirtualEnvironmentVMDiskDiscard, + }, mkResourceVirtualEnvironmentVMDiskSpeed: { Type: schema.TypeList, Description: "The speed limits", @@ -1805,6 +1814,7 @@ func resourceVirtualEnvironmentVMCreateCustomDisks(ctx context.Context, d *schem speed := block[mkResourceVirtualEnvironmentVMDiskSpeed].([]interface{}) diskInterface, _ := block[mkResourceVirtualEnvironmentVMDiskInterface].(string) ioThread := proxmox.CustomBool(block[mkResourceVirtualEnvironmentVMDiskIOThread].(bool)) + discard, _ := block[mkResourceVirtualEnvironmentVMDiskDiscard].(string) if len(speed) == 0 { diskSpeedDefault, err := diskSpeedResource.DefaultValue() @@ -1826,6 +1836,10 @@ func resourceVirtualEnvironmentVMCreateCustomDisks(ctx context.Context, d *schem diskOptions += ",iothread=1" } + if discard != "" { + diskOptions += fmt.Sprintf(",discard=%s", discard) + } + if speedLimitRead > 0 { diskOptions += fmt.Sprintf(",mbps_rd=%d", speedLimitRead) } @@ -2110,6 +2124,7 @@ func resourceVirtualEnvironmentVMGetDiskDeviceObjects(d *schema.ResourceData, di size, _ := block[mkResourceVirtualEnvironmentVMDiskSize].(int) diskInterface, _ := block[mkResourceVirtualEnvironmentVMDiskInterface].(string) ioThread := proxmox.CustomBool(block[mkResourceVirtualEnvironmentVMDiskIOThread].(bool)) + discard := block[mkResourceVirtualEnvironmentVMDiskDiscard].(string) speedBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMDisk, mkResourceVirtualEnvironmentVMDiskSpeed}, 0, false) @@ -2130,6 +2145,7 @@ func resourceVirtualEnvironmentVMGetDiskDeviceObjects(d *schema.ResourceData, di diskDevice.Size = &sizeString diskDevice.SizeInt = &size diskDevice.IOThread = &ioThread + diskDevice.Discard = &discard if len(speedBlock) > 0 { speedLimitRead := speedBlock[mkResourceVirtualEnvironmentVMDiskSpeedRead].(int) @@ -2637,6 +2653,12 @@ func resourceVirtualEnvironmentVMReadCustom(ctx context.Context, d *schema.Resou disk[mkResourceVirtualEnvironmentVMDiskIOThread] = false } + if dd.Discard != nil { + disk[mkResourceVirtualEnvironmentVMDiskDiscard] = *dd.Discard + } else { + disk[mkResourceVirtualEnvironmentVMDiskDiscard] = "" + } + diskMap[di] = disk }