0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-08-23 03:48:35 +00:00

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>
This commit is contained in:
kaje783 2023-01-15 03:42:10 +01:00 committed by GitHub
parent 9101977dc8
commit 8bd3fd7b1d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 2 deletions

View File

@ -255,6 +255,7 @@ output "ubuntu_vm_public_key" {
* `sl` - Slovenian. * `sl` - Slovenian.
* `sv` - Swedish. * `sv` - Swedish.
* `tr` - Turkish. * `tr` - Turkish.
* `kvm_arguments` - (Optional) Arbitrary arguments passed to kvm.
* `machine` - (Optional) The VM machine type (defaults to `i440fx`). * `machine` - (Optional) The VM machine type (defaults to `i440fx`).
* `i440fx` - Standard PC (i440FX + PIIX, 1996). * `i440fx` - Standard PC (i440FX + PIIX, 1996).
* `q35` - Standard PC (Q35 + ICH9, 2009). * `q35` - Standard PC (Q35 + ICH9, 2009).

View File

@ -257,7 +257,7 @@ type VirtualEnvironmentVMCreateRequestBody struct {
Hugepages *string `json:"hugepages,omitempty" url:"hugepages,omitempty"` Hugepages *string `json:"hugepages,omitempty" url:"hugepages,omitempty"`
IDEDevices CustomStorageDevices `json:"ide,omitempty" url:",omitempty"` IDEDevices CustomStorageDevices `json:"ide,omitempty" url:",omitempty"`
KeyboardLayout *string `json:"keyboard,omitempty" url:"keyboard,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"` KVMEnabled *CustomBool `json:"kvm,omitempty" url:"kvm,omitempty,int"`
LocalTime *CustomBool `json:"localtime,omitempty" url:"localtime,omitempty,int"` LocalTime *CustomBool `json:"localtime,omitempty" url:"localtime,omitempty,int"`
Lock *string `json:"lock,omitempty" url:"lock,omitempty"` Lock *string `json:"lock,omitempty" url:"lock,omitempty"`
@ -389,7 +389,7 @@ type VirtualEnvironmentVMGetResponseData struct {
IPConfig6 *CustomCloudInitIPConfig `json:"ipconfig6,omitempty"` IPConfig6 *CustomCloudInitIPConfig `json:"ipconfig6,omitempty"`
IPConfig7 *CustomCloudInitIPConfig `json:"ipconfig7,omitempty"` IPConfig7 *CustomCloudInitIPConfig `json:"ipconfig7,omitempty"`
KeyboardLayout *string `json:"keyboard,omitempty"` KeyboardLayout *string `json:"keyboard,omitempty"`
KVMArguments *CustomLineBreakSeparatedList `json:"args,omitempty"` KVMArguments *string `json:"args,omitempty"`
KVMEnabled *CustomBool `json:"kvm,omitempty"` KVMEnabled *CustomBool `json:"kvm,omitempty"`
LocalTime *CustomBool `json:"localtime,omitempty"` LocalTime *CustomBool `json:"localtime,omitempty"`
Lock *string `json:"lock,omitempty"` Lock *string `json:"lock,omitempty"`

View File

@ -79,6 +79,7 @@ const (
dvResourceVirtualEnvironmentVMInitializationNetworkDataFileID = "" dvResourceVirtualEnvironmentVMInitializationNetworkDataFileID = ""
dvResourceVirtualEnvironmentVMInitializationType = "" dvResourceVirtualEnvironmentVMInitializationType = ""
dvResourceVirtualEnvironmentVMKeyboardLayout = "en-us" dvResourceVirtualEnvironmentVMKeyboardLayout = "en-us"
dvResourceVirtualEnvironmentVMKVMArguments = ""
dvResourceVirtualEnvironmentVMMachineType = "" dvResourceVirtualEnvironmentVMMachineType = ""
dvResourceVirtualEnvironmentVMMemoryDedicated = 512 dvResourceVirtualEnvironmentVMMemoryDedicated = 512
dvResourceVirtualEnvironmentVMMemoryFloating = 0 dvResourceVirtualEnvironmentVMMemoryFloating = 0
@ -188,6 +189,7 @@ const (
mkResourceVirtualEnvironmentVMIPv4Addresses = "ipv4_addresses" mkResourceVirtualEnvironmentVMIPv4Addresses = "ipv4_addresses"
mkResourceVirtualEnvironmentVMIPv6Addresses = "ipv6_addresses" mkResourceVirtualEnvironmentVMIPv6Addresses = "ipv6_addresses"
mkResourceVirtualEnvironmentVMKeyboardLayout = "keyboard_layout" mkResourceVirtualEnvironmentVMKeyboardLayout = "keyboard_layout"
mkResourceVirtualEnvironmentVMKVMArguments = "kvm_arguments"
mkResourceVirtualEnvironmentVMMachine = "machine" mkResourceVirtualEnvironmentVMMachine = "machine"
mkResourceVirtualEnvironmentVMMACAddresses = "mac_addresses" mkResourceVirtualEnvironmentVMMACAddresses = "mac_addresses"
mkResourceVirtualEnvironmentVMMemory = "memory" mkResourceVirtualEnvironmentVMMemory = "memory"
@ -295,6 +297,12 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
MaxItems: 1, MaxItems: 1,
MinItems: 0, MinItems: 0,
}, },
mkResourceVirtualEnvironmentVMKVMArguments: {
Type: schema.TypeString,
Description: "The args implementation",
Optional: true,
Default: dvResourceVirtualEnvironmentVMKVMArguments,
},
mkResourceVirtualEnvironmentVMAudioDevice: { mkResourceVirtualEnvironmentVMAudioDevice: {
Type: schema.TypeList, Type: schema.TypeList,
Description: "The audio devices", Description: "The audio devices",
@ -1362,6 +1370,7 @@ func resourceVirtualEnvironmentVMCreateClone(ctx context.Context, d *schema.Reso
} }
bios := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string) bios := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string)
kvmArguments := d.Get(mkResourceVirtualEnvironmentVMKVMArguments).(string)
cdrom := d.Get(mkResourceVirtualEnvironmentVMCDROM).([]interface{}) cdrom := d.Get(mkResourceVirtualEnvironmentVMCDROM).([]interface{})
cpu := d.Get(mkResourceVirtualEnvironmentVMCPU).([]interface{}) cpu := d.Get(mkResourceVirtualEnvironmentVMCPU).([]interface{})
initialization := d.Get(mkResourceVirtualEnvironmentVMInitialization).([]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 { if bios != dvResourceVirtualEnvironmentVMBIOS {
updateBody.BIOS = &bios updateBody.BIOS = &bios
} }
@ -1742,6 +1755,8 @@ func resourceVirtualEnvironmentVMCreateCustom(ctx context.Context, d *schema.Res
agentTrim := proxmox.CustomBool(agentBlock[mkResourceVirtualEnvironmentVMAgentTrim].(bool)) agentTrim := proxmox.CustomBool(agentBlock[mkResourceVirtualEnvironmentVMAgentTrim].(bool))
agentType := agentBlock[mkResourceVirtualEnvironmentVMAgentType].(string) agentType := agentBlock[mkResourceVirtualEnvironmentVMAgentType].(string)
kvmArguments := d.Get(mkResourceVirtualEnvironmentVMKVMArguments).(string)
audioDevices, err := resourceVirtualEnvironmentVMGetAudioDeviceList(d) audioDevices, err := resourceVirtualEnvironmentVMGetAudioDeviceList(d)
if err != nil { if err != nil {
return diag.FromErr(err) return diag.FromErr(err)
@ -1924,6 +1939,7 @@ func resourceVirtualEnvironmentVMCreateCustom(ctx context.Context, d *schema.Res
FloatingMemory: &memoryFloating, FloatingMemory: &memoryFloating,
IDEDevices: ideDevices, IDEDevices: ideDevices,
KeyboardLayout: &keyboardLayout, KeyboardLayout: &keyboardLayout,
KVMArguments: &kvmArguments,
NetworkDevices: networkDeviceObjects, NetworkDevices: networkDeviceObjects,
OSType: &operatingSystemType, OSType: &operatingSystemType,
PCIDevices: pciDeviceObjects, PCIDevices: pciDeviceObjects,
@ -3239,6 +3255,15 @@ func resourceVirtualEnvironmentVMReadCustom(ctx context.Context, d *schema.Resou
diags = append(diags, diag.FromErr(err)...) 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. // Compare the memory configuration to the one stored in the state.
memory := map[string]interface{}{} memory := map[string]interface{}{}
@ -3568,6 +3593,18 @@ func resourceVirtualEnvironmentVMReadPrimitiveValues(d *schema.ResourceData, vmC
diags = append(diags, diag.FromErr(err)...) 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) currentBIOS := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string)
if len(clone) == 0 || currentBIOS != dvResourceVirtualEnvironmentVMBIOS { if len(clone) == 0 || currentBIOS != dvResourceVirtualEnvironmentVMBIOS {
@ -3726,6 +3763,12 @@ func resourceVirtualEnvironmentVMUpdate(ctx context.Context, d *schema.ResourceD
rebootRequired = true rebootRequired = true
} }
if d.HasChange(mkResourceVirtualEnvironmentVMKVMArguments) {
kvmArguments := d.Get(mkResourceVirtualEnvironmentVMKVMArguments).(string)
updateBody.KVMArguments = &kvmArguments
rebootRequired = true
}
if d.HasChange(mkResourceVirtualEnvironmentVMBIOS) { if d.HasChange(mkResourceVirtualEnvironmentVMBIOS) {
bios := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string) bios := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string)
updateBody.BIOS = &bios updateBody.BIOS = &bios

View File

@ -40,6 +40,7 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) {
mkResourceVirtualEnvironmentVMInitialization, mkResourceVirtualEnvironmentVMInitialization,
mkResourceVirtualEnvironmentVMHostPCI, mkResourceVirtualEnvironmentVMHostPCI,
mkResourceVirtualEnvironmentVMKeyboardLayout, mkResourceVirtualEnvironmentVMKeyboardLayout,
mkResourceVirtualEnvironmentVMKVMArguments,
mkResourceVirtualEnvironmentVMMachine, mkResourceVirtualEnvironmentVMMachine,
mkResourceVirtualEnvironmentVMMemory, mkResourceVirtualEnvironmentVMMemory,
mkResourceVirtualEnvironmentVMName, mkResourceVirtualEnvironmentVMName,
@ -74,6 +75,7 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) {
mkResourceVirtualEnvironmentVMIPv4Addresses: schema.TypeList, mkResourceVirtualEnvironmentVMIPv4Addresses: schema.TypeList,
mkResourceVirtualEnvironmentVMIPv6Addresses: schema.TypeList, mkResourceVirtualEnvironmentVMIPv6Addresses: schema.TypeList,
mkResourceVirtualEnvironmentVMKeyboardLayout: schema.TypeString, mkResourceVirtualEnvironmentVMKeyboardLayout: schema.TypeString,
mkResourceVirtualEnvironmentVMKVMArguments: schema.TypeString,
mkResourceVirtualEnvironmentVMMachine: schema.TypeString, mkResourceVirtualEnvironmentVMMachine: schema.TypeString,
mkResourceVirtualEnvironmentVMMemory: schema.TypeList, mkResourceVirtualEnvironmentVMMemory: schema.TypeList,
mkResourceVirtualEnvironmentVMName: schema.TypeString, mkResourceVirtualEnvironmentVMName: schema.TypeString,