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

fix(vm): add interface argument to cdrom block (#429)

* fix(vm): add `interface` argument to `cdrom` block

* doc formatting
This commit is contained in:
Pavel Boldyrev 2023-07-16 12:55:49 -04:00 committed by GitHub
parent e59b06e519
commit b86fa239dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 90 additions and 28 deletions

View File

@ -127,6 +127,9 @@ output "ubuntu_vm_public_key" {
to `false`). to `false`).
- `file_id` - (Optional) A file ID for an ISO file (defaults to `cdrom` as - `file_id` - (Optional) A file ID for an ISO file (defaults to `cdrom` as
in the physical drive). in the physical drive).
- `interface` - (Optional) A hardware interface to connect CDROM drive to,
must be `ideN` (defaults to `ide3`). Note that `q35` machine type only
supports `ide0` and `ide2`.
- `clone` - (Optional) The cloning configuration. - `clone` - (Optional) The cloning configuration.
- `datastore_id` - (Optional) The identifier for the target datastore. - `datastore_id` - (Optional) The identifier for the target datastore.
- `node_name` - (Optional) The name of the source node (leave blank, if - `node_name` - (Optional) The name of the source node (leave blank, if
@ -167,16 +170,17 @@ output "ubuntu_vm_public_key" {
to `0`). to `0`).
- `numa` - (Boolean) Enable/disable NUMA. (default to `false`) - `numa` - (Boolean) Enable/disable NUMA. (default to `false`)
- `sockets` - (Optional) The number of CPU sockets (defaults to `1`). - `sockets` - (Optional) The number of CPU sockets (defaults to `1`).
- `type` - (Optional) The emulated CPU type, it's recommended to use `x86-64-v2-AES` (defaults to `qemu64`). - `type` - (Optional) The emulated CPU type, it's recommended to
use `x86-64-v2-AES` (defaults to `qemu64`).
- `486` - Intel 486. - `486` - Intel 486.
- `Broadwell`/`Broadwell-IBRS`/`Broadwell-noTSX`/`Broadwell-noTSX-IBRS` - Intel Core Processor (Broadwell, - `Broadwell`/`Broadwell-IBRS`/`Broadwell-noTSX`/`Broadwell-noTSX-IBRS` -
2014). Intel Core Processor (Broadwell, 2014).
- `Cascadelake-Server`/`Cascadelake-Server-noTSX`/`Cascadelake-Server-v2`/`Cascadelake-Server-v4`/`Cascadelake-Server-v5` - - `Cascadelake-Server`/`Cascadelake-Server-noTSX`/`Cascadelake-Server-v2`/`Cascadelake-Server-v4`/`Cascadelake-Server-v5` -
Intel Xeon 32xx/42xx/52xx/62xx/82xx/92xx ( Intel Xeon 32xx/42xx/52xx/62xx/82xx/92xx (2019).
2019).
- `Conroe` - Intel Celeron_4x0 (Conroe/Merom Class Core 2, 2006). - `Conroe` - Intel Celeron_4x0 (Conroe/Merom Class Core 2, 2006).
- `Cooperlake`/`Cooperlake-v2` - `Cooperlake`/`Cooperlake-v2`
- `EPYC`/`EPYC-IBPB`/`EPYC-Milan`/`EPYC-Rome`/`EPYC-Rome-v2`/`EPYC-v3` - AMD EPYC Processor (2017). - `EPYC`/`EPYC-IBPB`/`EPYC-Milan`/`EPYC-Rome`/`EPYC-Rome-v2`/`EPYC-v3` -
AMD EPYC Processor (2017).
- `Haswell`/`Haswell-IBRS`/`Haswell-noTSX`/`Haswell-noTSX-IBRS` - Intel - `Haswell`/`Haswell-IBRS`/`Haswell-noTSX`/`Haswell-noTSX-IBRS` - Intel
Core Processor (Haswell, 2013). Core Processor (Haswell, 2013).
- `Icelake-Client`/`Icelake-Client-noTSX` - `Icelake-Client`/`Icelake-Client-noTSX`
@ -195,12 +199,10 @@ output "ubuntu_vm_public_key" {
- `SandyBridge`/`SandyBridge-IBRS` - Intel Xeon E312xx (Sandy Bridge, - `SandyBridge`/`SandyBridge-IBRS` - Intel Xeon E312xx (Sandy Bridge,
2011). 2011).
- `SapphireRapids` - `SapphireRapids`
- `Skylake-Client`/`Skylake-Client-IBRS`/`Skylake-Client-noTSX-IBRS`/`Skylake-Client-v4` - Intel Core - `Skylake-Client`/`Skylake-Client-IBRS`/`Skylake-Client-noTSX-IBRS`/`Skylake-Client-v4` -
Processor ( Intel Core Processor (Skylake, 2015).
Skylake, 2015).
- `Skylake-Server`/`Skylake-Server-IBRS`/`Skylake-Server-noTSX-IBRS`/`Skylake-Server-v4`/`Skylake-Server-v5` - - `Skylake-Server`/`Skylake-Server-IBRS`/`Skylake-Server-noTSX-IBRS`/`Skylake-Server-v4`/`Skylake-Server-v5` -
Intel Xeon Processor ( Intel Xeon Processor (Skylake, 2016).
Skylake, 2016).
- `Westmere`/`Westmere-IBRS` - Intel Westmere E56xx/L56xx/X56xx ( - `Westmere`/`Westmere-IBRS` - Intel Westmere E56xx/L56xx/X56xx (
Nehalem-C, 2010). Nehalem-C, 2010).
- `athlon` - AMD Athlon. - `athlon` - AMD Athlon.
@ -215,7 +217,8 @@ output "ubuntu_vm_public_key" {
- `phenom` - AMD Phenom (2010). - `phenom` - AMD Phenom (2010).
- `qemu32`/`qemu64` - QEMU Virtual CPU version 2.5+ (32 & 64 bit - `qemu32`/`qemu64` - QEMU Virtual CPU version 2.5+ (32 & 64 bit
variants). variants).
- `x86-64-v2`/`x86-64-v2-AES`/`x86-64-v3`/`x86-64-v4` See https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels - `x86-64-v2`/`x86-64-v2-AES`/`x86-64-v3`/`x86-64-v4`
See https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels
- `custom-<model>` - Custom CPU model. All `custom-<model>` values - `custom-<model>` - Custom CPU model. All `custom-<model>` values
should be defined in `/etc/pve/virtual-guest/cpu-models.conf` file. should be defined in `/etc/pve/virtual-guest/cpu-models.conf` file.
- `units` - (Optional) The CPU units (defaults to `1024`). - `units` - (Optional) The CPU units (defaults to `1024`).

View File

@ -1,6 +1,6 @@
resource "proxmox_virtual_environment_network_linux_vlan" "vlan99" { resource "proxmox_virtual_environment_network_linux_vlan" "vlan99" {
node_name = "pve" node_name = "pve"
name = "ens18.99" name = "eno0.99"
comment = "VLAN 99" comment = "VLAN 99"
} }

View File

@ -400,6 +400,15 @@ func getSCSIHardwareValidator() schema.SchemaValidateDiagFunc {
}, false)) }, false))
} }
func getIDEInterfaceValidator() schema.SchemaValidateDiagFunc {
return validation.ToDiagFunc(validation.StringInSlice([]string{
"ide0",
"ide1",
"ide2",
"ide3",
}, false))
}
// suppressIfListsAreEqualIgnoringOrder is a customdiff.SuppressionFunc that suppresses // suppressIfListsAreEqualIgnoringOrder is a customdiff.SuppressionFunc that suppresses
// changes to a list if the old and new lists are equal, ignoring the order of the // changes to a list if the old and new lists are equal, ignoring the order of the
// elements. // elements.
@ -460,6 +469,7 @@ func getDiskInfo(resp *vms.GetResponseData, d *schema.ResourceData) map[string]*
storageDevices["ide0"] = resp.IDEDevice0 storageDevices["ide0"] = resp.IDEDevice0
storageDevices["ide1"] = resp.IDEDevice1 storageDevices["ide1"] = resp.IDEDevice1
storageDevices["ide2"] = resp.IDEDevice2 storageDevices["ide2"] = resp.IDEDevice2
storageDevices["ide3"] = resp.IDEDevice3
storageDevices["sata0"] = resp.SATADevice0 storageDevices["sata0"] = resp.SATADevice0
storageDevices["sata1"] = resp.SATADevice1 storageDevices["sata1"] = resp.SATADevice1

