Am 6/17/20 um 2:13 PM schrieb Aaron Lauterer: > The `guest include` logic handling `all` and `exclude` parameters was in > the `PVE::VZDump->exec_backup()` method. Moving this logic into the > `get_included_guests` method allows us to simplify and generalize it. > > This helps to make the overall logic easier to test and develop other > features around vzdump backup jobs. > > The method now returns a hash with node names as keys mapped to arrays > of VMIDs on these nodes that are included in the vzdump job. > > The VZDump API call to create a new backup is adapted to use the new > method to create the list of local VMIDs and the skiplist. > > Permission checks are kept where they are to be able to handle missing > permissions according to the current context. The old behavior to die > on a backup job when the user is missing the permission to a guest and > the job is not an 'all' or 'exclude' job is kept. > > Signed-off-by: Aaron Lauterer <a.laute...@proxmox.com> > --- > > v5 -> v6: > * incorporate suggested changes > * did not move sorting in PVE::VZDump::get_included_guests into the `if` > clause because that would sort them only for `all` and/or `exclude` > jobs but the VMIDs can be provided in random order for other job types > like manually selected VMIDs as well. > > v4 -> v5: > * move handling of `all` and `exlcude` cases from > `PVE::VZDump->exec_backup` to `PVE::VZDump->get_included_guests` > * change return value to hash of node names with arrays of included > VMIDs to be more general > * adapt API call to start a VZDump job accordingly. Creating the list of > local VMIDs and the skiplist is handled right there again as so far > this is the only place where that kind of separation is needed > > v3 -> v4: > * reworked the whole logic according to the discussion with > fabian [1]. > * re-added missing early exit > > [1] https://pve.proxmox.com/pipermail/pve-devel/2020-March/042451.html > > PVE/API2/VZDump.pm | 19 ++++++----- > PVE/VZDump.pm | 80 ++++++++++++++++++++++------------------------ > 2 files changed, 50 insertions(+), 49 deletions(-)
applied, thanks! made a few small followups, most importan pulling the sorting inside check_vmid, as that generates a new array anyway so needs to iterate over all, and a style fix (see below). > diff --git a/PVE/VZDump.pm b/PVE/VZDump.pm > index bdbf641e..2f477606 100644 > --- a/PVE/VZDump.pm > +++ b/PVE/VZDump.pm > @@ -1044,29 +1044,23 @@ sub exec_backup { > if scalar(@{$self->{skiplist}}); > > my $tasklist = []; > + my $vzdump_plugins = {}; > + foreach my $plugin (@{$self->{plugins}}) { > + my $type = $plugin->type(); > + next if exists $vzdump_plugins->{$type}; > + $vzdump_plugins->{$type} = $plugin; > + } > > - if ($opts->{all}) { > - foreach my $plugin (@{$self->{plugins}}) { > - my $vmlist = $plugin->vmlist(); > - foreach my $vmid (sort @$vmlist) { > - next if grep { $_ eq $vmid } @{$opts->{exclude}}; > - next if !$rpcenv->check($authuser, "/vms/$vmid", [ 'VM.Backup' > ], 1); > - push @$tasklist, { vmid => $vmid, state => 'todo', plugin => > $plugin, mode => $opts->{mode} }; > - } > - } > - } else { > - foreach my $vmid (sort @{$opts->{vmids}}) { > - my $plugin; > - foreach my $pg (@{$self->{plugins}}) { > - my $vmlist = $pg->vmlist(); > - if (grep { $_ eq $vmid } @$vmlist) { > - $plugin = $pg; > - last; > - } > - } > - $rpcenv->check($authuser, "/vms/$vmid", [ 'VM.Backup' ]); > - push @$tasklist, { vmid => $vmid, state => 'todo', plugin => > $plugin, mode => $opts->{mode} }; > - } > + my $vmlist = PVE::Cluster::get_vmlist(); > + foreach my $vmid (sort @{$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}); > + push @$tasklist, { > + vmid => $vmid, > + state => 'todo', > + plugin => $plugin, > + mode => $opts->{mode} }; For hashes: * always a trailing comma, allows to make insertions without touching any existing line at the end * closing brace on new line: * optionally and not always wanted, sort keys alphabetically push @$tasklist, { vmid => $vmid, state => 'todo', plugin => $plugin, mode => $opts->{mode}, }; _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel