From: Alexandre Derumier <aderumier@odiso.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH v7 qemu-server 08/10] api2: add cloudinit_update
Date: Wed, 22 Jun 2022 13:52:04 +0200 [thread overview]
Message-ID: <20220622115206.3295425-9-aderumier@odiso.com> (raw)
In-Reply-To: <20220622115206.3295425-1-aderumier@odiso.com>
This allow to regenerate the config drive with 1 api call.
This also avoid to delete drive first, and recreate it again.
As it's a readonly drive, we can simply live update it,
and eject/replace it with qemu monitor
Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
---
PVE/API2/Qemu.pm | 43 +++++++++++++++++++++++++++++++++++++++++++
PVE/CLI/qm.pm | 3 ++-
PVE/QemuServer.pm | 28 ++++++++++++++++++++++++++++
3 files changed, 73 insertions(+), 1 deletion(-)
diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 17d912c..6142504 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -1357,6 +1357,49 @@ __PACKAGE__->register_method({
return $res;
}});
+__PACKAGE__->register_method({
+ name => 'cloudinit_update',
+ path => '{vmid}/cloudinit',
+ method => 'PUT',
+ protected => 1,
+ proxyto => 'node',
+ description => "Regenerate and change cloudinit config drive.",
+ permissions => {
+ check => ['perm', '/vms/{vmid}', 'VM.Config.Cloudinit'],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ vmid => get_standard_option('pve-vmid'),
+ },
+ },
+ returns => { type => 'null' },
+ code => sub {
+ my ($param) = @_;
+
+ my $rpcenv = PVE::RPCEnvironment::get();
+
+ my $authuser = $rpcenv->get_user();
+
+ my $vmid = extract_param($param, 'vmid');
+
+ my $updatefn = sub {
+
+ my $conf = PVE::QemuConfig->load_config($vmid);
+
+ PVE::QemuConfig->check_lock($conf);
+
+ my $storecfg = PVE::Storage::config();
+
+ PVE::QemuServer::vmconfig_update_cloudinit_drive($storecfg, $conf, $vmid);
+ };
+
+ PVE::QemuConfig->lock_config($vmid, $updatefn);
+
+ return;
+ }});
+
# POST/PUT {vmid}/config implementation
#
# The original API used PUT (idempotent) an we assumed that all operations
diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm
index f7336a7..0818105 100755
--- a/PVE/CLI/qm.pm
+++ b/PVE/CLI/qm.pm
@@ -986,7 +986,8 @@ our $cmddef = {
my $data = shift;
print "$data\n";
}],
- pending => [ "PVE::API2::Qemu", 'cloudinit_pending', ['vmid'], { node => $nodename }, \&PVE::GuestHelpers::format_pending ]
+ pending => [ "PVE::API2::Qemu", 'cloudinit_pending', ['vmid'], { node => $nodename }, \&PVE::GuestHelpers::format_pending ],
+ update => [ "PVE::API2::Qemu", 'cloudinit_update', ['vmid'], { node => $nodename }],
},
};
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 818285b..278a7b6 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -5293,6 +5293,34 @@ sub vmconfig_update_disk {
vm_deviceplug($storecfg, $conf, $vmid, $opt, $drive, $arch, $machine_type);
}
+sub vmconfig_update_cloudinit_drive {
+ my ($storecfg, $conf, $vmid) = @_;
+
+ my $cloudinit_ds = undef;
+ my $cloudinit_drive = undef;
+
+ PVE::QemuConfig->foreach_volume($conf, sub {
+ my ($ds, $drive) = @_;
+ if (PVE::QemuServer::drive_is_cloudinit($drive)) {
+ $cloudinit_ds = $ds;
+ $cloudinit_drive = $drive;
+ }
+ });
+
+ return if !$cloudinit_drive;
+
+ PVE::QemuServer::Cloudinit::generate_cloudinitconfig($conf, $vmid);
+ my $running = PVE::QemuServer::check_running($vmid);
+
+ if ($running) {
+ my $path = PVE::Storage::path($storecfg, $cloudinit_drive->{file});
+ if ($path) {
+ mon_cmd($vmid, "eject", force => JSON::true, id => "$cloudinit_ds");
+ mon_cmd($vmid, "blockdev-change-medium", id => "$cloudinit_ds", filename => "$path");
+ }
+ }
+}
+
# called in locked context by incoming migration
sub vm_migrate_get_nbd_disks {
my ($storecfg, $conf, $replicated_volumes) = @_;
--
2.30.2
next prev parent reply other threads:[~2022-06-22 11:52 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-22 11:51 [pve-devel] [PATCH v7 qemu-server 00/10] cloudinit pending behaviour change Alexandre Derumier
2022-06-22 11:51 ` [pve-devel] [PATCH v7 qemu-server 01/10] qemuconfig: load_current_config : delete cloudinit value Alexandre Derumier
2022-06-22 11:51 ` [pve-devel] [PATCH v7 qemu-server 02/10] vzdump : skip special:cloudinit section Alexandre Derumier
2022-06-22 11:51 ` [pve-devel] [PATCH v7 qemu-server 03/10] migration: test targetnode min version for cloudinit section Alexandre Derumier
2022-06-22 11:52 ` [pve-devel] [PATCH v7 qemu-server 04/10] cloudinit: add cloudinit section for current generated config Alexandre Derumier
2022-06-22 11:52 ` [pve-devel] [PATCH v7 qemu-server 05/10] generate cloudinit drive on offline plug Alexandre Derumier
2022-06-22 11:52 ` [pve-devel] [PATCH v7 qemu-server 06/10] cloudinit: make cloudnit options fastplug Alexandre Derumier
2022-06-22 11:52 ` [pve-devel] [PATCH v7 qemu-server 07/10] api2: add cloudinit config api Alexandre Derumier
2022-06-22 11:52 ` Alexandre Derumier [this message]
2022-06-22 11:52 ` [pve-devel] [PATCH v7 qemu-server 09/10] add cloudinit hotplug Alexandre Derumier
2022-06-22 11:52 ` [pve-devel] [PATCH v7 qemu-server 10/10] debian : control : add a break on pve-manager <= 7.2.4 Alexandre Derumier
2022-06-23 7:22 ` Fabian Ebner
2022-06-23 7:59 ` DERUMIER, Alexandre
2022-07-27 11:19 ` [pve-devel] [PATCH v7 qemu-server 00/10] cloudinit pending behaviour change Fiona Ebner
2022-08-31 9:40 ` DERUMIER, Alexandre
2022-09-02 12:54 ` Fiona Ebner
2022-09-02 16:42 ` DERUMIER, Alexandre
[not found] ` <mailman.41.1662364805.354.pve-devel@lists.proxmox.com>
2022-09-06 7:24 ` DERUMIER, Alexandre
2022-11-08 16:44 ` [pve-devel] applied-series: " Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220622115206.3295425-9-aderumier@odiso.com \
--to=aderumier@odiso.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.