From 8bd3fd7b1d71e37eeee2c222e4896b857a01cabf Mon Sep 17 00:00:00 2001 From: kaje783 <120482249+kaje783@users.noreply.github.com> Date: Sun, 15 Jan 2023 03:42:10 +0100 Subject: [PATCH] feat(vm): add support for "args" flag for VM (#205) * feat: add support for "args" flag for VM * switch from args to kvmarguments, update type * cosmetics: `kvmarguments` -> `kvm_arguments` also update doc to match description from the official PVE documentation. Co-authored-by: Pavel Boldyrev <627562+bpg@users.noreply.github.com> --- docs/resources/virtual_environment_vm.md | 1 + proxmox/virtual_environment_vm_types.go | 4 +- proxmoxtf/resource_virtual_environment_vm.go | 43 +++++++++++++++++++ .../resource_virtual_environment_vm_test.go | 2 + 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/docs/resources/virtual_environment_vm.md b/docs/resources/virtual_environment_vm.md index fa5e3ea3..45bae47c 100644 --- a/docs/resources/virtual_environment_vm.md +++ b/docs/resources/virtual_environment_vm.md @@ -255,6 +255,7 @@ output "ubuntu_vm_public_key" { * `sl` - Slovenian. * `sv` - Swedish. * `tr` - Turkish. +* `kvm_arguments` - (Optional) Arbitrary arguments passed to kvm. * `machine` - (Optional) The VM machine type (defaults to `i440fx`). * `i440fx` - Standard PC (i440FX + PIIX, 1996). * `q35` - Standard PC (Q35 + ICH9, 2009). diff --git a/proxmox/virtual_environment_vm_types.go b/proxmox/virtual_environment_vm_types.go index 8c00fce5..633abf4d 100644 --- a/proxmox/virtual_environment_vm_types.go +++ b/proxmox/virtual_environment_vm_types.go @@ -257,7 +257,7 @@ type VirtualEnvironmentVMCreateRequestBody struct { Hugepages *string `json:"hugepages,omitempty" url:"hugepages,omitempty"` IDEDevices CustomStorageDevices `json:"ide,omitempty" url:",omitempty"` KeyboardLayout *string `json:"keyboard,omitempty" url:"keyboard,omitempty"` - KVMArguments CustomLineBreakSeparatedList `json:"args,omitempty" url:"args,omitempty,space"` + KVMArguments *string `json:"args,omitempty" url:"args,omitempty,space"` KVMEnabled *CustomBool `json:"kvm,omitempty" url:"kvm,omitempty,int"` LocalTime *CustomBool `json:"localtime,omitempty" url:"localtime,omitempty,int"` Lock *string `json:"lock,omitempty" url:"lock,omitempty"` @@ -389,7 +389,7 @@ type VirtualEnvironmentVMGetResponseData struct { IPConfig6 *CustomCloudInitIPConfig `json:"ipconfig6,omitempty"` IPConfig7 *CustomCloudInitIPConfig `json:"ipconfig7,omitempty"` KeyboardLayout *string `json:"keyboard,omitempty"` - KVMArguments *CustomLineBreakSeparatedList `json:"args,omitempty"` + KVMArguments *string `json:"args,omitempty"` KVMEnabled *CustomBool `json:"kvm,omitempty"` LocalTime *CustomBool `json:"localtime,omitempty"` Lock *string `json:"lock,omitempty"` diff --git a/proxmoxtf/resource_virtual_environment_vm.go b/proxmoxtf/resource_virtual_environment_vm.go index f952209f..87d0e574 100644 --- a/proxmoxtf/resource_virtual_environment_vm.go +++ b/proxmoxtf/resource_virtual_environment_vm.go @@ -79,6 +79,7 @@ const ( dvResourceVirtualEnvironmentVMInitializationNetworkDataFileID = "" dvResourceVirtualEnvironmentVMInitializationType = "" dvResourceVirtualEnvironmentVMKeyboardLayout = "en-us" + dvResourceVirtualEnvironmentVMKVMArguments = "" dvResourceVirtualEnvironmentVMMachineType = "" dvResourceVirtualEnvironmentVMMemoryDedicated = 512 dvResourceVirtualEnvironmentVMMemoryFloating = 0 @@ -188,6 +189,7 @@ const ( mkResourceVirtualEnvironmentVMIPv4Addresses = "ipv4_addresses" mkResourceVirtualEnvironmentVMIPv6Addresses = "ipv6_addresses" mkResourceVirtualEnvironmentVMKeyboardLayout = "keyboard_layout" + mkResourceVirtualEnvironmentVMKVMArguments = "kvm_arguments" mkResourceVirtualEnvironmentVMMachine = "machine" mkResourceVirtualEnvironmentVMMACAddresses = "mac_addresses" mkResourceVirtualEnvironmentVMMemory = "memory" @@ -295,6 +297,12 @@ func resourceVirtualEnvironmentVM() *schema.Resource { MaxItems: 1, MinItems: 0, }, + mkResourceVirtualEnvironmentVMKVMArguments: { + Type: schema.TypeString, + Description: "The args implementation", + Optional: true, + Default: dvResourceVirtualEnvironmentVMKVMArguments, + }, mkResourceVirtualEnvironmentVMAudioDevice: { Type: schema.TypeList, Description: "The audio devices", @@ -1362,6 +1370,7 @@ func resourceVirtualEnvironmentVMCreateClone(ctx context.Context, d *schema.Reso } bios := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string) + kvmArguments := d.Get(mkResourceVirtualEnvironmentVMKVMArguments).(string) cdrom := d.Get(mkResourceVirtualEnvironmentVMCDROM).([]interface{}) cpu := d.Get(mkResourceVirtualEnvironmentVMCPU).([]interface{}) initialization := d.Get(mkResourceVirtualEnvironmentVMInitialization).([]interface{}) @@ -1403,6 +1412,10 @@ func resourceVirtualEnvironmentVMCreateClone(ctx context.Context, d *schema.Reso } } + if kvmArguments != dvResourceVirtualEnvironmentVMKVMArguments { + updateBody.KVMArguments = &kvmArguments + } + if bios != dvResourceVirtualEnvironmentVMBIOS { updateBody.BIOS = &bios } @@ -1742,6 +1755,8 @@ func resourceVirtualEnvironmentVMCreateCustom(ctx context.Context, d *schema.Res agentTrim := proxmox.CustomBool(agentBlock[mkResourceVirtualEnvironmentVMAgentTrim].(bool)) agentType := agentBlock[mkResourceVirtualEnvironmentVMAgentType].(string) + kvmArguments := d.Get(mkResourceVirtualEnvironmentVMKVMArguments).(string) + audioDevices, err := resourceVirtualEnvironmentVMGetAudioDeviceList(d) if err != nil { return diag.FromErr(err) @@ -1924,6 +1939,7 @@ func resourceVirtualEnvironmentVMCreateCustom(ctx context.Context, d *schema.Res FloatingMemory: &memoryFloating, IDEDevices: ideDevices, KeyboardLayout: &keyboardLayout, + KVMArguments: &kvmArguments, NetworkDevices: networkDeviceObjects, OSType: &operatingSystemType, PCIDevices: pciDeviceObjects, @@ -3239,6 +3255,15 @@ func resourceVirtualEnvironmentVMReadCustom(ctx context.Context, d *schema.Resou diags = append(diags, diag.FromErr(err)...) } + // Compare the operating system configuration to the one stored in the state. + kvmArguments := map[string]interface{}{} + + if vmConfig.KVMArguments != nil { + kvmArguments[mkResourceVirtualEnvironmentVMKVMArguments] = *vmConfig.KVMArguments + } else { + kvmArguments[mkResourceVirtualEnvironmentVMKVMArguments] = "" + } + // Compare the memory configuration to the one stored in the state. memory := map[string]interface{}{} @@ -3568,6 +3593,18 @@ func resourceVirtualEnvironmentVMReadPrimitiveValues(d *schema.ResourceData, vmC diags = append(diags, diag.FromErr(err)...) } + currentkvmArguments := d.Get(mkResourceVirtualEnvironmentVMKVMArguments).(string) + + if len(clone) == 0 || currentkvmArguments != dvResourceVirtualEnvironmentVMKVMArguments { + if vmConfig.KVMArguments != nil { + err = d.Set(mkResourceVirtualEnvironmentVMKVMArguments, *vmConfig.KVMArguments) + } else { + // Default value of "args" is "" according to the API documentation. + err = d.Set(mkResourceVirtualEnvironmentVMKVMArguments, "") + } + diags = append(diags, diag.FromErr(err)...) + } + currentBIOS := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string) if len(clone) == 0 || currentBIOS != dvResourceVirtualEnvironmentVMBIOS { @@ -3726,6 +3763,12 @@ func resourceVirtualEnvironmentVMUpdate(ctx context.Context, d *schema.ResourceD rebootRequired = true } + if d.HasChange(mkResourceVirtualEnvironmentVMKVMArguments) { + kvmArguments := d.Get(mkResourceVirtualEnvironmentVMKVMArguments).(string) + updateBody.KVMArguments = &kvmArguments + rebootRequired = true + } + if d.HasChange(mkResourceVirtualEnvironmentVMBIOS) { bios := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string) updateBody.BIOS = &bios diff --git a/proxmoxtf/resource_virtual_environment_vm_test.go b/proxmoxtf/resource_virtual_environment_vm_test.go index 7894dd9d..d1624597 100644 --- a/proxmoxtf/resource_virtual_environment_vm_test.go +++ b/proxmoxtf/resource_virtual_environment_vm_test.go @@ -40,6 +40,7 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) { mkResourceVirtualEnvironmentVMInitialization, mkResourceVirtualEnvironmentVMHostPCI, mkResourceVirtualEnvironmentVMKeyboardLayout, + mkResourceVirtualEnvironmentVMKVMArguments, mkResourceVirtualEnvironmentVMMachine, mkResourceVirtualEnvironmentVMMemory, mkResourceVirtualEnvironmentVMName, @@ -74,6 +75,7 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) { mkResourceVirtualEnvironmentVMIPv4Addresses: schema.TypeList, mkResourceVirtualEnvironmentVMIPv6Addresses: schema.TypeList, mkResourceVirtualEnvironmentVMKeyboardLayout: schema.TypeString, + mkResourceVirtualEnvironmentVMKVMArguments: schema.TypeString, mkResourceVirtualEnvironmentVMMachine: schema.TypeString, mkResourceVirtualEnvironmentVMMemory: schema.TypeList, mkResourceVirtualEnvironmentVMName: schema.TypeString,