0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-07-10 15:55:01 +00:00

feat(vm): Add cloud-init network-config support (#197)

* feat: Add cloud-init network-config support

* add documentation entry

* fix re-apply use case

Co-authored-by: Pavel Boldyrev <627562+bpg@users.noreply.github.com>
This commit is contained in:
Gertjan Roggemans 2023-01-02 00:17:08 +01:00 committed by GitHub
parent 60a68184cf
commit 79a2101933
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 1 deletions

View File

@ -224,6 +224,8 @@ output "ubuntu_vm_public_key" {
* `keys` - (Optional) The SSH keys. * `keys` - (Optional) The SSH keys.
* `password` - (Optional) The SSH password. * `password` - (Optional) The SSH password.
* `username` - (Optional) The SSH username. * `username` - (Optional) The SSH username.
* `network_data_file_id` - (Optional) The identifier for a file containing network configuration data passed to the
VM via cloud-init (conflicts with `ip_config`).
* `user_data_file_id` - (Optional) The identifier for a file containing custom user data (conflicts * `user_data_file_id` - (Optional) The identifier for a file containing custom user data (conflicts
with `user_account`). with `user_account`).
* `vendor_data_file_id` - (Optional) The identifier for a file containing all vendor data passed to the VM via cloud-init. * `vendor_data_file_id` - (Optional) The identifier for a file containing all vendor data passed to the VM via cloud-init.

View File

@ -1310,7 +1310,7 @@ func (r *CustomCloudInitFiles) UnmarshalJSON(b []byte) error {
case "meta": case "meta":
r.MetaVolume = &v[1] r.MetaVolume = &v[1]
case "network": case "network":
r.MetaVolume = &v[1] r.NetworkVolume = &v[1]
case "user": case "user":
r.UserVolume = &v[1] r.UserVolume = &v[1]
case "vendor": case "vendor":

View File

@ -76,6 +76,7 @@ const (
dvResourceVirtualEnvironmentVMInitializationUserAccountPassword = "" dvResourceVirtualEnvironmentVMInitializationUserAccountPassword = ""
dvResourceVirtualEnvironmentVMInitializationUserDataFileID = "" dvResourceVirtualEnvironmentVMInitializationUserDataFileID = ""
dvResourceVirtualEnvironmentVMInitializationVendorDataFileID = "" dvResourceVirtualEnvironmentVMInitializationVendorDataFileID = ""
dvResourceVirtualEnvironmentVMInitializationNetworkDataFileID = ""
dvResourceVirtualEnvironmentVMInitializationType = "" dvResourceVirtualEnvironmentVMInitializationType = ""
dvResourceVirtualEnvironmentVMKeyboardLayout = "en-us" dvResourceVirtualEnvironmentVMKeyboardLayout = "en-us"
dvResourceVirtualEnvironmentVMMachineType = "" dvResourceVirtualEnvironmentVMMachineType = ""
@ -183,6 +184,7 @@ const (
mkResourceVirtualEnvironmentVMInitializationUserAccountUsername = "username" mkResourceVirtualEnvironmentVMInitializationUserAccountUsername = "username"
mkResourceVirtualEnvironmentVMInitializationUserDataFileID = "user_data_file_id" mkResourceVirtualEnvironmentVMInitializationUserDataFileID = "user_data_file_id"
mkResourceVirtualEnvironmentVMInitializationVendorDataFileID = "vendor_data_file_id" mkResourceVirtualEnvironmentVMInitializationVendorDataFileID = "vendor_data_file_id"
mkResourceVirtualEnvironmentVMInitializationNetworkDataFileID = "network_data_file_id"
mkResourceVirtualEnvironmentVMIPv4Addresses = "ipv4_addresses" mkResourceVirtualEnvironmentVMIPv4Addresses = "ipv4_addresses"
mkResourceVirtualEnvironmentVMIPv6Addresses = "ipv6_addresses" mkResourceVirtualEnvironmentVMIPv6Addresses = "ipv6_addresses"
mkResourceVirtualEnvironmentVMKeyboardLayout = "keyboard_layout" mkResourceVirtualEnvironmentVMKeyboardLayout = "keyboard_layout"
@ -782,6 +784,14 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Default: dvResourceVirtualEnvironmentVMInitializationVendorDataFileID, Default: dvResourceVirtualEnvironmentVMInitializationVendorDataFileID,
ValidateDiagFunc: getFileIDValidator(), ValidateDiagFunc: getFileIDValidator(),
}, },
mkResourceVirtualEnvironmentVMInitializationNetworkDataFileID: {
Type: schema.TypeString,
Description: "The ID of a file containing network config",
Optional: true,
ForceNew: true,
Default: dvResourceVirtualEnvironmentVMInitializationNetworkDataFileID,
ValidateDiagFunc: getFileIDValidator(),
},
mkResourceVirtualEnvironmentVMInitializationType: { mkResourceVirtualEnvironmentVMInitializationType: {
Type: schema.TypeString, Type: schema.TypeString,
Description: "The cloud-init configuration format", Description: "The cloud-init configuration format",
@ -2315,6 +2325,15 @@ func resourceVirtualEnvironmentVMGetCloudInitConfig(d *schema.ResourceData) (*pr
initializationConfig.Files.VendorVolume = &initializationVendorDataFileID initializationConfig.Files.VendorVolume = &initializationVendorDataFileID
} }
initializationNetworkDataFileID := initializationBlock[mkResourceVirtualEnvironmentVMInitializationNetworkDataFileID].(string)
if initializationNetworkDataFileID != "" {
if initializationConfig.Files == nil {
initializationConfig.Files = &proxmox.CustomCloudInitFiles{}
}
initializationConfig.Files.NetworkVolume = &initializationNetworkDataFileID
}
initializationType := initializationBlock[mkResourceVirtualEnvironmentVMInitializationType].(string) initializationType := initializationBlock[mkResourceVirtualEnvironmentVMInitializationType].(string)
if initializationType != "" { if initializationType != "" {
@ -3183,9 +3202,15 @@ func resourceVirtualEnvironmentVMReadCustom(ctx context.Context, d *schema.Resou
} else { } else {
initialization[mkResourceVirtualEnvironmentVMInitializationVendorDataFileID] = "" initialization[mkResourceVirtualEnvironmentVMInitializationVendorDataFileID] = ""
} }
if vmConfig.CloudInitFiles.NetworkVolume != nil {
initialization[mkResourceVirtualEnvironmentVMInitializationNetworkDataFileID] = *vmConfig.CloudInitFiles.NetworkVolume
} else {
initialization[mkResourceVirtualEnvironmentVMInitializationNetworkDataFileID] = ""
}
} else if len(initialization) > 0 { } else if len(initialization) > 0 {
initialization[mkResourceVirtualEnvironmentVMInitializationUserDataFileID] = "" initialization[mkResourceVirtualEnvironmentVMInitializationUserDataFileID] = ""
initialization[mkResourceVirtualEnvironmentVMInitializationVendorDataFileID] = "" initialization[mkResourceVirtualEnvironmentVMInitializationVendorDataFileID] = ""
initialization[mkResourceVirtualEnvironmentVMInitializationNetworkDataFileID] = ""
} }
if vmConfig.CloudInitType != nil { if vmConfig.CloudInitType != nil {