0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-08-23 11:58:34 +00:00

Add datastore_id argument to initialization block for VM resources

This commit is contained in:
Dan Petersen 2020-03-08 17:40:58 +01:00
parent 433201e91b
commit aec59ef607
5 changed files with 46 additions and 3 deletions

View File

@ -7,6 +7,7 @@ ENHANCEMENTS:
* resource/virtual_environment_container: Add `template` argument * resource/virtual_environment_container: Add `template` argument
* resource/virtual_environment_vm: Add `audio_device` argument * resource/virtual_environment_vm: Add `audio_device` argument
* resource/virtual_environment_vm: Add `clone` argument * resource/virtual_environment_vm: Add `clone` argument
* resource/virtual_environment_vm: Add `initialization.datastore_id` argument
* resource/virtual_environment_vm: Add `serial_device` argument * resource/virtual_environment_vm: Add `serial_device` argument
* resource/virtual_environment_vm: Add `template` argument * resource/virtual_environment_vm: Add `template` argument

View File

@ -185,6 +185,7 @@ output "ubuntu_vm_public_key" {
* `write` - (Optional) The maximum write speed in megabytes per second. * `write` - (Optional) The maximum write speed in megabytes per second.
* `write_burstable` - (Optional) The maximum burstable write speed in megabytes per second. * `write_burstable` - (Optional) The maximum burstable write speed in megabytes per second.
* `initialization` - (Optional) The cloud-init configuration (conflicts with `cdrom`). * `initialization` - (Optional) The cloud-init configuration (conflicts with `cdrom`).
* `datastore_id` - (Optional) The identifier for the datastore to create the cloud-init disk in (defaults to `local-lvm`).
* `dns` - (Optional) The DNS configuration. * `dns` - (Optional) The DNS configuration.
* `domain` - (Optional) The DNS search domain. * `domain` - (Optional) The DNS search domain.
* `server` - (Optional) The DNS server. * `server` - (Optional) The DNS server.

View File

@ -11,6 +11,8 @@ resource "proxmox_virtual_environment_vm" "example_template" {
} }
initialization { initialization {
datastore_id = "${element(data.proxmox_virtual_environment_datastores.example.datastore_ids, index(data.proxmox_virtual_environment_datastores.example.datastore_ids, "local-lvm"))}"
dns { dns {
server = "1.1.1.1" server = "1.1.1.1"
} }

View File

@ -43,6 +43,7 @@ const (
dvResourceVirtualEnvironmentVMDiskSpeedReadBurstable = 0 dvResourceVirtualEnvironmentVMDiskSpeedReadBurstable = 0
dvResourceVirtualEnvironmentVMDiskSpeedWrite = 0 dvResourceVirtualEnvironmentVMDiskSpeedWrite = 0
dvResourceVirtualEnvironmentVMDiskSpeedWriteBurstable = 0 dvResourceVirtualEnvironmentVMDiskSpeedWriteBurstable = 0
dvResourceVirtualEnvironmentVMInitializationDatastoreID = "local-lvm"
dvResourceVirtualEnvironmentVMInitializationDNSDomain = "" dvResourceVirtualEnvironmentVMInitializationDNSDomain = ""
dvResourceVirtualEnvironmentVMInitializationDNSServer = "" dvResourceVirtualEnvironmentVMInitializationDNSServer = ""
dvResourceVirtualEnvironmentVMInitializationIPConfigIPv4Address = "" dvResourceVirtualEnvironmentVMInitializationIPConfigIPv4Address = ""
@ -114,6 +115,7 @@ const (
mkResourceVirtualEnvironmentVMDiskSpeedWrite = "write" mkResourceVirtualEnvironmentVMDiskSpeedWrite = "write"
mkResourceVirtualEnvironmentVMDiskSpeedWriteBurstable = "write_burstable" mkResourceVirtualEnvironmentVMDiskSpeedWriteBurstable = "write_burstable"
mkResourceVirtualEnvironmentVMInitialization = "initialization" mkResourceVirtualEnvironmentVMInitialization = "initialization"
mkResourceVirtualEnvironmentVMInitializationDatastoreID = "datastore_id"
mkResourceVirtualEnvironmentVMInitializationDNS = "dns" mkResourceVirtualEnvironmentVMInitializationDNS = "dns"
mkResourceVirtualEnvironmentVMInitializationDNSDomain = "domain" mkResourceVirtualEnvironmentVMInitializationDNSDomain = "domain"
mkResourceVirtualEnvironmentVMInitializationDNSServer = "server" mkResourceVirtualEnvironmentVMInitializationDNSServer = "server"
@ -506,6 +508,13 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
}, },
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
mkResourceVirtualEnvironmentVMInitializationDatastoreID: {
Type: schema.TypeString,
Description: "The datastore id",
Optional: true,
ForceNew: true,
Default: dvResourceVirtualEnvironmentVMInitializationDatastoreID,
},
mkResourceVirtualEnvironmentVMInitializationDNS: { mkResourceVirtualEnvironmentVMInitializationDNS: {
Type: schema.TypeList, Type: schema.TypeList,
Description: "The DNS configuration", Description: "The DNS configuration",
@ -1124,8 +1133,11 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
} }
if len(initialization) > 0 { if len(initialization) > 0 {
initializationBlock := initialization[0].(map[string]interface{})
initializationDatastoreID := initializationBlock[mkResourceVirtualEnvironmentVMInitializationDatastoreID].(string)
cdromEnabled := true cdromEnabled := true
cdromFileID := "local-lvm:cloudinit" cdromFileID := fmt.Sprintf("%s:cloudinit", initializationDatastoreID)
cdromMedia := "cdrom" cdromMedia := "cdrom"
updateBody.IDEDevices = proxmox.CustomStorageDevices{ updateBody.IDEDevices = proxmox.CustomStorageDevices{
@ -1141,6 +1153,14 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
Media: &cdromMedia, Media: &cdromMedia,
}, },
} }
initializationConfig, err := resourceVirtualEnvironmentVMGetCloudInitConfig(d, m)
if err != nil {
return err
}
updateBody.CloudInitConfig = initializationConfig
} }
if keyboardLayout != dvResourceVirtualEnvironmentVMKeyboardLayout { if keyboardLayout != dvResourceVirtualEnvironmentVMKeyboardLayout {
@ -1308,8 +1328,12 @@ func resourceVirtualEnvironmentVMCreateCustom(d *schema.ResourceData, m interfac
} }
if initializationConfig != nil { if initializationConfig != nil {
initialization := d.Get(mkResourceVirtualEnvironmentVMInitialization).([]interface{})
initializationBlock := initialization[0].(map[string]interface{})
initializationDatastoreID := initializationBlock[mkResourceVirtualEnvironmentVMInitializationDatastoreID].(string)
cdromEnabled = true cdromEnabled = true
cdromFileID = "local-lvm:cloudinit" cdromFileID = fmt.Sprintf("%s:cloudinit", initializationDatastoreID)
} }
keyboardLayout := d.Get(mkResourceVirtualEnvironmentVMKeyboardLayout).(string) keyboardLayout := d.Get(mkResourceVirtualEnvironmentVMKeyboardLayout).(string)
@ -2319,6 +2343,15 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
// Compare the initialization configuration to the one stored in the state. // Compare the initialization configuration to the one stored in the state.
initialization := map[string]interface{}{} initialization := map[string]interface{}{}
if vmConfig.IDEDevice2 != nil {
if *vmConfig.IDEDevice2.Media == "cdrom" {
if strings.Contains(vmConfig.IDEDevice2.FileVolume, fmt.Sprintf("vm-%d-cloudinit", vmID)) {
fileVolumeParts := strings.Split(vmConfig.IDEDevice2.FileVolume, ":")
initialization[mkResourceVirtualEnvironmentVMInitializationDatastoreID] = fileVolumeParts[0]
}
}
}
if vmConfig.CloudInitDNSDomain != nil || vmConfig.CloudInitDNSServer != nil { if vmConfig.CloudInitDNSDomain != nil || vmConfig.CloudInitDNSServer != nil {
initializationDNS := map[string]interface{}{} initializationDNS := map[string]interface{}{}
@ -3053,11 +3086,15 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
updateBody.CloudInitConfig = initializationConfig updateBody.CloudInitConfig = initializationConfig
if updateBody.CloudInitConfig != nil { if updateBody.CloudInitConfig != nil {
initialization := d.Get(mkResourceVirtualEnvironmentVMInitialization).([]interface{})
initializationBlock := initialization[0].(map[string]interface{})
initializationDatastoreID := initializationBlock[mkResourceVirtualEnvironmentVMInitializationDatastoreID].(string)
cdromMedia := "cdrom" cdromMedia := "cdrom"
updateBody.IDEDevices[2] = proxmox.CustomStorageDevice{ updateBody.IDEDevices[2] = proxmox.CustomStorageDevice{
Enabled: true, Enabled: true,
FileVolume: "local-lvm:cloudinit", FileVolume: fmt.Sprintf("%s:cloudinit", initializationDatastoreID),
Media: &cdromMedia, Media: &cdromMedia,
} }

View File

@ -197,12 +197,14 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) {
initializationSchema := testNestedSchemaExistence(t, s, mkResourceVirtualEnvironmentVMInitialization) initializationSchema := testNestedSchemaExistence(t, s, mkResourceVirtualEnvironmentVMInitialization)
testOptionalArguments(t, initializationSchema, []string{ testOptionalArguments(t, initializationSchema, []string{
mkResourceVirtualEnvironmentVMInitializationDatastoreID,
mkResourceVirtualEnvironmentVMInitializationDNS, mkResourceVirtualEnvironmentVMInitializationDNS,
mkResourceVirtualEnvironmentVMInitializationIPConfig, mkResourceVirtualEnvironmentVMInitializationIPConfig,
mkResourceVirtualEnvironmentVMInitializationUserAccount, mkResourceVirtualEnvironmentVMInitializationUserAccount,
}) })
testValueTypes(t, initializationSchema, map[string]schema.ValueType{ testValueTypes(t, initializationSchema, map[string]schema.ValueType{
mkResourceVirtualEnvironmentVMInitializationDatastoreID: schema.TypeString,
mkResourceVirtualEnvironmentVMInitializationDNS: schema.TypeList, mkResourceVirtualEnvironmentVMInitializationDNS: schema.TypeList,
mkResourceVirtualEnvironmentVMInitializationIPConfig: schema.TypeList, mkResourceVirtualEnvironmentVMInitializationIPConfig: schema.TypeList,
mkResourceVirtualEnvironmentVMInitializationUserAccount: schema.TypeList, mkResourceVirtualEnvironmentVMInitializationUserAccount: schema.TypeList,