diff --git a/docs/resources/virtual_environment_vm.md b/docs/resources/virtual_environment_vm.md index 068ee214..26f76ba9 100644 --- a/docs/resources/virtual_environment_vm.md +++ b/docs/resources/virtual_environment_vm.md @@ -386,6 +386,7 @@ output "ubuntu_vm_public_key" { - `vmxnet3` - VMware vmxnet3. - `mtu` - (Optional) Force MTU, for VirtIO only. Set to 1 to use the bridge MTU. Cannot be larger than the bridge MTU. + - `queues` - (Optional) The number of queues for VirtIO (1..64). - `rate_limit` - (Optional) The rate limit in megabytes per second. - `vlan_id` - (Optional) The VLAN identifier. - `node_name` - (Required) The name of the node to assign the virtual machine diff --git a/example/resource_virtual_environment_vm.tf b/example/resource_virtual_environment_vm.tf index 811302d4..1d1d50ee 100644 --- a/example/resource_virtual_environment_vm.tf +++ b/example/resource_virtual_environment_vm.tf @@ -11,7 +11,8 @@ resource "proxmox_virtual_environment_vm" "example_template" { description = "Managed by Terraform" cpu { - numa = true + cores = 2 + numa = true } smbios { @@ -81,7 +82,8 @@ resource "proxmox_virtual_environment_vm" "example_template" { name = "terraform-provider-proxmox-example-template" network_device { - mtu = 1450 + mtu = 1450 + queues = 2 } network_device { diff --git a/proxmoxtf/resource/vm.go b/proxmoxtf/resource/vm.go index f63c4306..94476f38 100644 --- a/proxmoxtf/resource/vm.go +++ b/proxmoxtf/resource/vm.go @@ -104,6 +104,7 @@ const ( dvResourceVirtualEnvironmentVMNetworkDeviceEnabled = true dvResourceVirtualEnvironmentVMNetworkDeviceFirewall = false dvResourceVirtualEnvironmentVMNetworkDeviceModel = "virtio" + dvResourceVirtualEnvironmentVMNetworkDeviceQueues = 0 dvResourceVirtualEnvironmentVMNetworkDeviceRateLimit = 0 dvResourceVirtualEnvironmentVMNetworkDeviceVLANID = 0 dvResourceVirtualEnvironmentVMNetworkDeviceMTU = 0 @@ -242,6 +243,7 @@ const ( mkResourceVirtualEnvironmentVMNetworkDeviceFirewall = "firewall" mkResourceVirtualEnvironmentVMNetworkDeviceMACAddress = "mac_address" mkResourceVirtualEnvironmentVMNetworkDeviceModel = "model" + mkResourceVirtualEnvironmentVMNetworkDeviceQueues = "queues" mkResourceVirtualEnvironmentVMNetworkDeviceRateLimit = "rate_limit" mkResourceVirtualEnvironmentVMNetworkDeviceVLANID = "vlan_id" mkResourceVirtualEnvironmentVMNetworkDeviceMTU = "mtu" @@ -1163,6 +1165,13 @@ func VM() *schema.Resource { Default: dvResourceVirtualEnvironmentVMNetworkDeviceModel, ValidateDiagFunc: validator.NetworkDeviceModel(), }, + mkResourceVirtualEnvironmentVMNetworkDeviceQueues: { + Type: schema.TypeInt, + Description: "Number of packet queues to be used on the device", + Optional: true, + Default: dvResourceVirtualEnvironmentVMNetworkDeviceQueues, + ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(0, 64)), + }, mkResourceVirtualEnvironmentVMNetworkDeviceRateLimit: { Type: schema.TypeFloat, Description: "The rate limit in megabytes per second", @@ -3212,6 +3221,7 @@ func vmGetNetworkDeviceObjects(d *schema.ResourceData) vms.CustomNetworkDevices firewall := types.CustomBool(block[mkResourceVirtualEnvironmentVMNetworkDeviceFirewall].(bool)) macAddress := block[mkResourceVirtualEnvironmentVMNetworkDeviceMACAddress].(string) model := block[mkResourceVirtualEnvironmentVMNetworkDeviceModel].(string) + queues := block[mkResourceVirtualEnvironmentVMNetworkDeviceQueues].(int) rateLimit := block[mkResourceVirtualEnvironmentVMNetworkDeviceRateLimit].(float64) vlanID := block[mkResourceVirtualEnvironmentVMNetworkDeviceVLANID].(int) mtu := block[mkResourceVirtualEnvironmentVMNetworkDeviceMTU].(int) @@ -3230,6 +3240,10 @@ func vmGetNetworkDeviceObjects(d *schema.ResourceData) vms.CustomNetworkDevices device.MACAddress = &macAddress } + if queues != 0 { + device.Queues = &queues + } + if rateLimit != 0 { device.RateLimit = &rateLimit } @@ -4305,6 +4319,12 @@ func vmReadCustom( networkDevice[mkResourceVirtualEnvironmentVMNetworkDeviceMACAddress] = macAddresses[ni] networkDevice[mkResourceVirtualEnvironmentVMNetworkDeviceModel] = nd.Model + if nd.Queues != nil { + networkDevice[mkResourceVirtualEnvironmentVMNetworkDeviceQueues] = *nd.Queues + } else { + networkDevice[mkResourceVirtualEnvironmentVMNetworkDeviceQueues] = 0 + } + if nd.RateLimit != nil { networkDevice[mkResourceVirtualEnvironmentVMNetworkDeviceRateLimit] = *nd.RateLimit } else {