[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