From 5101e472b1588759d791f999bad0f4b8a284d736 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Tue, 26 Jun 2018 13:46:50 +0200 Subject: [PATCH] PVE::APIClient::Helpers::extract_even_elements - new helper --- PVE/APIClient/Commands/list.pm | 47 ++++++++++++++++++-------------- PVE/APIClient/Commands/remote.pm | 36 ++++++++++++++++++++---- PVE/APIClient/Config.pm | 2 +- PVE/APIClient/Helpers.pm | 22 +++++++++++++++ pveclient | 6 +++- 5 files changed, 84 insertions(+), 29 deletions(-) diff --git a/PVE/APIClient/Commands/list.pm b/PVE/APIClient/Commands/list.pm index 2030c51..f5388f1 100644 --- a/PVE/APIClient/Commands/list.pm +++ b/PVE/APIClient/Commands/list.pm @@ -6,11 +6,21 @@ use JSON; use PVE::APIClient::JSONSchema qw(get_standard_option); +use PVE::APIClient::Helpers; use PVE::APIClient::Config; use PVE::APIClient::CLIHandler; use base qw(PVE::APIClient::CLIHandler); +# define as array to keep ordering +my $list_returns_properties = [ + 'vmid' => get_standard_option('pve-vmid'), + 'node' => get_standard_option('pve-node'), + 'type' => { type => 'string' }, + 'status' => { type => 'string' }, + 'name' => { type => 'string', optional => 1 }, + ]; + __PACKAGE__->register_method ({ name => 'list', path => 'list', @@ -20,36 +30,31 @@ __PACKAGE__->register_method ({ additionalProperties => 0, properties => { remote => get_standard_option('pveclient-remote-name'), - format => get_standard_option('pveclient-output-format'), + 'format' => get_standard_option('pveclient-output-format'), + }, + }, + returns => { + type => 'array', + items => { + type => 'object', + properties => { @$list_returns_properties }, }, }, - returns => { type => 'null'}, code => sub { my ($param) = @_; + my $format = PVE::APIClient::Tools::extract_param($param, 'format'); + PVE::APIClient::Helpers::set_output_format($format); + my $config = PVE::APIClient::Config->load(); my $conn = PVE::APIClient::Config->remote_conn($config, $param->{remote}); - my $resources = $conn->get('api2/json/cluster/resources', { type => 'vm' }); - - if (!defined($param->{format}) or $param->{format} eq 'text') { - my $headers = ['Node', 'VMID', 'Type', 'Name', 'Status']; - my $data = []; - for my $el (@$resources) { - push(@$data, [$el->{node}, $el->{vmid}, $el->{type}, $el->{name}, $el->{status}]); - } - - printf("%10s %10s %10s %10s %10s\n", @$headers); - for my $row (@$data) { - printf("%10s %10s %10s %10s %10s\n", @$row); - } - } else { - print JSON::to_json($resources, {utf8 => 1, pretty => 1}); - } - - return undef; + + return $conn->get('api2/json/cluster/resources', { type => 'vm' }); }}); -our $cmddef = [ __PACKAGE__, 'list', ['remote']]; +our $cmddef = [ __PACKAGE__, 'list', ['remote'], {}, sub { + PVE::APIClient::Helpers::print_ordered_result($list_returns_properties, @_); +}]; 1; diff --git a/PVE/APIClient/Commands/remote.pm b/PVE/APIClient/Commands/remote.pm index b233901..6124bbe 100644 --- a/PVE/APIClient/Commands/remote.pm +++ b/PVE/APIClient/Commands/remote.pm @@ -19,6 +19,15 @@ sub read_password { return PVE::APIClient::PTY::read_password("Remote password: ") } +# define as array to keep ordering +my $remote_list_returns_properties = [ + name => get_standard_option('pveclient-remote-name'), + host => { type => 'string', format => 'address' }, + username => { type => 'string' }, + port => { type => 'integer', optional => 1 }, + fingerprint => { type => 'string', optional => 1 }, + ]; + __PACKAGE__->register_method ({ name => 'remote_list', path => 'remote_list', @@ -26,20 +35,33 @@ __PACKAGE__->register_method ({ description => "List remotes from your config file.", parameters => { additionalProperties => 0, + properties => { + 'format' => get_standard_option('pveclient-output-format'), + }, + }, + returns => { + type => 'array', + items => { + type => 'object', + properties => { @$remote_list_returns_properties }, + }, }, - returns => { type => 'null' }, code => sub { + my ($param) = @_; + + my $format = PVE::APIClient::Tools::extract_param($param, 'format'); + PVE::APIClient::Helpers::set_output_format($format); + my $config = PVE::APIClient::Config->load(); - printf("%10s %10s %10s %10s %100s\n", "Name", "Host", "Port", "Username", "Fingerprint"); + my $res = []; for my $name (keys %{$config->{ids}}) { my $data = $config->{ids}->{$name}; next if $data->{type} ne 'remote'; - printf("%10s %10s %10s %10s %100s\n", $name, $data->{'host'}, - $data->{'port'} // '-', $data->{'username'}, $data->{'fingerprint'} // '-'); + push @$res, $data; } - return undef; + return $res; }}); __PACKAGE__->register_method ({ @@ -189,7 +211,9 @@ our $cmddef = { add => [ __PACKAGE__, 'remote_add', ['name', 'host', 'username']], set => [ __PACKAGE__, 'remote_set', ['name']], delete => [ __PACKAGE__, 'remote_delete', ['name']], - list => [__PACKAGE__, 'remote_list'], + list => [__PACKAGE__, 'remote_list', undef, {}, sub { + PVE::APIClient::Helpers::print_ordered_result($remote_list_returns_properties, @_); + }], }; 1; diff --git a/PVE/APIClient/Config.pm b/PVE/APIClient/Config.pm index a783ab3..9ab68fc 100644 --- a/PVE/APIClient/Config.pm +++ b/PVE/APIClient/Config.pm @@ -31,7 +31,7 @@ my $complete_remote_name = sub { PVE::APIClient::JSONSchema::register_standard_option('pveclient-output-format', { type => 'string', description => 'Output format.', - enum => [ 'text', 'json' ], + enum => [ 'text', 'plain', 'json' ], optional => 1, default => 'text', }); diff --git a/PVE/APIClient/Helpers.pm b/PVE/APIClient/Helpers.pm index ed1822d..3e779b6 100644 --- a/PVE/APIClient/Helpers.pm +++ b/PVE/APIClient/Helpers.pm @@ -9,6 +9,9 @@ use File::Path qw(make_path); use PVE::APIClient::JSONSchema; use PVE::APIClient::Exception qw(raise); +use PVE::APIClient::CLIFormatter; +use PVE::APIClient::CLIHandler; +use PVE::APIClient::PTY; use Encode::Locale; use Encode; use HTTP::Status qw(:constants); @@ -395,5 +398,24 @@ sub ticket_cache_update { die $@ if $@; } +sub extract_even_elements { + my ($list) = @_; + + my $ind = 0; + return [ grep { ($ind++ % 2) == 0 } @$list ]; +} + +sub print_ordered_result { + my ($property_list, $data, $result_schema) = @_; + + my $format = get_output_format(); + my $param_order = extract_even_elements($property_list); + + $options = {}; + + PVE::APIClient::CLIFormatter::query_terminal_options($options); + + PVE::APIClient::CLIFormatter::print_api_result($format, $data, $result_schema, $param_order, $options); +} 1; diff --git a/pveclient b/pveclient index 7688ffe..c87b2cc 100755 --- a/pveclient +++ b/pveclient @@ -8,6 +8,7 @@ use Cwd 'abs_path'; use Data::Dumper; use PVE::APIClient::JSONSchema qw(register_standard_option get_standard_option); +use PVE::APIClient::CLIFormatter; use PVE::APIClient::CLIHandler; use PVE::APIClient::PTY; @@ -109,7 +110,10 @@ my $format_result = sub { my ($data) = @_; my $format = PVE::APIClient::Helpers::get_output_format(); - PVE::APIClient::CLIHandler::print_api_result($format, $data, $path_returns); + + my $options = PVE::APIClient::CLIFormatter::query_terminal_options({}); + + PVE::APIClient::CLIFormatter::print_api_result($format, $data, $path_returns, undef, $options); }; __PACKAGE__->register_method ({ -- 2.39.2