[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