[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