On 3/30/20 1:41 PM, Fabian Grünbichler wrote: > generalized from the start to support extension to bridges or other > entities as well. > > this gets us incremental support for the CLI, e.g.: > > --targetstorage foo:bar --targetstorage bar:baz --targetstorage foo > > creates a mapping of > > foo=>bar > bar=>baz > > with a default of foo
looks OK, some small related issues commented below - I can fix 'em up here locally if you want, though. > > Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com> > --- > src/PVE/JSONSchema.pm | 60 +++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 60 insertions(+) > > diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm > index fa405ac..2073348 100644 > --- a/src/PVE/JSONSchema.pm > +++ b/src/PVE/JSONSchema.pm > @@ -210,6 +210,66 @@ sub pve_verify_node_name { > return $node; > } > > +sub parse_idmap { > + my ($idmap, $idformat) = @_; > + > + return undef if !$idmap; > + > + my $map = {}; > + > + foreach my $entry (PVE::Tools::split_list($idmap)) { > + if ($entry eq '1') { > + $map->{identity} = 1; > + } elsif ($entry =~ m/^([^:]+):([^:]+)$/) { > + my ($source, $target) = ($1, $2); > + eval { > + PVE::JSONSchema::check_format($idformat, $source, ''); > + PVE::JSONSchema::check_format($idformat, $target, ''); And we always want to have the same format for both sides? I mean sounds OK as it's an id-map, i.e., a map of the same type. > + }; > + die "entry '$entry' contains invalid ID - $@\n" > + if $@; > + > + die "duplicate mapping for source '$source'\n" > + if $map->{entries}->{$source}; Above would miss a already set $source with falsy $target values like "0", use: if exists $map->{... > + > + $map->{entries}->{$source} = $target; > + } else { > + eval { > + PVE::JSONSchema::check_format($idformat, $entry); > + }; > + > + die "entry '$entry' contains invalid ID - $@\n" > + if $@; > + > + die "default target ID can only be provided once\n" > + if $map->{default}; Sam as above, $entry could have been "0" (as $idformat is free to choose) > + > + $map->{default} = $entry; > + } > + } > + > + die "identity mapping cannot be combined with other mappings\n" > + if $map->{identity} && ($map->{default} || $map->{entries}); $map->{identity} is OK, can only be 1 or not exisiting, "entries" can only be a hash or not existing, but "default" has agian the same problem. > + > + return $map; > +} > + > +register_format('storagepair', \&verify_storagepair); > +sub verify_storagepair { > + my ($storagepair, $noerr) = @_; > + > + # note: this only checks a single list entry > + # when using a storagepair-list map, you need to pass the full > + # parameter to parse_idmap > + eval { parse_idmap($storagepair, 'pve-storage-id') }; > + if ($@) { > + return undef if $noerr; > + die "$@\n"; > + } > + > + return $storagepair; > +} > + > register_format('mac-addr', \&pve_verify_mac_addr); > sub pve_verify_mac_addr { > my ($mac_addr, $noerr) = @_; > _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel