From 804bc6219b2b6e6a4c717b8ea1dffd3a15debddf Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Wed, 26 Aug 2020 21:21:03 +0200 Subject: [PATCH] get_options: allow optional arguments "arg_params" if no ambiguity If we run out of passed arguments from the user but still had defined "arg_params" (those params which went after the command in fixed order without option -- dashes) we always errored out with "not enough arguments". But, there are situations where the remaining arg_params are all marked as optional in the schema, so we do not need to error out in that case. A prime (future) use case is "pvesm prune-backups". Currently the usage is: > pvesm prune-backups storeid --prune-backups keep-last=1,keep-... Because the "prune-backups" keep retention property is optional as it can fallback to the one defined in the storage configuration. With this patch we can make it an argument and allow the following two usages: 1. As above, but avoiding the extra ugly --prune-backups > pvesm prune-backups storeid keep-last=1,keep-... 2. Fallback to storage config: > pvesm prune-backups storeid Signed-off-by: Thomas Lamprecht --- src/PVE/JSONSchema.pm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index c5002d8..2ceb1bd 100644 --- a/src/PVE/JSONSchema.pm +++ b/src/PVE/JSONSchema.pm @@ -1613,7 +1613,8 @@ sub get_options { $opts->{$list_param} = $args; $args = []; } elsif (ref($arg_param)) { - foreach my $arg_name (@$arg_param) { + for (my $i = 0; $i < scalar(@$arg_param); $i++) { + my $arg_name = $arg_param->[$i]; if ($opts->{'extra-args'}) { raise("internal error: extra-args must be the last argument\n", code => HTTP_BAD_REQUEST); } @@ -1622,7 +1623,15 @@ sub get_options { $args = []; next; } - raise("not enough arguments\n", code => HTTP_BAD_REQUEST) if !@$args; + if (!@$args) { + # check if all left-over arg_param are optional, else we + # must die as the mapping is then ambigious + for (my $j = $i; $j < scalar(@$arg_param); $j++) { + my $prop = $arg_param->[$j]; + raise("not enough arguments\n", code => HTTP_BAD_REQUEST) + if !$schema->{properties}->{$prop}->{optional}; + } + } $opts->{$arg_name} = shift @$args; } raise("too many arguments\n", code => HTTP_BAD_REQUEST) if @$args; -- 2.39.2