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) > }), > 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. > + 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? > + > + 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