On April 1, 2020 5:39 pm, Thomas Lamprecht wrote: > 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.
all sound valid - feel free to fixup on your end (or, if the dependent patches need another version, I can do it then ;)) > >> >> 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. yes, I think so. if not, this can be extended later on quite easily? (same for the previously discussed 'source:target:extra_options' syntax, if that is really ever needed) >> + }; >> + 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