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

Fabian Grünbichler f.gruenbichler at proxmox.com
Mon Mar 30 13:41:28 CEST 2020


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 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, '');
+	    };
+	    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





More information about the pve-devel mailing list