diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e01e9c2..2e4291ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ENHANCEMENTS: * resource/virtual_environment_container: Add `template` argument * resource/virtual_environment_vm: Add `audio_device` 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 `template` argument diff --git a/docs/resources/virtual_environment/proxmox_virtual_environment_vm.md b/docs/resources/virtual_environment/proxmox_virtual_environment_vm.md index 3a7bbaf5..40ba1ccd 100644 --- a/docs/resources/virtual_environment/proxmox_virtual_environment_vm.md +++ b/docs/resources/virtual_environment/proxmox_virtual_environment_vm.md @@ -185,6 +185,7 @@ output "ubuntu_vm_public_key" { * `write` - (Optional) The maximum 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`). + * `datastore_id` - (Optional) The identifier for the datastore to create the cloud-init disk in (defaults to `local-lvm`). * `dns` - (Optional) The DNS configuration. * `domain` - (Optional) The DNS search domain. * `server` - (Optional) The DNS server. diff --git a/example/resource_virtual_environment_vm.tf b/example/resource_virtual_environment_vm.tf index a9f848a3..0816d6eb 100644 --- a/example/resource_virtual_environment_vm.tf +++ b/example/resource_virtual_environment_vm.tf @@ -11,6 +11,8 @@ resource "proxmox_virtual_environment_vm" "example_template" { } initialization { + datastore_id = "${element(data.proxmox_virtual_environment_datastores.example.datastore_ids, index(data.proxmox_virtual_environment_datastores.example.datastore_ids, "local-lvm"))}" + dns { server = "1.1.1.1" } diff --git a/proxmoxtf/resource_virtual_environment_vm.go b/proxmoxtf/resource_virtual_environment_vm.go index fbf88012..a3584277 100644 --- a/proxmoxtf/resource_virtual_environment_vm.go +++ b/proxmoxtf/resource_virtual_environment_vm.go @@ -43,6 +43,7 @@ const ( dvResourceVirtualEnvironmentVMDiskSpeedReadBurstable = 0 dvResourceVirtualEnvironmentVMDiskSpeedWrite = 0 dvResourceVirtualEnvironmentVMDiskSpeedWriteBurstable = 0 + dvResourceVirtualEnvironmentVMInitializationDatastoreID = "local-lvm" dvResourceVirtualEnvironmentVMInitializationDNSDomain = "" dvResourceVirtualEnvironmentVMInitializationDNSServer = "" dvResourceVirtualEnvironmentVMInitializationIPConfigIPv4Address = "" @@ -114,6 +115,7 @@ const ( mkResourceVirtualEnvironmentVMDiskSpeedWrite = "write" mkResourceVirtualEnvironmentVMDiskSpeedWriteBurstable = "write_burstable" mkResourceVirtualEnvironmentVMInitialization = "initialization" + mkResourceVirtualEnvironmentVMInitializationDatastoreID = "datastore_id" mkResourceVirtualEnvironmentVMInitializationDNS = "dns" mkResourceVirtualEnvironmentVMInitializationDNSDomain = "domain" mkResourceVirtualEnvironmentVMInitializationDNSServer = "server" @@ -506,6 +508,13 @@ func resourceVirtualEnvironmentVM() *schema.Resource { }, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ + mkResourceVirtualEnvironmentVMInitializationDatastoreID: { + Type: schema.TypeString, + Description: "The datastore id", + Optional: true, + ForceNew: true, + Default: dvResourceVirtualEnvironmentVMInitializationDatastoreID, + }, mkResourceVirtualEnvironmentVMInitializationDNS: { Type: schema.TypeList, Description: "The DNS configuration", @@ -1124,8 +1133,11 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface } if len(initialization) > 0 { + initializationBlock := initialization[0].(map[string]interface{}) + initializationDatastoreID := initializationBlock[mkResourceVirtualEnvironmentVMInitializationDatastoreID].(string) + cdromEnabled := true - cdromFileID := "local-lvm:cloudinit" + cdromFileID := fmt.Sprintf("%s:cloudinit", initializationDatastoreID) cdromMedia := "cdrom" updateBody.IDEDevices = proxmox.CustomStorageDevices{ @@ -1141,6 +1153,14 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface Media: &cdromMedia, }, } + + initializationConfig, err := resourceVirtualEnvironmentVMGetCloudInitConfig(d, m) + + if err != nil { + return err + } + + updateBody.CloudInitConfig = initializationConfig } if keyboardLayout != dvResourceVirtualEnvironmentVMKeyboardLayout { @@ -1308,8 +1328,12 @@ func resourceVirtualEnvironmentVMCreateCustom(d *schema.ResourceData, m interfac } if initializationConfig != nil { + initialization := d.Get(mkResourceVirtualEnvironmentVMInitialization).([]interface{}) + initializationBlock := initialization[0].(map[string]interface{}) + initializationDatastoreID := initializationBlock[mkResourceVirtualEnvironmentVMInitializationDatastoreID].(string) + cdromEnabled = true - cdromFileID = "local-lvm:cloudinit" + cdromFileID = fmt.Sprintf("%s:cloudinit", initializationDatastoreID) } 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. 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 { initializationDNS := map[string]interface{}{} @@ -3053,11 +3086,15 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e updateBody.CloudInitConfig = initializationConfig if updateBody.CloudInitConfig != nil { + initialization := d.Get(mkResourceVirtualEnvironmentVMInitialization).([]interface{}) + initializationBlock := initialization[0].(map[string]interface{}) + initializationDatastoreID := initializationBlock[mkResourceVirtualEnvironmentVMInitializationDatastoreID].(string) + cdromMedia := "cdrom" updateBody.IDEDevices[2] = proxmox.CustomStorageDevice{ Enabled: true, - FileVolume: "local-lvm:cloudinit", + FileVolume: fmt.Sprintf("%s:cloudinit", initializationDatastoreID), Media: &cdromMedia, } diff --git a/proxmoxtf/resource_virtual_environment_vm_test.go b/proxmoxtf/resource_virtual_environment_vm_test.go index 857c185b..46308059 100644 --- a/proxmoxtf/resource_virtual_environment_vm_test.go +++ b/proxmoxtf/resource_virtual_environment_vm_test.go @@ -197,12 +197,14 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) { initializationSchema := testNestedSchemaExistence(t, s, mkResourceVirtualEnvironmentVMInitialization) testOptionalArguments(t, initializationSchema, []string{ + mkResourceVirtualEnvironmentVMInitializationDatastoreID, mkResourceVirtualEnvironmentVMInitializationDNS, mkResourceVirtualEnvironmentVMInitializationIPConfig, mkResourceVirtualEnvironmentVMInitializationUserAccount, }) testValueTypes(t, initializationSchema, map[string]schema.ValueType{ + mkResourceVirtualEnvironmentVMInitializationDatastoreID: schema.TypeString, mkResourceVirtualEnvironmentVMInitializationDNS: schema.TypeList, mkResourceVirtualEnvironmentVMInitializationIPConfig: schema.TypeList, mkResourceVirtualEnvironmentVMInitializationUserAccount: schema.TypeList,