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:
parent
e59b06e519
commit
b86fa239dd
@ -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`).
|
||||||
|
@ -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"
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user