support aliases in property strings

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 => 'string',
      format => '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
This commit is contained in:
Wolfgang Bumiller 2015-10-15 12:35:18 +02:00 committed by Dietmar Maurer
parent df0c6a7cd8
commit 303a9b34ea
2 changed files with 15 additions and 2 deletions

View File

@ -500,6 +500,10 @@ sub parse_property_string {
my ($k, $v) = ($1, $2); my ($k, $v) = ($1, $2);
die "duplicate key in comma-separated list property: $k\n" if defined($res->{$k}); die "duplicate key in comma-separated list property: $k\n" if defined($res->{$k});
my $schema = $format->{$k}; my $schema = $format->{$k};
if (my $alias = $schema->{alias}) {
$k = $alias;
$schema = $format->{$k};
}
die "invalid key in comma-separated list property: $k\n" if !$schema; die "invalid key in comma-separated list property: $k\n" if !$schema;
if ($schema->{type} && $schema->{type} eq 'boolean') { if ($schema->{type} && $schema->{type} eq 'boolean') {
$v = 1 if $v =~ m/^(1|on|yes|true)$/i; $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 my %required; # this is a set, all present keys are required regardless of value
foreach my $key (keys %$format) { foreach my $key (keys %$format) {
$allowed{$key} = 1; $allowed{$key} = 1;
if (!$format->{$key}->{optional} && !$skipped{$key}) { if (!$format->{$key}->{optional} && !$format->{$key}->{alias} && !$skipped{$key}) {
$required{$key} = 1; $required{$key} = 1;
} }
@ -810,7 +814,7 @@ sub check_prop {
if (!defined ($value)) { if (!defined ($value)) {
return if $schema->{type} && $schema->{type} eq 'null'; 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"); add_error($errors, $path, "property is missing and it is not optional");
} }
return; return;
@ -1048,6 +1052,11 @@ my $default_schema_noref = {
optional => 1, optional => 1,
description => "Whether this is the default key in a comma separated list property string.", 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 => { default => {
type => "any", type => "any",
optional => 1, optional => 1,

View File

@ -62,6 +62,10 @@ sub generate_typetext {
my ($key) = @_; my ($key) = @_;
$typetext .= $pre; $typetext .= $pre;
my $entry = $schema->{$key}; my $entry = $schema->{$key};
if (my $alias = $entry->{alias}) {
$key = $alias;
$entry = $schema->{$key};
}
if (my $desc = $entry->{format_description}) { if (my $desc = $entry->{format_description}) {
$typetext .= $entry->{default_key} ? "[$key=]" : "$key="; $typetext .= $entry->{default_key} ? "[$key=]" : "$key=";
$typetext .= "<$desc>"; $typetext .= "<$desc>";