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

Add serial_device argument to VM resource

This commit is contained in:
Dan Petersen 2020-01-11 16:39:08 +01:00
parent 844ef98ae6
commit 23466ab289
6 changed files with 135 additions and 3 deletions

View File

@ -1,3 +1,9 @@
## 0.3.0 (UNRELEASED)
ENHANCEMENTS:
* resource/virtual_environment_vm: Add `serial_device` argument
## 0.2.0
BREAKING CHANGES:

View File

@ -621,6 +621,10 @@ This resource doesn't expose any additional attributes.
* `wvista` - Windows Vista
* `wxp` - Windows XP
* `pool_id` - (Optional) The ID of a pool to assign the virtual machine to
* `serial_device` - (Optional) A serial device (multiple blocks supported)
* `device` - (Optional) The device (defaults to `socket`)
* `/dev/*` - A host serial device
* `socket` - A unix socket
* `started` - (Optional) Whether to start the virtual machine (defaults to `true`)
* `tablet_device` - (Optional) Whether to enable the USB tablet device (defaults to `true`)
* `vga` - (Optional) The VGA configuration

View File

@ -41,6 +41,9 @@ resource "proxmox_virtual_environment_vm" "example" {
}
pool_id = "${proxmox_virtual_environment_pool.example.id}"
serial_device {}
vm_id = 2038
connection {

View File

@ -59,6 +59,7 @@ const (
dvResourceVirtualEnvironmentVMNetworkDeviceVLANID = 0
dvResourceVirtualEnvironmentVMOperatingSystemType = "other"
dvResourceVirtualEnvironmentVMPoolID = ""
dvResourceVirtualEnvironmentVMSerialDeviceDevice = "socket"
dvResourceVirtualEnvironmentVMStarted = true
dvResourceVirtualEnvironmentVMTabletDevice = true
dvResourceVirtualEnvironmentVMVGAEnabled = true
@ -131,6 +132,8 @@ const (
mkResourceVirtualEnvironmentVMOperatingSystem = "operating_system"
mkResourceVirtualEnvironmentVMOperatingSystemType = "type"
mkResourceVirtualEnvironmentVMPoolID = "pool_id"
mkResourceVirtualEnvironmentVMSerialDevice = "serial_device"
mkResourceVirtualEnvironmentVMSerialDeviceDevice = "device"
mkResourceVirtualEnvironmentVMStarted = "started"
mkResourceVirtualEnvironmentVMTabletDevice = "tablet_device"
mkResourceVirtualEnvironmentVMVGA = "vga"
@ -757,6 +760,31 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
ForceNew: true,
Default: dvResourceVirtualEnvironmentVMPoolID,
},
mkResourceVirtualEnvironmentVMSerialDevice: &schema.Schema{
Type: schema.TypeList,
Description: "The serial devices",
Optional: true,
DefaultFunc: func() (interface{}, error) {
return []interface{}{
map[string]interface{}{
mkResourceVirtualEnvironmentVMSerialDeviceDevice: dvResourceVirtualEnvironmentVMSerialDeviceDevice,
},
}, nil
},
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
mkResourceVirtualEnvironmentVMSerialDeviceDevice: {
Type: schema.TypeString,
Description: "The device",
Optional: true,
Default: dvResourceVirtualEnvironmentVMSerialDeviceDevice,
ValidateFunc: resourceVirtualEnvironmentVMGetSerialDeviceValidator(),
},
},
},
MaxItems: 4,
MinItems: 0,
},
mkResourceVirtualEnvironmentVMStarted: {
Type: schema.TypeBool,
Description: "Whether to start the virtual machine",
@ -927,6 +955,13 @@ func resourceVirtualEnvironmentVMCreate(d *schema.ResourceData, m interface{}) e
operatingSystemType := operatingSystem[mkResourceVirtualEnvironmentVMOperatingSystemType].(string)
poolID := d.Get(mkResourceVirtualEnvironmentVMPoolID).(string)
serialDevices, err := resourceVirtualEnvironmentVMGetSerialDeviceList(d, m)
if err != nil {
return err
}
started := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMStarted).(bool))
tabletDevice := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMTabletDevice).(bool))
@ -1016,7 +1051,7 @@ func resourceVirtualEnvironmentVMCreate(d *schema.ResourceData, m interface{}) e
PoolID: &poolID,
SCSIDevices: diskDeviceObjects,
SCSIHardware: &scsiHardware,
SerialDevices: []string{"socket"},
SerialDevices: serialDevices,
SharedMemory: memorySharedObject,
StartOnBoot: &started,
TabletDeviceEnabled: &tabletDevice,
@ -1433,6 +1468,39 @@ func resourceVirtualEnvironmentVMGetOperatingSystemTypeValidator() schema.Schema
}, false)
}
func resourceVirtualEnvironmentVMGetSerialDeviceList(d *schema.ResourceData, m interface{}) (proxmox.CustomSerialDevices, error) {
device := d.Get(mkResourceVirtualEnvironmentVMSerialDevice).([]interface{})
list := make(proxmox.CustomSerialDevices, len(device))
for i, v := range device {
block := v.(map[string]interface{})
device, _ := block[mkResourceVirtualEnvironmentVMSerialDeviceDevice].(string)
list[i] = device
}
return list, nil
}
func resourceVirtualEnvironmentVMGetSerialDeviceValidator() schema.SchemaValidateFunc {
return func(i interface{}, k string) (s []string, es []error) {
v, ok := i.(string)
if !ok {
es = append(es, fmt.Errorf("expected type of %s to be string", k))
return
}
if !strings.HasPrefix(v, "/dev/") && v != "socket" {
es = append(es, fmt.Errorf("expected %s to be '/dev/*' or 'socket'", k))
return
}
return
}
}
func resourceVirtualEnvironmentVMGetVGADeviceObject(d *schema.ResourceData, m interface{}) (*proxmox.CustomVGADevice, error) {
resource := resourceVirtualEnvironmentVM()
@ -2027,6 +2095,31 @@ func resourceVirtualEnvironmentVMRead(d *schema.ResourceData, m interface{}) err
d.Set(mkResourceVirtualEnvironmentVMPoolID, *vmConfig.PoolID)
}
// Compare the serial devices to those stored in the state.
serialDevices := make([]interface{}, 4)
serialDevicesArray := []*string{
vmConfig.SerialDevice0,
vmConfig.SerialDevice1,
vmConfig.SerialDevice2,
vmConfig.SerialDevice3,
}
serialDevicesCount := 0
for sdi, sd := range serialDevicesArray {
m := map[string]interface{}{}
if sd != nil {
m[mkResourceVirtualEnvironmentVMSerialDeviceDevice] = *sd
serialDevicesCount = sdi + 1
} else {
m[mkResourceVirtualEnvironmentVMSerialDeviceDevice] = ""
}
serialDevices[sdi] = m
}
d.Set(mkResourceVirtualEnvironmentVMSerialDevice, serialDevices[:serialDevicesCount])
// Compare the VGA configuration to the one stored in the state.
vga := map[string]interface{}{}
@ -2403,6 +2496,17 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
rebootRequired = true
}
// Prepare the new serial devices.
if d.HasChange(mkResourceVirtualEnvironmentVMSerialDevice) {
body.SerialDevices, err = resourceVirtualEnvironmentVMGetSerialDeviceList(d, m)
if err != nil {
return err
}
rebootRequired = true
}
// Prepare the new VGA configuration.
if d.HasChange(mkResourceVirtualEnvironmentVMVGA) {
body.VGADevice, err = resourceVirtualEnvironmentVMGetVGADeviceObject(d, m)

View File

@ -41,6 +41,7 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) {
mkResourceVirtualEnvironmentVMNetworkDevice,
mkResourceVirtualEnvironmentVMOperatingSystem,
mkResourceVirtualEnvironmentVMPoolID,
mkResourceVirtualEnvironmentVMSerialDevice,
mkResourceVirtualEnvironmentVMStarted,
mkResourceVirtualEnvironmentVMTabletDevice,
mkResourceVirtualEnvironmentVMVMID,
@ -72,6 +73,7 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) {
mkResourceVirtualEnvironmentVMNetworkInterfaceNames,
mkResourceVirtualEnvironmentVMOperatingSystem,
mkResourceVirtualEnvironmentVMPoolID,
mkResourceVirtualEnvironmentVMSerialDevice,
mkResourceVirtualEnvironmentVMStarted,
mkResourceVirtualEnvironmentVMTabletDevice,
mkResourceVirtualEnvironmentVMVMID,
@ -94,6 +96,7 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) {
schema.TypeList,
schema.TypeList,
schema.TypeString,
schema.TypeList,
schema.TypeBool,
schema.TypeBool,
schema.TypeInt,
@ -357,6 +360,18 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) {
schema.TypeString,
})
serialDeviceSchema := testNestedSchemaExistence(t, s, mkResourceVirtualEnvironmentVMSerialDevice)
testOptionalArguments(t, serialDeviceSchema, []string{
mkResourceVirtualEnvironmentVMSerialDeviceDevice,
})
testSchemaValueTypes(t, serialDeviceSchema, []string{
mkResourceVirtualEnvironmentVMSerialDeviceDevice,
}, []schema.ValueType{
schema.TypeString,
})
vgaSchema := testNestedSchemaExistence(t, s, mkResourceVirtualEnvironmentVMVGA)
testOptionalArguments(t, vgaSchema, []string{

View File

@ -9,5 +9,5 @@ const (
TerraformProviderName = "terraform-provider-proxmox"
// TerraformProviderVersion specifies the version number.
TerraformProviderVersion = "0.2.0"
TerraformProviderVersion = "0.3.0"
)