Will be used for improved cleanup of fleecing images. Signed-off-by: Fiona Ebner <f.eb...@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