0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-07-03 03:52:58 +00:00

Add bios argument to VM resource

This commit is contained in:
Dan Petersen 2019-12-31 07:40:18 +01:00
parent 073030965a
commit 347b553202
5 changed files with 49 additions and 5 deletions

View File

@ -3,6 +3,7 @@
ENHANCEMENTS: ENHANCEMENTS:
* resource/virtual_environment_vm: Add `acpi` argument * 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 `cpu.flags`, `cpu.type` and `cpu.units` arguments
* resource/virtual_environment_vm: Add `tablet_device` argument * resource/virtual_environment_vm: Add `tablet_device` argument
* resource/virtual_environment_vm: Add `vga` argument * resource/virtual_environment_vm: Add `vga` argument

View File

@ -339,6 +339,9 @@ This resource doesn't expose any additional attributes.
* `type` - (Optional) The QEMU agent interface type (defaults to `virtio`) * `type` - (Optional) The QEMU agent interface type (defaults to `virtio`)
* `isa` - ISA Serial Port * `isa` - ISA Serial Port
* `virtio` - VirtIO (paravirtualized) * `virtio` - VirtIO (paravirtualized)
* `bios` - (Optional) The BIOS implementation (defaults to `seabios`)
* `ovmf` - OVMF (UEFI)
* `seabios` - SeaBIOS
* `cdrom` - (Optional) The CDROM configuration * `cdrom` - (Optional) The CDROM configuration
* `enabled` - (Optional) Whether to enable the CDROM drive (defaults to `false`) * `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) * `file_id` - (Optional) A file ID for an ISO file (defaults to `cdrom` as in the physical drive)

View File

@ -20,6 +20,7 @@ const (
dvResourceVirtualEnvironmentVMAgentEnabled = false dvResourceVirtualEnvironmentVMAgentEnabled = false
dvResourceVirtualEnvironmentVMAgentTrim = false dvResourceVirtualEnvironmentVMAgentTrim = false
dvResourceVirtualEnvironmentVMAgentType = "virtio" dvResourceVirtualEnvironmentVMAgentType = "virtio"
dvResourceVirtualEnvironmentVMBIOS = "seabios"
dvResourceVirtualEnvironmentVMCDROMEnabled = false dvResourceVirtualEnvironmentVMCDROMEnabled = false
dvResourceVirtualEnvironmentVMCDROMFileID = "" dvResourceVirtualEnvironmentVMCDROMFileID = ""
dvResourceVirtualEnvironmentVMCloudInitDNSDomain = "" dvResourceVirtualEnvironmentVMCloudInitDNSDomain = ""
@ -65,6 +66,7 @@ const (
mkResourceVirtualEnvironmentVMAgentEnabled = "enabled" mkResourceVirtualEnvironmentVMAgentEnabled = "enabled"
mkResourceVirtualEnvironmentVMAgentTrim = "trim" mkResourceVirtualEnvironmentVMAgentTrim = "trim"
mkResourceVirtualEnvironmentVMAgentType = "type" mkResourceVirtualEnvironmentVMAgentType = "type"
mkResourceVirtualEnvironmentVMBIOS = "bios"
mkResourceVirtualEnvironmentVMCDROM = "cdrom" mkResourceVirtualEnvironmentVMCDROM = "cdrom"
mkResourceVirtualEnvironmentVMCDROMEnabled = "enabled" mkResourceVirtualEnvironmentVMCDROMEnabled = "enabled"
mkResourceVirtualEnvironmentVMCDROMFileID = "file_id" mkResourceVirtualEnvironmentVMCDROMFileID = "file_id"
@ -182,6 +184,13 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
MaxItems: 1, MaxItems: 1,
MinItems: 0, MinItems: 0,
}, },
mkResourceVirtualEnvironmentVMBIOS: {
Type: schema.TypeString,
Description: "The BIOS implementation",
Optional: true,
Default: dvResourceVirtualEnvironmentVMBIOS,
ValidateFunc: getBIOSValidator(),
},
mkResourceVirtualEnvironmentVMCDROM: &schema.Schema{ mkResourceVirtualEnvironmentVMCDROM: &schema.Schema{
Type: schema.TypeList, Type: schema.TypeList,
Description: "The CDROM drive", Description: "The CDROM drive",
@ -804,6 +813,8 @@ func resourceVirtualEnvironmentVMCreate(d *schema.ResourceData, m interface{}) e
agentTrim := proxmox.CustomBool(agentBlock[mkResourceVirtualEnvironmentVMAgentTrim].(bool)) agentTrim := proxmox.CustomBool(agentBlock[mkResourceVirtualEnvironmentVMAgentTrim].(bool))
agentType := agentBlock[mkResourceVirtualEnvironmentVMAgentType].(string) agentType := agentBlock[mkResourceVirtualEnvironmentVMAgentType].(string)
bios := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string)
cdromBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMCDROM}, 0, true) cdromBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMCDROM}, 0, true)
if err != nil { if err != nil {
@ -938,6 +949,7 @@ func resourceVirtualEnvironmentVMCreate(d *schema.ResourceData, m interface{}) e
TrimClonedDisks: &agentTrim, TrimClonedDisks: &agentTrim,
Type: &agentType, Type: &agentType,
}, },
BIOS: &bios,
BootDisk: &bootDisk, BootDisk: &bootDisk,
BootOrder: &bootOrder, BootOrder: &bootOrder,
CloudInitConfig: cloudInitConfig, CloudInitConfig: cloudInitConfig,
@ -1414,7 +1426,15 @@ func resourceVirtualEnvironmentVMRead(d *schema.ResourceData, m interface{}) err
if vmConfig.ACPI != nil { if vmConfig.ACPI != nil {
d.Set(mkResourceVirtualEnvironmentVMACPI, bool(*vmConfig.ACPI)) d.Set(mkResourceVirtualEnvironmentVMACPI, bool(*vmConfig.ACPI))
} else { } 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 { if vmConfig.Description != nil {
@ -1432,7 +1452,8 @@ func resourceVirtualEnvironmentVMRead(d *schema.ResourceData, m interface{}) err
if vmConfig.TabletDeviceEnabled != nil { if vmConfig.TabletDeviceEnabled != nil {
d.Set(mkResourceVirtualEnvironmentVMTabletDevice, bool(*vmConfig.TabletDeviceEnabled)) d.Set(mkResourceVirtualEnvironmentVMTabletDevice, bool(*vmConfig.TabletDeviceEnabled))
} else { } 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. // 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 { if vmConfig.CPUCores != nil {
cpu[mkResourceVirtualEnvironmentVMCPUCores] = *vmConfig.CPUCores cpu[mkResourceVirtualEnvironmentVMCPUCores] = *vmConfig.CPUCores
} else { } else {
cpu[mkResourceVirtualEnvironmentVMCPUCores] = 0 // Default value of "cores" is "1" according to the API documentation.
cpu[mkResourceVirtualEnvironmentVMCPUCores] = 1
} }
if vmConfig.VirtualCPUCount != nil { if vmConfig.VirtualCPUCount != nil {
cpu[mkResourceVirtualEnvironmentVMCPUHotplugged] = *vmConfig.VirtualCPUCount cpu[mkResourceVirtualEnvironmentVMCPUHotplugged] = *vmConfig.VirtualCPUCount
} else { } else {
// Default value of "vcpus" is "1" according to the API documentation.
cpu[mkResourceVirtualEnvironmentVMCPUHotplugged] = 0 cpu[mkResourceVirtualEnvironmentVMCPUHotplugged] = 0
} }
if vmConfig.CPUSockets != nil { if vmConfig.CPUSockets != nil {
cpu[mkResourceVirtualEnvironmentVMCPUSockets] = *vmConfig.CPUSockets cpu[mkResourceVirtualEnvironmentVMCPUSockets] = *vmConfig.CPUSockets
} else { } else {
cpu[mkResourceVirtualEnvironmentVMCPUSockets] = 0 // Default value of "sockets" is "1" according to the API documentation.
cpu[mkResourceVirtualEnvironmentVMCPUSockets] = 1
} }
if vmConfig.CPUEmulation != nil { if vmConfig.CPUEmulation != nil {
@ -1668,7 +1692,8 @@ func resourceVirtualEnvironmentVMRead(d *schema.ResourceData, m interface{}) err
if vmConfig.CPUUnits != nil { if vmConfig.CPUUnits != nil {
cpu[mkResourceVirtualEnvironmentVMCPUUnits] = *vmConfig.CPUUnits cpu[mkResourceVirtualEnvironmentVMCPUUnits] = *vmConfig.CPUUnits
} else { } else {
cpu[mkResourceVirtualEnvironmentVMCPUUnits] = 0 // Default value of "cpuunits" is "1024" according to the API documentation.
cpu[mkResourceVirtualEnvironmentVMCPUUnits] = 1024
} }
currentCPU := d.Get(mkResourceVirtualEnvironmentVMCPU).([]interface{}) currentCPU := d.Get(mkResourceVirtualEnvironmentVMCPU).([]interface{})
@ -2045,6 +2070,7 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Prepare the new primitive configuration values. // Prepare the new primitive configuration values.
acpi := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMACPI).(bool)) acpi := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMACPI).(bool))
bios := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string)
delete := []string{} delete := []string{}
description := d.Get(mkResourceVirtualEnvironmentVMDescription).(string) description := d.Get(mkResourceVirtualEnvironmentVMDescription).(string)
keyboardLayout := d.Get(mkResourceVirtualEnvironmentVMKeyboardLayout).(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)) tabletDevice := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMTabletDevice).(bool))
body.ACPI = &acpi body.ACPI = &acpi
body.BIOS = &bios
if description != "" { if description != "" {
body.Description = &description body.Description = &description
@ -2068,6 +2095,7 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
body.TabletDeviceEnabled = &tabletDevice body.TabletDeviceEnabled = &tabletDevice
if d.HasChange(mkResourceVirtualEnvironmentVMACPI) || if d.HasChange(mkResourceVirtualEnvironmentVMACPI) ||
d.HasChange(mkResourceVirtualEnvironmentVMBIOS) ||
d.HasChange(mkResourceVirtualEnvironmentVMKeyboardLayout) || d.HasChange(mkResourceVirtualEnvironmentVMKeyboardLayout) ||
d.HasChange(mkResourceVirtualEnvironmentVMOSType) || d.HasChange(mkResourceVirtualEnvironmentVMOSType) ||
d.HasChange(mkResourceVirtualEnvironmentVMTabletDevice) { d.HasChange(mkResourceVirtualEnvironmentVMTabletDevice) {

View File

@ -29,6 +29,7 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) {
testOptionalArguments(t, s, []string{ testOptionalArguments(t, s, []string{
mkResourceVirtualEnvironmentVMACPI, mkResourceVirtualEnvironmentVMACPI,
mkResourceVirtualEnvironmentVMBIOS,
mkResourceVirtualEnvironmentVMCDROM, mkResourceVirtualEnvironmentVMCDROM,
mkResourceVirtualEnvironmentVMCloudInit, mkResourceVirtualEnvironmentVMCloudInit,
mkResourceVirtualEnvironmentVMCPU, mkResourceVirtualEnvironmentVMCPU,
@ -54,6 +55,8 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) {
testSchemaValueTypes(t, s, []string{ testSchemaValueTypes(t, s, []string{
mkResourceVirtualEnvironmentVMACPI, mkResourceVirtualEnvironmentVMACPI,
mkResourceVirtualEnvironmentVMAgent,
mkResourceVirtualEnvironmentVMBIOS,
mkResourceVirtualEnvironmentVMCDROM, mkResourceVirtualEnvironmentVMCDROM,
mkResourceVirtualEnvironmentVMCloudInit, mkResourceVirtualEnvironmentVMCloudInit,
mkResourceVirtualEnvironmentVMCPU, mkResourceVirtualEnvironmentVMCPU,
@ -75,6 +78,8 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) {
}, []schema.ValueType{ }, []schema.ValueType{
schema.TypeBool, schema.TypeBool,
schema.TypeList, schema.TypeList,
schema.TypeString,
schema.TypeList,
schema.TypeList, schema.TypeList,
schema.TypeList, schema.TypeList,
schema.TypeString, schema.TypeString,

View File

@ -13,6 +13,13 @@ import (
"github.com/hashicorp/terraform/helper/validation" "github.com/hashicorp/terraform/helper/validation"
) )
func getBIOSValidator() schema.SchemaValidateFunc {
return validation.StringInSlice([]string{
"ovmf",
"seabios",
}, false)
}
func getContentTypeValidator() schema.SchemaValidateFunc { func getContentTypeValidator() schema.SchemaValidateFunc {
return validation.StringInSlice([]string{ return validation.StringInSlice([]string{
"backup", "backup",