From 347b55320229068cf632658825035c7d5309f98a Mon Sep 17 00:00:00 2001 From: Dan Petersen Date: Tue, 31 Dec 2019 07:40:18 +0100 Subject: [PATCH] Add bios argument to VM resource --- CHANGELOG.md | 1 + README.md | 3 ++ proxmoxtf/resource_virtual_environment_vm.go | 38 ++++++++++++++++--- .../resource_virtual_environment_vm_test.go | 5 +++ proxmoxtf/utils.go | 7 ++++ 5 files changed, 49 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01f9a20f..f512214b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ENHANCEMENTS: * resource/virtual_environment_vm: Add `acpi` argument +* resource/virtual_environment_vm: Add `bios` argument * resource/virtual_environment_vm: Add `cpu.flags`, `cpu.type` and `cpu.units` arguments * resource/virtual_environment_vm: Add `tablet_device` argument * resource/virtual_environment_vm: Add `vga` argument diff --git a/README.md b/README.md index 69ff3e03..2878933a 100644 --- a/README.md +++ b/README.md @@ -339,6 +339,9 @@ This resource doesn't expose any additional attributes. * `type` - (Optional) The QEMU agent interface type (defaults to `virtio`) * `isa` - ISA Serial Port * `virtio` - VirtIO (paravirtualized) +* `bios` - (Optional) The BIOS implementation (defaults to `seabios`) + * `ovmf` - OVMF (UEFI) + * `seabios` - SeaBIOS * `cdrom` - (Optional) The CDROM configuration * `enabled` - (Optional) Whether to enable the CDROM drive (defaults to `false`) * `file_id` - (Optional) A file ID for an ISO file (defaults to `cdrom` as in the physical drive) diff --git a/proxmoxtf/resource_virtual_environment_vm.go b/proxmoxtf/resource_virtual_environment_vm.go index aecf228c..9f96ad39 100644 --- a/proxmoxtf/resource_virtual_environment_vm.go +++ b/proxmoxtf/resource_virtual_environment_vm.go @@ -20,6 +20,7 @@ const ( dvResourceVirtualEnvironmentVMAgentEnabled = false dvResourceVirtualEnvironmentVMAgentTrim = false dvResourceVirtualEnvironmentVMAgentType = "virtio" + dvResourceVirtualEnvironmentVMBIOS = "seabios" dvResourceVirtualEnvironmentVMCDROMEnabled = false dvResourceVirtualEnvironmentVMCDROMFileID = "" dvResourceVirtualEnvironmentVMCloudInitDNSDomain = "" @@ -65,6 +66,7 @@ const ( mkResourceVirtualEnvironmentVMAgentEnabled = "enabled" mkResourceVirtualEnvironmentVMAgentTrim = "trim" mkResourceVirtualEnvironmentVMAgentType = "type" + mkResourceVirtualEnvironmentVMBIOS = "bios" mkResourceVirtualEnvironmentVMCDROM = "cdrom" mkResourceVirtualEnvironmentVMCDROMEnabled = "enabled" mkResourceVirtualEnvironmentVMCDROMFileID = "file_id" @@ -182,6 +184,13 @@ func resourceVirtualEnvironmentVM() *schema.Resource { MaxItems: 1, MinItems: 0, }, + mkResourceVirtualEnvironmentVMBIOS: { + Type: schema.TypeString, + Description: "The BIOS implementation", + Optional: true, + Default: dvResourceVirtualEnvironmentVMBIOS, + ValidateFunc: getBIOSValidator(), + }, mkResourceVirtualEnvironmentVMCDROM: &schema.Schema{ Type: schema.TypeList, Description: "The CDROM drive", @@ -804,6 +813,8 @@ func resourceVirtualEnvironmentVMCreate(d *schema.ResourceData, m interface{}) e agentTrim := proxmox.CustomBool(agentBlock[mkResourceVirtualEnvironmentVMAgentTrim].(bool)) agentType := agentBlock[mkResourceVirtualEnvironmentVMAgentType].(string) + bios := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string) + cdromBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMCDROM}, 0, true) if err != nil { @@ -938,6 +949,7 @@ func resourceVirtualEnvironmentVMCreate(d *schema.ResourceData, m interface{}) e TrimClonedDisks: &agentTrim, Type: &agentType, }, + BIOS: &bios, BootDisk: &bootDisk, BootOrder: &bootOrder, CloudInitConfig: cloudInitConfig, @@ -1414,7 +1426,15 @@ func resourceVirtualEnvironmentVMRead(d *schema.ResourceData, m interface{}) err if vmConfig.ACPI != nil { d.Set(mkResourceVirtualEnvironmentVMACPI, bool(*vmConfig.ACPI)) } else { - d.Set(mkResourceVirtualEnvironmentVMACPI, false) + // Default value of "acpi" is "1" according to the API documentation. + d.Set(mkResourceVirtualEnvironmentVMACPI, true) + } + + if vmConfig.BIOS != nil { + d.Set(mkResourceVirtualEnvironmentVMBIOS, *vmConfig.BIOS) + } else { + // Default value of "bios" is "seabios" according to the API documentation. + d.Set(mkResourceVirtualEnvironmentVMBIOS, "seabios") } if vmConfig.Description != nil { @@ -1432,7 +1452,8 @@ func resourceVirtualEnvironmentVMRead(d *schema.ResourceData, m interface{}) err if vmConfig.TabletDeviceEnabled != nil { d.Set(mkResourceVirtualEnvironmentVMTabletDevice, bool(*vmConfig.TabletDeviceEnabled)) } else { - d.Set(mkResourceVirtualEnvironmentVMTabletDevice, false) + // Default value of "tablet" is "1" according to the API documentation. + d.Set(mkResourceVirtualEnvironmentVMTabletDevice, true) } // Compare the agent configuration to the one stored in the state. @@ -1631,19 +1652,22 @@ func resourceVirtualEnvironmentVMRead(d *schema.ResourceData, m interface{}) err if vmConfig.CPUCores != nil { cpu[mkResourceVirtualEnvironmentVMCPUCores] = *vmConfig.CPUCores } else { - cpu[mkResourceVirtualEnvironmentVMCPUCores] = 0 + // Default value of "cores" is "1" according to the API documentation. + cpu[mkResourceVirtualEnvironmentVMCPUCores] = 1 } if vmConfig.VirtualCPUCount != nil { cpu[mkResourceVirtualEnvironmentVMCPUHotplugged] = *vmConfig.VirtualCPUCount } else { + // Default value of "vcpus" is "1" according to the API documentation. cpu[mkResourceVirtualEnvironmentVMCPUHotplugged] = 0 } if vmConfig.CPUSockets != nil { cpu[mkResourceVirtualEnvironmentVMCPUSockets] = *vmConfig.CPUSockets } else { - cpu[mkResourceVirtualEnvironmentVMCPUSockets] = 0 + // Default value of "sockets" is "1" according to the API documentation. + cpu[mkResourceVirtualEnvironmentVMCPUSockets] = 1 } if vmConfig.CPUEmulation != nil { @@ -1668,7 +1692,8 @@ func resourceVirtualEnvironmentVMRead(d *schema.ResourceData, m interface{}) err if vmConfig.CPUUnits != nil { cpu[mkResourceVirtualEnvironmentVMCPUUnits] = *vmConfig.CPUUnits } else { - cpu[mkResourceVirtualEnvironmentVMCPUUnits] = 0 + // Default value of "cpuunits" is "1024" according to the API documentation. + cpu[mkResourceVirtualEnvironmentVMCPUUnits] = 1024 } currentCPU := d.Get(mkResourceVirtualEnvironmentVMCPU).([]interface{}) @@ -2045,6 +2070,7 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e // Prepare the new primitive configuration values. acpi := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMACPI).(bool)) + bios := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string) delete := []string{} description := d.Get(mkResourceVirtualEnvironmentVMDescription).(string) keyboardLayout := d.Get(mkResourceVirtualEnvironmentVMKeyboardLayout).(string) @@ -2053,6 +2079,7 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e tabletDevice := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMTabletDevice).(bool)) body.ACPI = &acpi + body.BIOS = &bios if description != "" { body.Description = &description @@ -2068,6 +2095,7 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e body.TabletDeviceEnabled = &tabletDevice if d.HasChange(mkResourceVirtualEnvironmentVMACPI) || + d.HasChange(mkResourceVirtualEnvironmentVMBIOS) || d.HasChange(mkResourceVirtualEnvironmentVMKeyboardLayout) || d.HasChange(mkResourceVirtualEnvironmentVMOSType) || d.HasChange(mkResourceVirtualEnvironmentVMTabletDevice) { diff --git a/proxmoxtf/resource_virtual_environment_vm_test.go b/proxmoxtf/resource_virtual_environment_vm_test.go index 013980c4..acff0c41 100644 --- a/proxmoxtf/resource_virtual_environment_vm_test.go +++ b/proxmoxtf/resource_virtual_environment_vm_test.go @@ -29,6 +29,7 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) { testOptionalArguments(t, s, []string{ mkResourceVirtualEnvironmentVMACPI, + mkResourceVirtualEnvironmentVMBIOS, mkResourceVirtualEnvironmentVMCDROM, mkResourceVirtualEnvironmentVMCloudInit, mkResourceVirtualEnvironmentVMCPU, @@ -54,6 +55,8 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) { testSchemaValueTypes(t, s, []string{ mkResourceVirtualEnvironmentVMACPI, + mkResourceVirtualEnvironmentVMAgent, + mkResourceVirtualEnvironmentVMBIOS, mkResourceVirtualEnvironmentVMCDROM, mkResourceVirtualEnvironmentVMCloudInit, mkResourceVirtualEnvironmentVMCPU, @@ -75,6 +78,8 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) { }, []schema.ValueType{ schema.TypeBool, schema.TypeList, + schema.TypeString, + schema.TypeList, schema.TypeList, schema.TypeList, schema.TypeString, diff --git a/proxmoxtf/utils.go b/proxmoxtf/utils.go index 8f04c35e..ebf4e762 100644 --- a/proxmoxtf/utils.go +++ b/proxmoxtf/utils.go @@ -13,6 +13,13 @@ import ( "github.com/hashicorp/terraform/helper/validation" ) +func getBIOSValidator() schema.SchemaValidateFunc { + return validation.StringInSlice([]string{ + "ovmf", + "seabios", + }, false) +} + func getContentTypeValidator() schema.SchemaValidateFunc { return validation.StringInSlice([]string{ "backup",