[pve-devel] [PATCH common 1/1] JSONSchema: add idmap parser and storagepair format

Fabian Grünbichler f.gruenbichler at proxmox.com
Thu Apr 2 11:11:32 CEST 2020


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.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.

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) = @_;
>> 
> 
> 
> 




More information about the pve-devel mailing list