[pve-devel] [PATCH common 1/1] JSONSchema: add idmap parser and storagepair format
Thomas Lamprecht
t.lamprecht at proxmox.com
Wed Apr 1 17:39:39 CEST 2020
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.gruenbichler at 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) = @_;
>
More information about the pve-devel
mailing list