[pve-devel] [pve-manager] pvesh: implement 'ls' command
Thomas Lamprecht
t.lamprecht at proxmox.com
Thu Jul 26 10:47:58 CEST 2018
Am 07/25/2018 um 11:38 AM schrieb Dietmar Maurer:
> Signed-off-by: Dietmar Maurer <dietmar at proxmox.com>
> ---
>
> As requested by Thomas.
>
much thanks, hope I do not cause to much trouble...
> NOTE: needs previous patches for pve-common which are not applied so far
>
Hmm, but are some patches for manager also needed, because it does not
apply (see below, last hunk) - I did not find any patch already on the
list, although I looked only at recent sent ones (~ last two weeks)
> bin/pvesh | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 93 insertions(+)
>
> diff --git a/bin/pvesh b/bin/pvesh
> index 303fe0ef..ea582d8b 100755
> --- a/bin/pvesh
> +++ b/bin/pvesh
> @@ -165,6 +165,45 @@ sub dir_info {
> return $res;
> }
>
> +sub resource_cap {
> + my ($path) = @_;
> +
> + my $res = '';
> +
> + my ($handler, $info) = PVE::API2->find_handler('GET', $path);
> + if (!($handler && $info)) {
> + $res .= '--';
> + } else {
> + if (PVE::JSONSchema::method_get_child_link($info)) {
> + $res .= 'Dr';
> + } else {
> + $res .= '-r';
> + }
> + }
> +
> + ($handler, $info) = PVE::API2->find_handler('PUT', $path);
> + if (!($handler && $info)) {
> + $res .= '-';
> + } else {
> + $res .= 'w';
> + }
> +
> + ($handler, $info) = PVE::API2->find_handler('POST', $path);
> + if (!($handler && $info)) {
> + $res .= '-';
> + } else {
> + $res .= 'c';
> + }
> +
> + ($handler, $info) = PVE::API2->find_handler('DELETE', $path);
> + if (!($handler && $info)) {
> + $res .= '-';
> + } else {
> + $res .= 'd';
> + }
> +
> + return $res;
> +}
>
> # dynamically update schema definition
> # like: pvesh <get|set|create|delete|help> <path>
> @@ -261,6 +300,59 @@ sub call_api_method {
> }
>
> __PACKAGE__->register_method ({
> + name => 'ls',
> + path => 'ls',
> + method => 'GET',
> + description => "List child objects on <api_path>.",
> + parameters => {
> + additionalProperties => 0,
> + properties => PVE::RESTHandler::add_standard_output_properties($path_properties),
> + },
> + returns => { type => 'null' },
> + code => sub {
> + my ($param) = @_;
> +
> + my $path = PVE::Tools::extract_param($param, 'api_path');
> +
> + my $stdopts = PVE::RESTHandler::extract_standard_output_properties($param);
> + PVE::CLIFormatter::query_terminal_options($stdopts);
> +
> + my $uri_param = {};
> + my ($handler, $info) = PVE::API2->find_handler('GET', $path, $uri_param);
> + if (!$handler || !$info) {
> + die "no such resource '$path'\n";
> + }
> +
> + my $link = PVE::JSONSchema::method_get_child_link($info);
> + die "resource '$path' does not define child links\n" if !$link;
> +
> + my $data;
> + my ($node, $remip) = check_proxyto($info, $uri_param);
> + if ($node) {
> + $data = proxy_handler($node, $remip, $path, 'ls', $param, $stdopts->{quiet});
> + } else {
> + foreach my $p (keys %$uri_param) {
> + $param->{$p} = $uri_param->{$p};
> + }
> +
> + $data = $handler->handle($info, $param);
> + }
> +
> + my $children = extract_children($link, $data);
> +
> + my $res = [];
> + foreach my $c (@$children) {
> + my $item = { name => $c, cap => resource_cap("$path/$c")};
> + push @$res, $item;
> + }
> +
> + my $schema = { type => 'array', items => { type => 'object' }};
> + PVE::CLIFormatter::print_api_result($res, $schema, ['name', 'cap'], $stdopts);
> +
> + return undef;
> + }});
> +
> +__PACKAGE__->register_method ({
> name => 'get',
> path => 'get',
> method => 'GET',
> @@ -402,6 +494,7 @@ __PACKAGE__->register_method ({
> our $cmddef = {
> usage => [ __PACKAGE__, 'usage', ['api_path']],
> get => [ __PACKAGE__, 'get', ['api_path']],
> + ls => [ __PACKAGE__, 'ls', ['api_path']],
I have still the $format_result outsub here, i.e.:
get => [ __PACKAGE__, 'get', ['api_path'], {}, $format_result ],
thus this context does not match and I cannot apply it.
> set => [ __PACKAGE__, 'set', ['api_path']],
> create => [ __PACKAGE__, 'create', ['api_path']],
> delete => [ __PACKAGE__, 'delete', ['api_path']],
>
More information about the pve-devel
mailing list