[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