From 101beafe0d50b79825a86da9f577f156a0b1fc8c Mon Sep 17 00:00:00 2001 From: Constantin Herold Date: Sat, 30 Oct 2021 16:49:41 +0200 Subject: [PATCH 1/1] fix #2429: allow to specify cloud-init vendor snippet via cicustom Signed-off-by: Constantin Herold Reviewed-by: Mira Limbeck --- PVE/QemuServer.pm | 8 ++++++++ PVE/QemuServer/Cloudinit.pm | 25 ++++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index 8e36848..581d1d6 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -734,6 +734,14 @@ my $cicustom_fmt = { format => 'pve-volume-id', format_description => 'volume', }, + vendor => { + type => 'string', + optional => 1, + description => 'Specify a custom file containing all vendor data passed to the VM via' + .' cloud-init.', + format => 'pve-volume-id', + format_description => 'volume', + }, }; PVE::JSONSchema::register_format('pve-qm-cicustom', $cicustom_fmt); diff --git a/PVE/QemuServer/Cloudinit.pm b/PVE/QemuServer/Cloudinit.pm index 9dc46ae..420566e 100644 --- a/PVE/QemuServer/Cloudinit.pm +++ b/PVE/QemuServer/Cloudinit.pm @@ -227,17 +227,22 @@ EOF sub generate_configdrive2 { my ($conf, $vmid, $drive, $volname, $storeid) = @_; - my ($user_data, $network_data, $meta_data) = get_custom_cloudinit_files($conf); + my ($user_data, $network_data, $meta_data, $vendor_data) = get_custom_cloudinit_files($conf); $user_data = cloudinit_userdata($conf, $vmid) if !defined($user_data); $network_data = configdrive2_network($conf) if !defined($network_data); if (!defined($meta_data)) { $meta_data = configdrive2_gen_metadata($user_data, $network_data); } + + my $sum = length($user_data) + length($network_data) + length($meta_data) + length($vendor_data); + die "Cloud-Init sum of snippets too big (> 3 MiB)\n" if $sum > (3 * 1024 * 1024); + my $files = { '/openstack/latest/user_data' => $user_data, '/openstack/content/0000' => $network_data, - '/openstack/latest/meta_data.json' => $meta_data + '/openstack/latest/meta_data.json' => $meta_data, + '/openstack/latest/vendor_data.json' => $vendor_data }; commit_cloudinit_disk($conf, $vmid, $drive, $volname, $storeid, $files, 'config-2'); } @@ -476,7 +481,7 @@ sub nocloud_gen_metadata { sub generate_nocloud { my ($conf, $vmid, $drive, $volname, $storeid) = @_; - my ($user_data, $network_data, $meta_data) = get_custom_cloudinit_files($conf); + my ($user_data, $network_data, $meta_data, $vendor_data) = get_custom_cloudinit_files($conf); $user_data = cloudinit_userdata($conf, $vmid) if !defined($user_data); $network_data = nocloud_network($conf) if !defined($network_data); @@ -484,10 +489,14 @@ sub generate_nocloud { $meta_data = nocloud_gen_metadata($user_data, $network_data); } + my $sum = length($user_data) + length($network_data) + length($meta_data) + length($vendor_data); + die "Cloud-Init sum of snippets too big (> 3 MiB)\n" if $sum > (3 * 1024 * 1024); + my $files = { '/user-data' => $user_data, '/network-config' => $network_data, - '/meta-data' => $meta_data + '/meta-data' => $meta_data, + '/vendor-data' => $vendor_data }; commit_cloudinit_disk($conf, $vmid, $drive, $volname, $storeid, $files, 'cidata'); } @@ -501,6 +510,7 @@ sub get_custom_cloudinit_files { my $network_volid = $files->{network}; my $user_volid = $files->{user}; my $meta_volid = $files->{meta}; + my $vendor_volid = $files->{vendor}; my $storage_conf = PVE::Storage::config(); @@ -519,7 +529,12 @@ sub get_custom_cloudinit_files { $meta_data = read_cloudinit_snippets_file($storage_conf, $meta_volid); } - return ($user_data, $network_data, $meta_data); + my $vendor_data; + if ($vendor_volid) { + $vendor_data = read_cloudinit_snippets_file($storage_conf, $vendor_volid); + } + + return ($user_data, $network_data, $meta_data, $vendor_data); } sub read_cloudinit_snippets_file { -- 2.39.2