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.gruenbich...@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, '');
+           };
+           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) = @_;
-- 
2.20.1


_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to