View File

@ -41,6 +41,7 @@ const (
dvResourceVirtualEnvironmentVMBIOS = "seabios" dvResourceVirtualEnvironmentVMBIOS = "seabios"
dvResourceVirtualEnvironmentVMCDROMEnabled = false dvResourceVirtualEnvironmentVMCDROMEnabled = false
dvResourceVirtualEnvironmentVMCDROMFileID = "" dvResourceVirtualEnvironmentVMCDROMFileID = ""
dvResourceVirtualEnvironmentVMCDROMInterface = "ide3"
dvResourceVirtualEnvironmentVMCloneDatastoreID = "" dvResourceVirtualEnvironmentVMCloneDatastoreID = ""
dvResourceVirtualEnvironmentVMCloneNodeName = "" dvResourceVirtualEnvironmentVMCloneNodeName = ""
dvResourceVirtualEnvironmentVMCloneFull = true dvResourceVirtualEnvironmentVMCloneFull = true
@ -134,6 +135,7 @@ const (
mkResourceVirtualEnvironmentVMCDROM = "cdrom" mkResourceVirtualEnvironmentVMCDROM = "cdrom"
mkResourceVirtualEnvironmentVMCDROMEnabled = "enabled" mkResourceVirtualEnvironmentVMCDROMEnabled = "enabled"
mkResourceVirtualEnvironmentVMCDROMFileID = "file_id" mkResourceVirtualEnvironmentVMCDROMFileID = "file_id"
mkResourceVirtualEnvironmentVMCDROMInterface = "interface"
mkResourceVirtualEnvironmentVMClone = "clone" mkResourceVirtualEnvironmentVMClone = "clone"
mkResourceVirtualEnvironmentVMCloneRetries = "retries" mkResourceVirtualEnvironmentVMCloneRetries = "retries"
mkResourceVirtualEnvironmentVMCloneDatastoreID = "datastore_id" mkResourceVirtualEnvironmentVMCloneDatastoreID = "datastore_id"
@ -377,8 +379,9 @@ func VM() *schema.Resource {
DefaultFunc: func() (interface{}, error) { DefaultFunc: func() (interface{}, error) {
return []interface{}{ return []interface{}{
map[string]interface{}{ map[string]interface{}{
mkResourceVirtualEnvironmentVMCDROMEnabled: dvResourceVirtualEnvironmentVMCDROMEnabled, mkResourceVirtualEnvironmentVMCDROMEnabled: dvResourceVirtualEnvironmentVMCDROMEnabled,
mkResourceVirtualEnvironmentVMCDROMFileID: dvResourceVirtualEnvironmentVMCDROMFileID, mkResourceVirtualEnvironmentVMCDROMFileID: dvResourceVirtualEnvironmentVMCDROMFileID,
mkResourceVirtualEnvironmentVMCDROMInterface: dvResourceVirtualEnvironmentVMCDROMInterface,
}, },
}, nil }, nil
}, },
@ -397,6 +400,13 @@ func VM() *schema.Resource {
Default: dvResourceVirtualEnvironmentVMCDROMFileID, Default: dvResourceVirtualEnvironmentVMCDROMFileID,
ValidateDiagFunc: getFileIDValidator(), ValidateDiagFunc: getFileIDValidator(),
}, },
mkResourceVirtualEnvironmentVMCDROMInterface: {
Type: schema.TypeString,
Description: "The CDROM interface",
Optional: true,
Default: dvResourceVirtualEnvironmentVMCDROMInterface,
ValidateDiagFunc: getIDEInterfaceValidator(),
},
}, },
}, },
MaxItems: 1, MaxItems: 1,
@ -1611,6 +1621,7 @@ func vmCreateClone(ctx context.Context, d *schema.ResourceData, m interface{}) d
cdromEnabled := cdromBlock[mkResourceVirtualEnvironmentVMCDROMEnabled].(bool) cdromEnabled := cdromBlock[mkResourceVirtualEnvironmentVMCDROMEnabled].(bool)
cdromFileID := cdromBlock[mkResourceVirtualEnvironmentVMCDROMFileID].(string) cdromFileID := cdromBlock[mkResourceVirtualEnvironmentVMCDROMFileID].(string)
cdromInterface := cdromBlock[mkResourceVirtualEnvironmentVMCDROMInterface].(string)
if cdromFileID == "" { if cdromFileID == "" {
cdromFileID = "cdrom" cdromFileID = "cdrom"
@ -1619,7 +1630,7 @@ func vmCreateClone(ctx context.Context, d *schema.ResourceData, m interface{}) d
cdromMedia := "cdrom" cdromMedia := "cdrom"
ideDevices = vms.CustomStorageDevices{ ideDevices = vms.CustomStorageDevices{
"ide3": vms.CustomStorageDevice{ cdromInterface: vms.CustomStorageDevice{
Enabled: cdromEnabled, Enabled: cdromEnabled,
FileVolume: cdromFileID, FileVolume: cdromFileID,
Media: &cdromMedia, Media: &cdromMedia,
@ -2007,6 +2018,7 @@ func vmCreateCustom(ctx context.Context, d *schema.ResourceData, m interface{})
cdromEnabled := cdromBlock[mkResourceVirtualEnvironmentVMCDROMEnabled].(bool) cdromEnabled := cdromBlock[mkResourceVirtualEnvironmentVMCDROMEnabled].(bool)
cdromFileID := cdromBlock[mkResourceVirtualEnvironmentVMCDROMFileID].(string) cdromFileID := cdromBlock[mkResourceVirtualEnvironmentVMCDROMFileID].(string)
cdromInterface := cdromBlock[mkResourceVirtualEnvironmentVMCDROMInterface].(string)
cdromCloudInitEnabled := false cdromCloudInitEnabled := false
cdromCloudInitFileID := "" cdromCloudInitFileID := ""
@ -2153,7 +2165,7 @@ func vmCreateCustom(ctx context.Context, d *schema.ResourceData, m interface{})
var bootOrderConverted []string var bootOrderConverted []string
if cdromEnabled { if cdromEnabled {
bootOrderConverted = []string{"ide3"} bootOrderConverted = []string{cdromInterface}
} }
bootOrder := d.Get(mkResourceVirtualEnvironmentVMBootOrder).([]interface{}) bootOrder := d.Get(mkResourceVirtualEnvironmentVMBootOrder).([]interface{})
@ -2193,7 +2205,7 @@ func vmCreateCustom(ctx context.Context, d *schema.ResourceData, m interface{})
FileVolume: cdromCloudInitFileID, FileVolume: cdromCloudInitFileID,
Media: &ideDevice2Media, Media: &ideDevice2Media,
}, },
"ide3": vms.CustomStorageDevice{ cdromInterface: vms.CustomStorageDevice{
Enabled: cdromEnabled, Enabled: cdromEnabled,
FileVolume: cdromFileID, FileVolume: cdromFileID,
Media: &ideDevice2Media, Media: &ideDevice2Media,
@ -3236,24 +3248,43 @@ func vmReadCustom(
diags = append(diags, diag.FromErr(err)...) diags = append(diags, diag.FromErr(err)...)
} }
// Compare the IDE devices to the CD-ROM and cloud-init configurations stored in the state. // Compare the IDE devices to the CDROM configurations stored in the state.
if vmConfig.IDEDevice3 != nil { currentInterface := dvResourceVirtualEnvironmentVMCDROMInterface
cdromIDEDevice := vmConfig.IDEDevice3
currentCDROM := d.Get(mkResourceVirtualEnvironmentVMCDROM).([]interface{})
if len(currentCDROM) > 0 {
currentBlock := currentCDROM[0].(map[string]interface{})
currentInterface = currentBlock[mkResourceVirtualEnvironmentVMCDROMInterface].(string)
}
switch currentInterface {
case "ide0":
cdromIDEDevice = vmConfig.IDEDevice0
case "ide1":
cdromIDEDevice = vmConfig.IDEDevice1
case "ide2":
cdromIDEDevice = vmConfig.IDEDevice2
}
//nolint:nestif
if cdromIDEDevice != nil {
cdrom := make([]interface{}, 1) cdrom := make([]interface{}, 1)
cdromBlock := map[string]interface{}{} cdromBlock := map[string]interface{}{}
currentCDROM := d.Get(mkResourceVirtualEnvironmentVMCDROM).([]interface{})
if len(clone) == 0 || len(currentCDROM) > 0 { if len(clone) == 0 || len(currentCDROM) > 0 {
cdromBlock[mkResourceVirtualEnvironmentVMCDROMEnabled] = vmConfig.IDEDevice3.Enabled cdromBlock[mkResourceVirtualEnvironmentVMCDROMEnabled] = cdromIDEDevice.Enabled
cdromBlock[mkResourceVirtualEnvironmentVMCDROMFileID] = vmConfig.IDEDevice3.FileVolume cdromBlock[mkResourceVirtualEnvironmentVMCDROMFileID] = cdromIDEDevice.FileVolume
cdromBlock[mkResourceVirtualEnvironmentVMCDROMInterface] = currentInterface
if len(currentCDROM) > 0 { if len(currentCDROM) > 0 {
isCurrentCDROMFileId := currentCDROM[0].(map[string]interface{}) currentBlock := currentCDROM[0].(map[string]interface{})
if isCurrentCDROMFileId[mkResourceVirtualEnvironmentVMCDROMFileID] == "" { if currentBlock[mkResourceVirtualEnvironmentVMCDROMFileID] == "" {
cdromBlock[mkResourceVirtualEnvironmentVMCDROMFileID] = "" cdromBlock[mkResourceVirtualEnvironmentVMCDROMFileID] = ""
} }
if isCurrentCDROMFileId[mkResourceVirtualEnvironmentVMCDROMEnabled] == false { if currentBlock[mkResourceVirtualEnvironmentVMCDROMEnabled] == false {
cdromBlock[mkResourceVirtualEnvironmentVMCDROMEnabled] = false cdromBlock[mkResourceVirtualEnvironmentVMCDROMEnabled] = false
} }
} }
@ -4502,9 +4533,27 @@ func vmUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D
cdromEnabled := cdromBlock[mkResourceVirtualEnvironmentVMCDROMEnabled].(bool) cdromEnabled := cdromBlock[mkResourceVirtualEnvironmentVMCDROMEnabled].(bool)
cdromFileID := cdromBlock[mkResourceVirtualEnvironmentVMCDROMFileID].(string) cdromFileID := cdromBlock[mkResourceVirtualEnvironmentVMCDROMFileID].(string)
cdromInterface := cdromBlock[mkResourceVirtualEnvironmentVMCDROMInterface].(string)
old, _ := d.GetChange(mkResourceVirtualEnvironmentVMCDROM)
if len(old.([]interface{})) > 0 {
oldList := old.([]interface{})[0]
oldBlock := oldList.(map[string]interface{})
// If the interface is not set, use the default, for backward compatibility.
oldInterface, ok := oldBlock[mkResourceVirtualEnvironmentVMCDROMInterface].(string)
if !ok || oldInterface == "" {
oldInterface = dvResourceVirtualEnvironmentVMCDROMInterface
}
if oldInterface != cdromInterface {
del = append(del, oldInterface)
}
}
if !cdromEnabled && cdromFileID == "" { if !cdromEnabled && cdromFileID == "" {
del = append(del, "ide3") del = append(del, cdromInterface)
} }
if cdromFileID == "" { if cdromFileID == "" {
@ -4513,7 +4562,7 @@ func vmUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D
cdromMedia := "cdrom" cdromMedia := "cdrom"
updateBody.IDEDevices["ide3"] = vms.CustomStorageDevice{ updateBody.IDEDevices[cdromInterface] = vms.CustomStorageDevice{
Enabled: cdromEnabled, Enabled: cdromEnabled,
FileVolume: cdromFileID, FileVolume: cdromFileID,
Media: &cdromMedia, Media: &cdromMedia,