mirror of
https://github.com/bpg/terraform-provider-proxmox.git
synced 2025-08-23 03:48:35 +00:00
Continued work on VM resource
This commit is contained in:
parent
478631ce80
commit
b2713e4e63
@ -5,6 +5,7 @@
|
|||||||
package proxmox
|
package proxmox
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
@ -288,7 +289,9 @@ type VirtualEnvironmentVMGetResponseData struct {
|
|||||||
HookScript *string `json:"hookscript,omitempty"`
|
HookScript *string `json:"hookscript,omitempty"`
|
||||||
Hotplug *CustomCommaSeparatedList `json:"hotplug,omitempty"`
|
Hotplug *CustomCommaSeparatedList `json:"hotplug,omitempty"`
|
||||||
Hugepages *string `json:"hugepages,omitempty"`
|
Hugepages *string `json:"hugepages,omitempty"`
|
||||||
IDEDevices *CustomStorageDevices `json:"ide,omitempty"`
|
IDEDevice0 *CustomStorageDevice `json:"ide0,omitempty"`
|
||||||
|
IDEDevice1 *CustomStorageDevice `json:"ide1,omitempty"`
|
||||||
|
IDEDevice2 *CustomStorageDevice `json:"ide2,omitempty"`
|
||||||
KeyboardLayout *string `json:"keyboard,omitempty"`
|
KeyboardLayout *string `json:"keyboard,omitempty"`
|
||||||
KVMArguments *CustomLineBreakSeparatedList `json:"args,omitempty"`
|
KVMArguments *CustomLineBreakSeparatedList `json:"args,omitempty"`
|
||||||
KVMEnabled *CustomBool `json:"kvm,omitempty"`
|
KVMEnabled *CustomBool `json:"kvm,omitempty"`
|
||||||
@ -298,15 +301,41 @@ type VirtualEnvironmentVMGetResponseData struct {
|
|||||||
MigrateDowntime *float64 `json:"migrate_downtime,omitempty"`
|
MigrateDowntime *float64 `json:"migrate_downtime,omitempty"`
|
||||||
MigrateSpeed *int `json:"migrate_speed,omitempty"`
|
MigrateSpeed *int `json:"migrate_speed,omitempty"`
|
||||||
Name *string `json:"name,omitempty"`
|
Name *string `json:"name,omitempty"`
|
||||||
NetworkDevices *CustomNetworkDevices `json:"net,omitempty"`
|
NetworkDevice0 *CustomNetworkDevice `json:"net0,omitempty"`
|
||||||
|
NetworkDevice1 *CustomNetworkDevice `json:"net1,omitempty"`
|
||||||
|
NetworkDevice2 *CustomNetworkDevice `json:"net2,omitempty"`
|
||||||
|
NetworkDevice3 *CustomNetworkDevice `json:"net3,omitempty"`
|
||||||
|
NetworkDevice4 *CustomNetworkDevice `json:"net4,omitempty"`
|
||||||
|
NetworkDevice5 *CustomNetworkDevice `json:"net5,omitempty"`
|
||||||
|
NetworkDevice6 *CustomNetworkDevice `json:"net6,omitempty"`
|
||||||
|
NetworkDevice7 *CustomNetworkDevice `json:"net7,omitempty"`
|
||||||
NUMADevices *CustomNUMADevices `json:"numa_devices,omitempty"`
|
NUMADevices *CustomNUMADevices `json:"numa_devices,omitempty"`
|
||||||
NUMAEnabled *CustomBool `json:"numa,omitempty"`
|
NUMAEnabled *CustomBool `json:"numa,omitempty"`
|
||||||
OSType *string `json:"ostype,omitempty"`
|
OSType *string `json:"ostype,omitempty"`
|
||||||
Overwrite *CustomBool `json:"force,omitempty"`
|
Overwrite *CustomBool `json:"force,omitempty"`
|
||||||
PCIDevices *CustomPCIDevices `json:"hostpci,omitempty"`
|
PCIDevices *CustomPCIDevices `json:"hostpci,omitempty"`
|
||||||
|
PoolID *string `json:"pool,omitempty" url:"pool,omitempty"`
|
||||||
Revert *string `json:"revert,omitempty"`
|
Revert *string `json:"revert,omitempty"`
|
||||||
SATADevices *CustomStorageDevices `json:"sata,omitempty"`
|
SATADevice0 *CustomStorageDevice `json:"sata0,omitempty"`
|
||||||
SCSIDevices *CustomStorageDevices `json:"scsi,omitempty"`
|
SATADevice1 *CustomStorageDevice `json:"sata1,omitempty"`
|
||||||
|
SATADevice2 *CustomStorageDevice `json:"sata2,omitempty"`
|
||||||
|
SATADevice3 *CustomStorageDevice `json:"sata3,omitempty"`
|
||||||
|
SATADevice4 *CustomStorageDevice `json:"sata4,omitempty"`
|
||||||
|
SATADevice5 *CustomStorageDevice `json:"sata5,omitempty"`
|
||||||
|
SCSIDevice0 *CustomStorageDevice `json:"scsi0,omitempty"`
|
||||||
|
SCSIDevice1 *CustomStorageDevice `json:"scsi1,omitempty"`
|
||||||
|
SCSIDevice2 *CustomStorageDevice `json:"scsi2,omitempty"`
|
||||||
|
SCSIDevice3 *CustomStorageDevice `json:"scsi3,omitempty"`
|
||||||
|
SCSIDevice4 *CustomStorageDevice `json:"scsi4,omitempty"`
|
||||||
|
SCSIDevice5 *CustomStorageDevice `json:"scsi5,omitempty"`
|
||||||
|
SCSIDevice6 *CustomStorageDevice `json:"scsi6,omitempty"`
|
||||||
|
SCSIDevice7 *CustomStorageDevice `json:"scsi7,omitempty"`
|
||||||
|
SCSIDevice8 *CustomStorageDevice `json:"scsi8,omitempty"`
|
||||||
|
SCSIDevice9 *CustomStorageDevice `json:"scsi9,omitempty"`
|
||||||
|
SCSIDevice10 *CustomStorageDevice `json:"scsi10,omitempty"`
|
||||||
|
SCSIDevice11 *CustomStorageDevice `json:"scsi11,omitempty"`
|
||||||
|
SCSIDevice12 *CustomStorageDevice `json:"scsi12,omitempty"`
|
||||||
|
SCSIDevice13 *CustomStorageDevice `json:"scsi13,omitempty"`
|
||||||
SCSIHardware *string `json:"scsihw,omitempty"`
|
SCSIHardware *string `json:"scsihw,omitempty"`
|
||||||
SerialDevices *CustomSerialDevices `json:"serial,omitempty"`
|
SerialDevices *CustomSerialDevices `json:"serial,omitempty"`
|
||||||
SharedMemory *CustomSharedMemory `json:"ivshmem,omitempty"`
|
SharedMemory *CustomSharedMemory `json:"ivshmem,omitempty"`
|
||||||
@ -908,3 +937,239 @@ func (r CustomWatchdogDevice) EncodeValues(key string, v *url.Values) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON converts a CustomAgent string to an object.
|
||||||
|
func (r *CustomAgent) UnmarshalJSON(b []byte) error {
|
||||||
|
var s string
|
||||||
|
|
||||||
|
err := json.Unmarshal(b, &s)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pairs := strings.Split(s, ",")
|
||||||
|
|
||||||
|
for _, p := range pairs {
|
||||||
|
v := strings.Split(strings.TrimSpace(p), "=")
|
||||||
|
|
||||||
|
if len(v) == 1 {
|
||||||
|
enabled := CustomBool(v[0] == "1")
|
||||||
|
r.Enabled = &enabled
|
||||||
|
} else if len(v) == 2 {
|
||||||
|
switch v[0] {
|
||||||
|
case "enabled":
|
||||||
|
enabled := CustomBool(v[1] == "1")
|
||||||
|
r.Enabled = &enabled
|
||||||
|
case "fstrim_cloned_disks":
|
||||||
|
fstrim := CustomBool(v[1] == "1")
|
||||||
|
r.TrimClonedDisks = &fstrim
|
||||||
|
case "type":
|
||||||
|
r.Type = &v[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON converts a CustomNetworkDevice string to an object.
|
||||||
|
func (r *CustomNetworkDevice) UnmarshalJSON(b []byte) error {
|
||||||
|
var s string
|
||||||
|
|
||||||
|
err := json.Unmarshal(b, &s)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pairs := strings.Split(s, ",")
|
||||||
|
|
||||||
|
for _, p := range pairs {
|
||||||
|
v := strings.Split(strings.TrimSpace(p), "=")
|
||||||
|
|
||||||
|
if len(v) == 2 {
|
||||||
|
switch v[0] {
|
||||||
|
case "bridge":
|
||||||
|
r.Bridge = &v[1]
|
||||||
|
case "firewall":
|
||||||
|
bv := CustomBool(v[1] == "1")
|
||||||
|
r.Firewall = &bv
|
||||||
|
case "link_down":
|
||||||
|
bv := CustomBool(v[1] == "1")
|
||||||
|
r.LinkDown = &bv
|
||||||
|
case "macaddr":
|
||||||
|
r.MACAddress = &v[1]
|
||||||
|
case "model":
|
||||||
|
r.Model = v[1]
|
||||||
|
case "queues":
|
||||||
|
iv, err := strconv.Atoi(v[1])
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Queues = &iv
|
||||||
|
case "rate":
|
||||||
|
fv, err := strconv.ParseFloat(v[1], 64)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r.RateLimit = &fv
|
||||||
|
case "tag":
|
||||||
|
iv, err := strconv.Atoi(v[1])
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Tag = &iv
|
||||||
|
case "trunks":
|
||||||
|
trunks := strings.Split(v[1], ";")
|
||||||
|
r.Trunks = make([]int, len(trunks))
|
||||||
|
|
||||||
|
for i, trunk := range trunks {
|
||||||
|
iv, err := strconv.Atoi(trunk)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Trunks[i] = iv
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Enabled = true
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON converts a CustomSharedMemory string to an object.
|
||||||
|
func (r *CustomSharedMemory) UnmarshalJSON(b []byte) error {
|
||||||
|
var s string
|
||||||
|
|
||||||
|
err := json.Unmarshal(b, &s)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pairs := strings.Split(s, ",")
|
||||||
|
|
||||||
|
for _, p := range pairs {
|
||||||
|
v := strings.Split(strings.TrimSpace(p), "=")
|
||||||
|
|
||||||
|
if len(v) == 2 {
|
||||||
|
switch v[0] {
|
||||||
|
case "name":
|
||||||
|
r.Name = &v[1]
|
||||||
|
case "size":
|
||||||
|
r.Size, err = strconv.Atoi(v[1])
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON converts a CustomSMBIOS string to an object.
|
||||||
|
func (r *CustomSMBIOS) UnmarshalJSON(b []byte) error {
|
||||||
|
var s string
|
||||||
|
|
||||||
|
err := json.Unmarshal(b, &s)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pairs := strings.Split(s, ",")
|
||||||
|
|
||||||
|
for _, p := range pairs {
|
||||||
|
v := strings.Split(strings.TrimSpace(p), "=")
|
||||||
|
|
||||||
|
if len(v) == 2 {
|
||||||
|
switch v[0] {
|
||||||
|
case "base64":
|
||||||
|
base64 := CustomBool(v[1] == "1")
|
||||||
|
r.Base64 = &base64
|
||||||
|
case "family":
|
||||||
|
r.Family = &v[1]
|
||||||
|
case "manufacturer":
|
||||||
|
r.Manufacturer = &v[1]
|
||||||
|
case "product":
|
||||||
|
r.Product = &v[1]
|
||||||
|
case "serial":
|
||||||
|
r.Serial = &v[1]
|
||||||
|
case "sku":
|
||||||
|
r.SKU = &v[1]
|
||||||
|
case "uuid":
|
||||||
|
r.UUID = &v[1]
|
||||||
|
case "version":
|
||||||
|
r.Version = &v[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON converts a CustomStorageDevice string to an object.
|
||||||
|
func (r *CustomStorageDevice) UnmarshalJSON(b []byte) error {
|
||||||
|
var s string
|
||||||
|
|
||||||
|
err := json.Unmarshal(b, &s)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pairs := strings.Split(s, ",")
|
||||||
|
|
||||||
|
for _, p := range pairs {
|
||||||
|
v := strings.Split(strings.TrimSpace(p), "=")
|
||||||
|
|
||||||
|
if len(v) == 1 {
|
||||||
|
r.FileVolume = v[0]
|
||||||
|
} else if len(v) == 2 {
|
||||||
|
switch v[0] {
|
||||||
|
case "aio":
|
||||||
|
r.AIO = &v[1]
|
||||||
|
case "backup":
|
||||||
|
bv := CustomBool(v[1] == "1")
|
||||||
|
r.BackupEnabled = &bv
|
||||||
|
case "file":
|
||||||
|
r.FileVolume = v[1]
|
||||||
|
case "mbps_rd":
|
||||||
|
iv, err := strconv.Atoi(v[1])
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r.MaxReadSpeedMbps = &iv
|
||||||
|
case "mbps_wr":
|
||||||
|
iv, err := strconv.Atoi(v[1])
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r.MaxWriteSpeedMbps = &iv
|
||||||
|
case "media":
|
||||||
|
r.Media = &v[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Enabled = true
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -374,6 +374,7 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
|
|||||||
Type: schema.TypeList,
|
Type: schema.TypeList,
|
||||||
Description: "The disk devices",
|
Description: "The disk devices",
|
||||||
Optional: true,
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
DefaultFunc: func() (interface{}, error) {
|
DefaultFunc: func() (interface{}, error) {
|
||||||
defaultList := make([]interface{}, 1)
|
defaultList := make([]interface{}, 1)
|
||||||
defaultMap := make(map[string]interface{})
|
defaultMap := make(map[string]interface{})
|
||||||
@ -392,18 +393,21 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
|
|||||||
mkResourceVirtualEnvironmentVMDiskDatastoreID: {
|
mkResourceVirtualEnvironmentVMDiskDatastoreID: {
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
Description: "The datastore id",
|
Description: "The datastore id",
|
||||||
Default: dvResourceVirtualEnvironmentVMDiskDatastoreID,
|
Default: dvResourceVirtualEnvironmentVMDiskDatastoreID,
|
||||||
},
|
},
|
||||||
mkResourceVirtualEnvironmentVMDiskEnabled: {
|
mkResourceVirtualEnvironmentVMDiskEnabled: {
|
||||||
Type: schema.TypeBool,
|
Type: schema.TypeBool,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
Description: "Whether to enable the disk",
|
Description: "Whether to enable the disk",
|
||||||
Default: dvResourceVirtualEnvironmentVMDiskEnabled,
|
Default: dvResourceVirtualEnvironmentVMDiskEnabled,
|
||||||
},
|
},
|
||||||
mkResourceVirtualEnvironmentVMDiskFileFormat: {
|
mkResourceVirtualEnvironmentVMDiskFileFormat: {
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
Description: "The file format",
|
Description: "The file format",
|
||||||
Default: dvResourceVirtualEnvironmentVMDiskFileFormat,
|
Default: dvResourceVirtualEnvironmentVMDiskFileFormat,
|
||||||
ValidateFunc: getFileFormatValidator(),
|
ValidateFunc: getFileFormatValidator(),
|
||||||
@ -411,6 +415,7 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
|
|||||||
mkResourceVirtualEnvironmentVMDiskFileID: {
|
mkResourceVirtualEnvironmentVMDiskFileID: {
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
Description: "The file id for a disk image",
|
Description: "The file id for a disk image",
|
||||||
Default: dvResourceVirtualEnvironmentVMDiskFileID,
|
Default: dvResourceVirtualEnvironmentVMDiskFileID,
|
||||||
ValidateFunc: getFileIDValidator(),
|
ValidateFunc: getFileIDValidator(),
|
||||||
@ -418,6 +423,7 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
|
|||||||
mkResourceVirtualEnvironmentVMDiskSize: {
|
mkResourceVirtualEnvironmentVMDiskSize: {
|
||||||
Type: schema.TypeInt,
|
Type: schema.TypeInt,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
Description: "The disk size in gigabytes",
|
Description: "The disk size in gigabytes",
|
||||||
Default: dvResourceVirtualEnvironmentVMDiskSize,
|
Default: dvResourceVirtualEnvironmentVMDiskSize,
|
||||||
ValidateFunc: validation.IntBetween(1, 8192),
|
ValidateFunc: validation.IntBetween(1, 8192),
|
||||||
@ -540,10 +546,17 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
|
|||||||
Default: dvResourceVirtualEnvironmentVMNetworkDeviceEnabled,
|
Default: dvResourceVirtualEnvironmentVMNetworkDeviceEnabled,
|
||||||
},
|
},
|
||||||
mkResourceVirtualEnvironmentVMNetworkDeviceMACAddress: {
|
mkResourceVirtualEnvironmentVMNetworkDeviceMACAddress: {
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Description: "The MAC address",
|
Description: "The MAC address",
|
||||||
Default: dvResourceVirtualEnvironmentVMNetworkDeviceMACAddress,
|
Default: dvResourceVirtualEnvironmentVMNetworkDeviceMACAddress,
|
||||||
|
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
|
||||||
|
if old == "" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
},
|
||||||
ValidateFunc: getMACAddressValidator(),
|
ValidateFunc: getMACAddressValidator(),
|
||||||
},
|
},
|
||||||
mkResourceVirtualEnvironmentVMNetworkDeviceModel: {
|
mkResourceVirtualEnvironmentVMNetworkDeviceModel: {
|
||||||
@ -571,6 +584,7 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
|
|||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Description: "The node name",
|
Description: "The node name",
|
||||||
Required: true,
|
Required: true,
|
||||||
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
mkResourceVirtualEnvironmentVMOSType: {
|
mkResourceVirtualEnvironmentVMOSType: {
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
@ -876,6 +890,7 @@ func resourceVirtualEnvironmentVMCreate(d *schema.ResourceData, m interface{}) e
|
|||||||
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
|
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
|
||||||
osType := d.Get(mkResourceVirtualEnvironmentVMOSType).(string)
|
osType := d.Get(mkResourceVirtualEnvironmentVMOSType).(string)
|
||||||
poolID := d.Get(mkResourceVirtualEnvironmentVMPoolID).(string)
|
poolID := d.Get(mkResourceVirtualEnvironmentVMPoolID).(string)
|
||||||
|
started := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMStarted).(bool))
|
||||||
vmID := d.Get(mkResourceVirtualEnvironmentVMVMID).(int)
|
vmID := d.Get(mkResourceVirtualEnvironmentVMVMID).(int)
|
||||||
|
|
||||||
if vmID == -1 {
|
if vmID == -1 {
|
||||||
@ -921,7 +936,6 @@ func resourceVirtualEnvironmentVMCreate(d *schema.ResourceData, m interface{}) e
|
|||||||
}
|
}
|
||||||
|
|
||||||
scsiHardware := "virtio-scsi-pci"
|
scsiHardware := "virtio-scsi-pci"
|
||||||
startOnBoot := proxmox.CustomBool(true)
|
|
||||||
tabletDeviceEnabled := proxmox.CustomBool(true)
|
tabletDeviceEnabled := proxmox.CustomBool(true)
|
||||||
|
|
||||||
body := &proxmox.VirtualEnvironmentVMCreateRequestBody{
|
body := &proxmox.VirtualEnvironmentVMCreateRequestBody{
|
||||||
@ -945,7 +959,7 @@ func resourceVirtualEnvironmentVMCreate(d *schema.ResourceData, m interface{}) e
|
|||||||
SCSIHardware: &scsiHardware,
|
SCSIHardware: &scsiHardware,
|
||||||
SerialDevices: []string{"socket"},
|
SerialDevices: []string{"socket"},
|
||||||
SharedMemory: memorySharedObject,
|
SharedMemory: memorySharedObject,
|
||||||
StartOnBoot: &startOnBoot,
|
StartOnBoot: &started,
|
||||||
TabletDeviceEnabled: &tabletDeviceEnabled,
|
TabletDeviceEnabled: &tabletDeviceEnabled,
|
||||||
VMID: &vmID,
|
VMID: &vmID,
|
||||||
}
|
}
|
||||||
@ -1136,6 +1150,138 @@ func resourceVirtualEnvironmentVMRead(d *schema.ResourceData, m interface{}) err
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve the entire configuration in order to compare it to the state.
|
||||||
|
vmConfig, err := veClient.GetVM(nodeName, vmID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
if strings.Contains(err.Error(), "HTTP 404") {
|
||||||
|
d.SetId("")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmConfig.Agent != nil {
|
||||||
|
agent := make(map[string]interface{})
|
||||||
|
|
||||||
|
if vmConfig.Agent.Enabled != nil {
|
||||||
|
agent[mkResourceVirtualEnvironmentVMAgentEnabled] = bool(*vmConfig.Agent.Enabled)
|
||||||
|
} else {
|
||||||
|
agent[mkResourceVirtualEnvironmentVMAgentEnabled] = dvResourceVirtualEnvironmentVMAgentEnabled
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmConfig.Agent.TrimClonedDisks != nil {
|
||||||
|
agent[mkResourceVirtualEnvironmentVMAgentTrim] = bool(*vmConfig.Agent.TrimClonedDisks)
|
||||||
|
} else {
|
||||||
|
agent[mkResourceVirtualEnvironmentVMAgentTrim] = dvResourceVirtualEnvironmentVMAgentTrim
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmConfig.Agent.Type != nil {
|
||||||
|
agent[mkResourceVirtualEnvironmentVMAgentType] = *vmConfig.Agent.Type
|
||||||
|
} else {
|
||||||
|
agent[mkResourceVirtualEnvironmentVMAgentType] = dvResourceVirtualEnvironmentVMAgentType
|
||||||
|
}
|
||||||
|
|
||||||
|
currentAgent := d.Get(mkResourceVirtualEnvironmentVMAgent).([]interface{})
|
||||||
|
|
||||||
|
if len(currentAgent) > 0 ||
|
||||||
|
agent[mkResourceVirtualEnvironmentVMAgentEnabled] != dvResourceVirtualEnvironmentVMAgentEnabled ||
|
||||||
|
agent[mkResourceVirtualEnvironmentVMAgentTrim] != dvResourceVirtualEnvironmentVMAgentTrim ||
|
||||||
|
agent[mkResourceVirtualEnvironmentVMAgentType] != dvResourceVirtualEnvironmentVMAgentType {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMAgent, []interface{}{agent})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMAgent, make([]interface{}, 0))
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu := make(map[string]interface{})
|
||||||
|
|
||||||
|
if vmConfig.CPUCores != nil {
|
||||||
|
cpu[mkResourceVirtualEnvironmentVMCPUCores] = *vmConfig.CPUCores
|
||||||
|
} else {
|
||||||
|
cpu[mkResourceVirtualEnvironmentVMCPUCores] = dvResourceVirtualEnvironmentVMCPUCores
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmConfig.VirtualCPUCount != nil {
|
||||||
|
cpu[mkResourceVirtualEnvironmentVMCPUHotplugged] = *vmConfig.VirtualCPUCount
|
||||||
|
} else {
|
||||||
|
cpu[mkResourceVirtualEnvironmentVMCPUHotplugged] = dvResourceVirtualEnvironmentVMCPUHotplugged
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmConfig.CPUSockets != nil {
|
||||||
|
cpu[mkResourceVirtualEnvironmentVMCPUSockets] = *vmConfig.CPUSockets
|
||||||
|
} else {
|
||||||
|
cpu[mkResourceVirtualEnvironmentVMCPUSockets] = dvResourceVirtualEnvironmentVMCPUSockets
|
||||||
|
}
|
||||||
|
|
||||||
|
currentCPU := d.Get(mkResourceVirtualEnvironmentVMCPU).([]interface{})
|
||||||
|
|
||||||
|
if len(currentCPU) > 0 ||
|
||||||
|
cpu[mkResourceVirtualEnvironmentVMCPUCores] != dvResourceVirtualEnvironmentVMCPUCores ||
|
||||||
|
cpu[mkResourceVirtualEnvironmentVMCPUHotplugged] != dvResourceVirtualEnvironmentVMCPUHotplugged ||
|
||||||
|
cpu[mkResourceVirtualEnvironmentVMCPUSockets] != dvResourceVirtualEnvironmentVMCPUSockets {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMCPU, []interface{}{cpu})
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmConfig.Description != nil {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMDescription, *vmConfig.Description)
|
||||||
|
} else {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMDescription, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmConfig.KeyboardLayout != nil {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMKeyboardLayout, *vmConfig.KeyboardLayout)
|
||||||
|
} else {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMKeyboardLayout, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
memory := make(map[string]interface{})
|
||||||
|
|
||||||
|
if vmConfig.DedicatedMemory != nil {
|
||||||
|
memory[mkResourceVirtualEnvironmentVMMemoryDedicated] = *vmConfig.DedicatedMemory
|
||||||
|
} else {
|
||||||
|
memory[mkResourceVirtualEnvironmentVMMemoryDedicated] = dvResourceVirtualEnvironmentVMMemoryDedicated
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmConfig.FloatingMemory != nil {
|
||||||
|
memory[mkResourceVirtualEnvironmentVMMemoryFloating] = *vmConfig.FloatingMemory
|
||||||
|
} else {
|
||||||
|
memory[mkResourceVirtualEnvironmentVMMemoryFloating] = dvResourceVirtualEnvironmentVMMemoryFloating
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmConfig.SharedMemory != nil {
|
||||||
|
memory[mkResourceVirtualEnvironmentVMMemoryShared] = vmConfig.SharedMemory.Size
|
||||||
|
} else {
|
||||||
|
memory[mkResourceVirtualEnvironmentVMMemoryShared] = dvResourceVirtualEnvironmentVMMemoryShared
|
||||||
|
}
|
||||||
|
|
||||||
|
currentMemory := d.Get(mkResourceVirtualEnvironmentVMMemory).([]interface{})
|
||||||
|
|
||||||
|
if len(currentMemory) > 0 ||
|
||||||
|
memory[mkResourceVirtualEnvironmentVMMemoryDedicated] != dvResourceVirtualEnvironmentVMMemoryDedicated ||
|
||||||
|
memory[mkResourceVirtualEnvironmentVMMemoryFloating] != dvResourceVirtualEnvironmentVMMemoryFloating ||
|
||||||
|
memory[mkResourceVirtualEnvironmentVMMemoryShared] != dvResourceVirtualEnvironmentVMMemoryShared {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMMemory, []interface{}{memory})
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmConfig.Name != nil {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMName, *vmConfig.Name)
|
||||||
|
} else {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMName, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmConfig.OSType != nil {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMOSType, *vmConfig.OSType)
|
||||||
|
} else {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMOSType, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmConfig.PoolID != nil {
|
||||||
|
d.Set(mkResourceVirtualEnvironmentVMPoolID, *vmConfig.PoolID)
|
||||||
|
}
|
||||||
|
|
||||||
// Determine the state of the virtual machine in order to update the "started" argument.
|
// Determine the state of the virtual machine in order to update the "started" argument.
|
||||||
status, err := veClient.GetVMStatus(nodeName, vmID)
|
status, err := veClient.GetVMStatus(nodeName, vmID)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user