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

Aaron Lauterer a.lauterer at proxmox.com
Thu Jun 18 08:42:53 CEST 2020



On 6/17/20 3:50 PM, Thomas Lamprecht wrote:
> 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).

sounds good and sorry for that style slip, must have pressed undo one or 
two times too many at some point without noticing it ;)
> 
>> 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