On April 2, 2020 6:34 pm, Thomas Lamprecht wrote:
> On 3/30/20 1:41 PM, Fabian Grünbichler wrote:
>> the syntax is backwards compatible, providing a single storage ID or '1'
>> works like before. the new helper ensures consistent behaviour at all
>> call sites.
> 
> looks OK in general, some small things/nits inside (best to read them
> bottom up ^^)
> 
>> 
>> Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com>
>> ---
>> 
>> Notes:
>>     needs a versioned dep on pve-common with the new format and parse_idmap
>> 
>>  PVE/API2/Qemu.pm   | 41 ++++++++++++++++++++++++++++-------------
>>  PVE/QemuMigrate.pm | 24 +++++++++++-------------
>>  PVE/QemuServer.pm  | 34 ++++++++++++++++++++++++++++------
>>  3 files changed, 67 insertions(+), 32 deletions(-)
>> 
>> diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
>> index 788db93..6eba8d0 100644
>> --- a/PVE/API2/Qemu.pm
>> +++ b/PVE/API2/Qemu.pm
>> [ -- 8< -- snip -- 8< --]
>> @@ -2067,8 +2063,15 @@ __PACKAGE__->register_method({
>>      my $migration_network = $get_root_param->('migration_network');
>>      my $targetstorage = $get_root_param->('targetstorage');
>>  
>> -    raise_param_exc({ targetstorage => "targetstorage can only by used with 
>> migratedfrom." })
>> -        if $targetstorage && !$migratedfrom;
>> +    my $storagemap;
>> +
>> +    if ($targetstorage) {
>> +        raise_param_exc({ targetstorage => "targetstorage can only by used 
>> with migratedfrom." })
>> +            if !$migratedfrom;
> 
> see below for above also
> 
>> +        $storagemap = eval { PVE::JSONSchema::parse_idmap($targetstorage, 
>> 'pve-storage-id') };
>> +        raise_param_exc({ targetstorage => "failed to parse targetstorage 
>> map: $@" })
>> +            if $@;
> 
> see below about duplicated "targetstorage" in raised exception message.
> (reviewed this one bottom up, sorry ^^)
> 
>> +    }
>>  
>>      # read spice ticket from STDIN
>>      my $spice_ticket;
> 
>> @@ -3385,9 +3388,7 @@ __PACKAGE__->register_method({
>>              description => "Enable live storage migration for local disk",
>>              optional => 1,
>>          },
>> -            targetstorage => get_standard_option('pve-storage-id', {
>> -            description => "Default target storage.",
>> -            optional => 1,
>> +            targetstorage => get_standard_option('pve-targetstorage', {
>>              completion => \&PVE::QemuServer::complete_migration_storage,
> 
> Doing a cool completion handler for this will be fun ;) Actually, it should
> be to hard (and for intra cluster fast enough)

yes, for intra cluster it shouldn't be much trouble. I think completion 
for remote cluster will be ENOTIMPLEMENTED here, that one needs a proper 
multi-cluster client that then re-uses this API call ;)

>>              }),
>>          bwlimit => {
>> @@ -3451,8 +3452,22 @@ __PACKAGE__->register_method({
>>  
>>      my $storecfg = PVE::Storage::config();
>>  
>> -    if( $param->{targetstorage}) {
>> -        PVE::Storage::storage_check_node($storecfg, 
>> $param->{targetstorage}, $target);
>> +    if (my $targetstorage = $param->{targetstorage}) {
>> +        my $storagemap = eval { 
>> PVE::JSONSchema::parse_idmap($targetstorage, 'pve-storage-id') };
>> +        raise_param_exc({ targetstorage => "failed to parse targetstorage 
>> map: $@" })
> 
> This results in:
> 
>> 400 Parameter verification failed.
>> targetstorage: failed to parse targetstorage map: $@
> 
> You could thus do a s/targetstorage map/storage map/ do avoid to much
> redundancy in the raised error message.

yes, that makes sense :)

> 
>> +            if $@;
>> +
>> +        foreach my $source (keys %{$storagemap->{entries}}) {
>> +            PVE::Storage::storage_check_node($storecfg, 
>> $storagemap->{entries}->{$source}, $target);
>> +        }
> 
> Was there any reason to not iterate over `values %hash`, like:
> 
> foreach my $source (values %{$storagemap->{entries}}) {
>     PVE::Storage::storage_check_node($storecfg, $source, $target);
> }
> 
> for above?

none other than habit :)

> 
>> +
>> +        PVE::Storage::storage_check_node($storecfg, $storagemap->{default}, 
>> $target)
>> +            if $storagemap->{default};
>> +
>> +        PVE::QemuServer::check_storage_availability($storecfg, $conf, 
>> $target)
>> +            if $storagemap->{identity};
>> +
>> +        $param->{storagemap} = $storagemap;
>>          } else {
>>          PVE::QemuServer::check_storage_availability($storecfg, $conf, 
>> $target);
>>      }
>> [ -- 8< -- snip -- 8< --]> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
>> index 1ac8643..cd534f4 100644
>> --- a/PVE/QemuServer.pm
>> +++ b/PVE/QemuServer.pm
>> @@ -97,6 +97,28 @@ 
>> PVE::JSONSchema::register_standard_option('pve-qemu-machine', {
>>      optional => 1,
>>  });
>>  
>> +
>> +sub map_storage {
>> +    my ($map, $source) = @_;
>> +
>> +    return $source if !defined($map);
>> +
>> +    return $map->{entries}->{$source}
>> +    if defined($map->{entries}) && $map->{entries}->{$source};
> 
> should/could be:
> 
>     if $map->{entries} && exists $map->{entries}->{$source};
> 
>> +
>> +    return $map->{default} if $map->{default};
>> +
>> +    # identity (fallback)
>> +    return $source;
>> +}
>> [ -- 8< -- snip -- 8< --]
> 
> 
> 

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to