From: Fiona Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH qemu-server v5 13/16] config: add fleecing section
Date: Mon, 27 Jan 2025 12:29:20 +0100 [thread overview]
Message-ID: <20250127112923.31703-14-f.ebner@proxmox.com> (raw)
In-Reply-To: <20250127112923.31703-1-f.ebner@proxmox.com>
Will be used for improved cleanup of fleecing images.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
PVE/API2/Qemu.pm | 3 ++
PVE/QemuServer.pm | 29 ++++++++++++++-----
test/parse-config-input/fleecing-section.conf | 20 +++++++++++++
test/run_parse_config_tests.pl | 2 +-
4 files changed, 46 insertions(+), 8 deletions(-)
create mode 100644 test/parse-config-input/fleecing-section.conf
diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 084e4efb..0bda4426 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -5955,6 +5955,9 @@ __PACKAGE__->register_method({
my $special_sections = delete $new_conf->{'special-sections'} // {};
+ # fleecing state is specific to source side
+ delete $special_sections->{fleecing};
+
$new_conf->{skip_cloud_init} = 1; # re-use image from source side
# TODO PVE 10 - remove backwards-compat handling?
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 7711014d..dba95975 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -2195,6 +2195,16 @@ sub destroy_vm {
}
}
+my $fleecing_section_schema = {
+ 'fleecing-images' => {
+ type => 'string',
+ format => 'pve-volume-id-list',
+ description => "For internal use only. List of fleecing images allocated during backup."
+ ." If no backup is running, these are left-overs that failed to be removed.",
+ optional => 1,
+ },
+};
+
sub parse_vm_config {
my ($filename, $raw, $strict) = @_;
@@ -2233,23 +2243,28 @@ sub parse_vm_config {
$descr = undef;
};
- my $special_sections_re_1 = qr/(cloudinit)/;
+ my $special_schemas = {
+ cloudinit => $confdesc, # not actually used right now, see below
+ fleecing => $fleecing_section_schema,
+ };
+ my $special_sections_re_string = join('|', keys $special_schemas->%*);
+ my $special_sections_re_1 = qr/($special_sections_re_string)/;
- my $section = { name => '', type => 'main' };
+ my $section = { name => '', type => 'main', schema => $confdesc };
my @lines = split(/\n/, $raw);
foreach my $line (@lines) {
next if $line =~ m/^\s*$/;
if ($line =~ m/^\[PENDING\]\s*$/i) {
- $section = { name => 'pending', type => 'pending' };
+ $section = { name => 'pending', type => 'pending', schema => $confdesc };
$finish_description->();
$handle_error->("vm $vmid - duplicate section: $section->{name}\n")
if defined($res->{$section->{name}});
$conf = $res->{$section->{name}} = {};
next;
} elsif ($line =~ m/^\[special:$special_sections_re_1\]\s*$/i) {
- $section = { name => $1, type => 'special' };
+ $section = { name => $1, type => 'special', schema => $special_schemas->{$1} };
$finish_description->();
$handle_error->("vm $vmid - duplicate special section: $section->{name}\n")
if defined($res->{'special-sections'}->{$section->{name}});
@@ -2257,7 +2272,7 @@ sub parse_vm_config {
next;
} elsif ($line =~ m/^\[([a-z][a-z0-9_\-]+)\]\s*$/i) {
- $section = { name => $1, type => 'snapshot' };
+ $section = { name => $1, type => 'snapshot', schema => $confdesc };
$finish_description->();
$handle_error->("vm $vmid - duplicate snapshot section: $section->{name}\n")
if defined($res->{snapshots}->{$section->{name}});
@@ -2303,12 +2318,12 @@ sub parse_vm_config {
$conf->{$key} = $value;
next;
}
- eval { $value = check_type($key, $value, $confdesc); };
+ eval { $value = check_type($key, $value, $section->{schema}); };
if ($@) {
$handle_error->("vm $vmid - unable to parse value of '$key' - $@");
} else {
$key = 'ide2' if $key eq 'cdrom';
- my $fmt = $confdesc->{$key}->{format};
+ my $fmt = $section->{schema}->{$key}->{format};
if ($fmt && $fmt =~ /^pve-qm-(?:ide|scsi|virtio|sata)$/) {
my $v = parse_drive($key, $value);
if (my $volid = filename_to_volume_id($vmid, $v->{file}, $v->{media})) {
diff --git a/test/parse-config-input/fleecing-section.conf b/test/parse-config-input/fleecing-section.conf
new file mode 100644
index 00000000..ee89dc56
--- /dev/null
+++ b/test/parse-config-input/fleecing-section.conf
@@ -0,0 +1,20 @@
+boot: order=scsi0
+cores: 2
+cpu: x86-64-v2-AES
+ide2: lvm:vm-120-cloudinit,media=cdrom
+ipconfig0: ip6=dhcp
+memory: 4096
+meta: creation-qemu=9.0.2,ctime=1725975013
+name: deb1223
+net0: vmxnet3=BC:24:11:2C:69:EC,bridge=vnet0,firewall=1
+numa: 0
+ostype: l26
+scsi0: nfs:120/vm-120-disk-0.qcow2,iothread=1,size=4G
+scsihw: virtio-scsi-single
+smbios1: uuid=b3247ab1-1fe6-428e-965b-08a1b64a8746
+sockets: 1
+unused0: rbd:vm-120-disk-0
+vmgenid: 7079e97c-50e3-4079-afe7-23e67566b946
+
+[special:fleecing]
+fleecing-images: zfs:vm-120-fleece-0
diff --git a/test/run_parse_config_tests.pl b/test/run_parse_config_tests.pl
index bc7ad86e..b353ea19 100755
--- a/test/run_parse_config_tests.pl
+++ b/test/run_parse_config_tests.pl
@@ -26,7 +26,7 @@ my $OUTPUT_DIR = './parse-config-output';
my $EXPECTED_DIR = './parse-config-expected';
# NOTE update when you add/remove tests
-plan tests => 2 * 9;
+plan tests => 2 * 10;
sub run_tests {
my ($strict) = @_;
--
2.39.5
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next prev parent reply other threads:[~2025-01-27 11:31 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-27 11:29 [pve-devel] [PATCH-SERIES qemu-server v5 00/16] more robust handling of fleecing images Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 01/16] migration: remove unused variable Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 02/16] test: avoid duplicate mock module in restore config test Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 03/16] test: add parse config tests Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 04/16] parse config: be precise about section type checks Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 05/16] test: add test case exposing issue with unknown sections Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 06/16] parse config: skip unknown sections and warn about their presence Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 07/16] vzdump: anchor matches for pending and special sections Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 08/16] vzdump: skip all " Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 09/16] config: make special section handling generic Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 10/16] test: parse config: test config with duplicate sections Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 11/16] parse config: warn about " Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 12/16] check type: require schema as an argument Fiona Ebner
2025-01-27 11:29 ` Fiona Ebner [this message]
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 14/16] fix #5440: vzdump: better cleanup fleecing images after hard errors Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 15/16] migration: attempt to clean up potential left-over fleecing images Fiona Ebner
2025-01-27 11:29 ` [pve-devel] [PATCH qemu-server v5 16/16] destroy vm: " Fiona Ebner
2025-03-07 10:45 ` [pve-devel] [PATCH-SERIES qemu-server v5 00/16] more robust handling of " Fiona Ebner
2025-04-07 13:11 ` [pve-devel] applied: " 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=20250127112923.31703-14-f.ebner@proxmox.com \
--to=f.ebner@proxmox.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox