From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id B48536E410 for ; Mon, 23 Aug 2021 16:35:19 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id A2B9525724 for ; Mon, 23 Aug 2021 16:34:49 +0200 (CEST) Received: from mail.herold.me (mail.herold.me [IPv6:2a02:8106:0:5e02:42:c0ff:fea8:366]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id F0A6425719 for ; Mon, 23 Aug 2021 16:34:44 +0200 (CEST) X-Virus-Scanned: Yes From: Constantin Herold DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=herold.me; s=mail; t=1629729274; bh=+7+YFmrYz+2pTZ8s1feJBn18dRu+HkN04nxbFUmgPgY=; h=From:To:Cc:Subject; b=GdRox6k4OHCp/M7XiE0zSR2rLnWv7wBWIt7xhRK/W0YjIcC4smjOE/pqMBwCaFukf YRRkrYv7+cGZqM5CcIZ7DvZJsQmC2a1ad1idRUc71Dfw//SoML9uAZxxTugnKgKS04 D5LNrgRKyHpMk1fAZWXAFvnfx1GkF1WnhOk5Gi7s= To: pve-devel@lists.proxmox.com Date: Mon, 23 Aug 2021 16:34:17 +0200 Message-Id: <20210823143417.2080-1-proxmox8914@herold.me> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.338 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's domain DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from domain KAM_INFOUSMEBIZ 0.75 Prevalent use of .info|.us|.me|.me.uk|.biz|xyz|id|rocks|life domains in spam/malware SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH v2 qemu-server 1/1] fix #2429: allow to specify cloud-init vendor snippet via cicustom X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 Aug 2021 14:35:19 -0000 v2 rebase with master Any updates on this ? Patch has been available since june reference: https://lists.proxmox.com/pipermail/pve-devel/2021-June/049025.html Example: qm set 9000 --cicustom "vendor=local:snippets/vendor.yaml" cat << 'EOF' > /var/lib/vz/snippets/vendor.yaml runcmd: - apt update - apt install -y qemu-guest-agent - systemctl start qemu-guest-agent EOF Signed-off-by: Constantin Herold --- PVE/QemuServer.pm | 8 ++++++++ PVE/QemuServer/Cloudinit.pm | 23 ++++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index cc73af8..54b1ce9 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -713,6 +713,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 a5474d3..da776a9 100644 --- a/PVE/QemuServer/Cloudinit.pm +++ b/PVE/QemuServer/Cloudinit.pm @@ -227,7 +227,7 @@ 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); @@ -237,7 +237,8 @@ sub generate_configdrive2 { 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'); } @@ -493,7 +494,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); @@ -501,10 +502,16 @@ sub generate_nocloud { $meta_data = nocloud_gen_metadata($user_data, $network_data); } + # we always allocate a 4MiB disk for cloudinit and with the overhead of the ISO + # make sure we always stay below it by keeping the sum of all files below 3 MiB + 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'); } @@ -518,6 +525,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(); @@ -536,7 +544,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.23.0