[pve-devel] [PATCH pve-client] Add 'lxc list'
René Jochum
r.jochum at proxmox.com
Fri Jun 8 09:44:57 CEST 2018
---
PVE/APIClient/Commands/lxc.pm | 82 ++++++++++++++++++++++++++++++++++++++++++-
PVE/APIClient/Helpers.pm | 14 ++++++++
2 files changed, 95 insertions(+), 1 deletion(-)
diff --git a/PVE/APIClient/Commands/lxc.pm b/PVE/APIClient/Commands/lxc.pm
index f0c85f7..0f6f638 100644
--- a/PVE/APIClient/Commands/lxc.pm
+++ b/PVE/APIClient/Commands/lxc.pm
@@ -18,6 +18,7 @@ use PVE::PTY;
use base qw(PVE::CLIHandler);
use PVE::APIClient::Config;
+use PVE::APIClient::Helpers;
my $CRLF = "\x0D\x0A";
my $max_payload_size = 128*1024;
@@ -356,14 +357,93 @@ __PACKAGE__->register_method ({
additionalProperties => 0,
properties => {
remote => get_standard_option('pveclient-remote-name'),
+ format => {
+ type => 'string',
+ description => 'Output format',
+ enum => [ 'table', 'json' ],
+ optional => 1,
+ default => 'table',
+ }
},
},
returns => { type => 'null'},
code => sub {
my ($param) = @_;
- die "implement me";
+ 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' });
+ my $lxcs = [grep({$_->{type} eq "lxc"} @$resources)];
+
+ my $glxcs = [];
+ for my $el (@$lxcs) {
+ my $node = $el->{node};
+ my $vmid = $el->{vmid};
+
+ my $lxc_config = $conn->get("api2/json/nodes/$node/lxc/$vmid/config", {});
+
+ for my $i (0 .. 9) {
+ if (exists($lxc_config->{"net" . $i})) {
+ $lxc_config->{"net" . $i . "_raw"} = $lxc_config->{"net" . $i};
+ $lxc_config->{"net" . $i} =
+ PVE::APIClient::Helpers::parse_key_value_string($lxc_config->{"net" . $i});
+ }
+ }
+
+ $lxc_config->{"rootfs_raw"} = $lxc_config->{"rootfs"};
+ $lxc_config->{"rootfs"} = PVE::APIClient::Helpers::parse_key_value_string($lxc_config->{"rootfs"});
+
+ $lxc_config->{node} = $node;
+ $lxc_config->{vmid} = $vmid;
+
+ $lxc_config->{status} = $el->{status};
+
+ push @$glxcs, $lxc_config;
+ }
+
+ if (!defined($param->{format})) {
+ my $headers = ['Node', 'VMID', 'Hostname', 'Rootfs', 'Memory', 'Status', 'IPv4', 'IPv6'];
+ my $data = [];
+ for my $el (@$glxcs) {
+ my $net4 = "";
+ my $net6 = "";
+
+ for my $i (0..9) {
+ if (exists($el->{"net" . $i})) {
+ if (exists($el->{"net" . $i}->{ip})) {
+ $net4 .= "\n" if (length($net4) > 0);
+ $net4 .= $el->{"net" . $i}->{ip} . " (" . $el->{"net" . $i}->{name} . ")";
+ }
+
+ if (exists($el->{"net" . $i}->{ip6})) {
+ $net6 .= "\n" if (length($net6) > 0);
+ $net6 .= $el->{"net" . $i}->{ip6} . " (" . $el->{"net" . $i}->{name} . ")";
+ }
+ }
+ }
+
+ push(@$data, [
+ $el->{node},
+ $el->{vmid},
+ $el->{hostname},
+ $el->{rootfs}->{size},
+ $el->{memory},
+ $el->{status},
+ $net4,
+ $net6
+ ])
+ }
+
+ printf("%10s %10s %10s %10s %10s %10s %30s %30s\n", @$headers);
+ for my $row (@$data) {
+ printf("%10s %10s %10s %10s %10s %10s %30s %30s\n", @$row);
+ }
+ } else {
+ print JSON::to_json($glxcs, {utf8 => 1, pretty => 1});
+ }
+
+ return undef;
}});
diff --git a/PVE/APIClient/Helpers.pm b/PVE/APIClient/Helpers.pm
index e7f2216..6e9643e 100644
--- a/PVE/APIClient/Helpers.pm
+++ b/PVE/APIClient/Helpers.pm
@@ -66,4 +66,18 @@ sub lookup_api_method {
return $data;
}
+sub parse_key_value_string {
+ my $data = shift;
+
+ my @pairs = split( /,/, $data );
+
+ my $res = {};
+ for my $pair (@pairs) {
+ my ( $key, $value ) = split( /=/, $pair );
+ $res->{$key} = $value;
+ }
+
+ return $res;
+}
+
1;
--
2.11.0
More information about the pve-devel
mailing list