JSONSchema: add idmap parser and storagepair format

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

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
Fabian Grünbichler 2020-03-30 13:41:28 +02:00 committed by Thomas Lamprecht
parent b60a44e0da
commit 18f93ddf63

View File

@ -222,6 +222,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, '');
};
die "entry '$entry' contains invalid ID - $@\n"
if $@;
die "duplicate mapping for source '$source'\n"
if $map->{entries}->{$source};
$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};
$map->{default} = $entry;
}
}
die "identity mapping cannot be combined with other mappings\n"
if $map->{identity} && ($map->{default} || $map->{entries});
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) = @_;