[pve-devel] applied: [PATCH v6 manager 1/2] vzdump: move remaining guest include logic to single method

Thomas Lamprecht t.lamprecht at proxmox.com
Wed Jun 17 15:50:09 CEST 2020


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.lauterer at 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},
};




More information about the pve-devel mailing list