[pve-devel] [PATCH v2 pve-common] support aliases in property strings

Wolfgang Bumiller w.bumiller at proxmox.com
Thu Oct 15 12:24:42 CEST 2015


In qemu the 'volume' key maps to 'file', both can be used,
so to support this case in the comma-separated property
list parser we need a way to alias keys to one another.
This allows declaring a key like:

  volume => {
      alias => 'file'
  }
  file => {
      type => 'pve-volume-id',
      default_key => 1,
      format_description => 'volume'
  }

With this the following property strings are equivalent and
result in the same datastructure being returned from
parse_property_string:

  local:disk.raw
  file=local:disk.raw
  volume=local:disk.raw
---
 Changes since the first patch:
   cannot alias to another alias anymore to avoid possible endless
   loops with bad schemas
 src/PVE/JSONSchema.pm | 13 +++++++++++--
 src/PVE/PodParser.pm  |  4 ++++
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm
index 0cb281d..5f32941 100644
--- a/src/PVE/JSONSchema.pm
+++ b/src/PVE/JSONSchema.pm
@@ -500,6 +500,10 @@ sub parse_property_string {
 	    my ($k, $v) = ($1, $2);
 	    die "duplicate key in comma-separated list property: $k" if defined($res->{$k});
 	    my $schema = $format->{$k};
+	    if (my $alias = $schema->{alias}) {
+		$k = $alias;
+		$schema = $format->{$k};
+	    }
 	    die "invalid key in comma-separated list property: $k" if !$schema;
 	    if ($schema->{type} && $schema->{type} eq 'boolean') {
 		$v = 1 if $v =~ m/^(1|on|yes|true)$/i;
@@ -553,7 +557,7 @@ sub print_property_string {
     my %required; # this is a set, all present keys are required regardless of value
     foreach my $key (keys %$format) {
 	$allowed{$key} = 1;
-	if (!$format->{$key}->{optional} && !$skipped{$key}) {
+	if (!$format->{$key}->{optional} && !$format->{$key}->{alias} && !$skipped{$key}) {
 	    $required{$key} = 1;
 	}
 
@@ -810,7 +814,7 @@ sub check_prop {
 
     if (!defined ($value)) {
 	return if $schema->{type} && $schema->{type} eq 'null';
-	if (!$schema->{optional}) {
+	if (!$schema->{optional} && !$schema->{alias}) {
 	    add_error($errors, $path, "property is missing and it is not optional");
 	}
 	return;
@@ -1048,6 +1052,11 @@ my $default_schema_noref = {
 	    optional => 1,
 	    description => "Whether this is the default key in a comma separated list property string.",
 	},
+	alias => {
+	    type => 'string',
+	    optional => 1,
+	    description => "When a key represents the same property as another it can be an alias to it, causing the parsed datastructure to use the other key to store the current value under.",
+	},
 	default => {
 	    type => "any",
 	    optional => 1,
diff --git a/src/PVE/PodParser.pm b/src/PVE/PodParser.pm
index eb443bd..f61317b 100644
--- a/src/PVE/PodParser.pm
+++ b/src/PVE/PodParser.pm
@@ -62,6 +62,10 @@ sub generate_typetext {
 	my ($key) = @_;
 	$typetext .= $pre;
 	my $entry = $schema->{$key};
+	if (my $alias = $entry->{alias}) {
+	    $key = $alias;
+	    $entry = $schema->{$key};
+	}
 	if (my $desc = $entry->{format_description}) {
 	    $typetext .= $entry->{default_key} ? "[$key=]" : "$key=";
 	    $typetext .= "<$desc>";
-- 
2.1.4




More information about the pve-devel mailing list