From 7f87414894716ef835521f177f4091884befe100 Mon Sep 17 00:00:00 2001 From: Fabian Ebner Date: Thu, 22 Oct 2020 12:30:13 +0200 Subject: [PATCH] backup: include IDs for non-existent guests Like this, there will be a backup task (within the big worker task) for such IDs, which will then visibly (i.e. also visible in the notification mail) fail with, e.g.: unable to find VM '123' In get_included_guests, the key '' was chosen for the orphaned IDs, because it cannot possibly denote a nodename. Signed-off-by: Fabian Ebner --- PVE/API2/VZDump.pm | 4 ++++ PVE/VZDump.pm | 19 +++++++++++++------ test/vzdump_guest_included_test.pl | 13 ++++++++++++- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/PVE/API2/VZDump.pm b/PVE/API2/VZDump.pm index 19fa1e3b..806ac7fd 100644 --- a/PVE/API2/VZDump.pm +++ b/PVE/API2/VZDump.pm @@ -74,6 +74,10 @@ __PACKAGE__->register_method ({ my $local_vmids = delete $vmids_per_node->{$nodename} // []; + # include IDs for deleted guests, and visibly fail later + my $orphaned_vmids = delete $vmids_per_node->{''} // []; + push @{$local_vmids}, @{$orphaned_vmids}; + my $skiplist = [ map { @$_ } values $vmids_per_node->%* ]; if($param->{stop}){ diff --git a/PVE/VZDump.pm b/PVE/VZDump.pm index 7b4303f1..83669a84 100644 --- a/PVE/VZDump.pm +++ b/PVE/VZDump.pm @@ -1074,9 +1074,12 @@ sub exec_backup { my $vmlist = PVE::Cluster::get_vmlist(); foreach my $vmid (@{$opts->{vmids}}) { - my $guest_type = $vmlist->{ids}->{$vmid}->{type}; - my $plugin = $vzdump_plugins->{$guest_type}; - next if !$rpcenv->check($authuser, "/vms/$vmid", [ 'VM.Backup' ], $opts->{all}); + my $plugin; + if (defined($vmlist->{ids}->{$vmid})) { + my $guest_type = $vmlist->{ids}->{$vmid}->{type}; + $plugin = $vzdump_plugins->{$guest_type}; + next if !$rpcenv->check($authuser, "/vms/$vmid", [ 'VM.Backup' ], $opts->{all}); + } push @$tasklist, { mode => $opts->{mode}, plugin => $plugin, @@ -1218,10 +1221,14 @@ sub get_included_guests { $vmids = check_vmids(@$vmids); for my $vmid (@$vmids) { - my $node = $vmlist->{ids}->{$vmid}->{node}; - next if (defined $job->{node} && $job->{node} ne $node); + if (defined($vmlist->{ids}->{$vmid})) { + my $node = $vmlist->{ids}->{$vmid}->{node}; + next if (defined $job->{node} && $job->{node} ne $node); - push @{$vmids_per_node->{$node}}, $vmid; + push @{$vmids_per_node->{$node}}, $vmid; + } else { + push @{$vmids_per_node->{''}}, $vmid; + } } return $vmids_per_node; diff --git a/test/vzdump_guest_included_test.pl b/test/vzdump_guest_included_test.pl index eb663ad3..157644de 100755 --- a/test/vzdump_guest_included_test.pl +++ b/test/vzdump_guest_included_test.pl @@ -5,7 +5,7 @@ use warnings; use lib '..'; -use Test::More tests => 9; +use Test::More tests => 10; use Test::MockModule; use PVE::VZDump; @@ -174,6 +174,17 @@ $addtest->('Test selected VMIDs on other nodes', { } }); +$addtest->('Test VMID not present in vmlist', { + expected => { + node1 => [ 100 ], + node2 => [ 201, 212 ], + '' => [ 7654 ], + }, + param => { + vmid => '100, 201, 212, 7654', + } +}); + for my $test (@{$tests}) { my $testname = $test->{name}; -- 2.39.2