0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-06-30 10:33:46 +00:00

Add support for "discard" disk option for VM (#128)

This commit is contained in:
Pavel Boldyrev 2022-09-28 19:13:41 -04:00 committed by GitHub
parent 769dea4c48
commit 42e0e725a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 2 deletions

View File

@ -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
# }

View File

@ -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]
}
}
}

View File

@ -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
}