[pve-devel] [PATCH pve-client v3] Add "storage status" and "storage list"
René Jochum
r.jochum at proxmox.com
Thu Jun 21 10:17:20 CEST 2018
Signed-off-by: René Jochum <r.jochum at proxmox.com>
---
PVE/APIClient/Commands/storage.pm | 155 ++++++++++++++++++++++++++++++++++++++
pveclient | 2 +
2 files changed, 157 insertions(+)
create mode 100644 PVE/APIClient/Commands/storage.pm
diff --git a/PVE/APIClient/Commands/storage.pm b/PVE/APIClient/Commands/storage.pm
new file mode 100644
index 0000000..1e914f5
--- /dev/null
+++ b/PVE/APIClient/Commands/storage.pm
@@ -0,0 +1,155 @@
+package PVE::APIClient::Commands::storage;
+
+use strict;
+use warnings;
+use JSON;
+
+use PVE::APIClient::JSONSchema qw(get_standard_option);
+
+use PVE::APIClient::Config;
+use PVE::APIClient::CLIHandler;
+
+use base qw(PVE::APIClient::CLIHandler);
+
+my $print_content = sub {
+ my ($list) = @_;
+
+ my $maxlenname = 0;
+ foreach my $info (@$list) {
+
+ my $volid = $info->{volid};
+ my $sidlen = length ($volid);
+ $maxlenname = $sidlen if $sidlen > $maxlenname;
+ }
+
+ foreach my $info (@$list) {
+ next if !$info->{vmid};
+ my $volid = $info->{volid};
+
+ printf "%-${maxlenname}s %5s %10d %d\n", $volid,
+ $info->{format}, $info->{size}, $info->{vmid};
+ }
+
+ foreach my $info (sort { $a->{format} cmp $b->{format} } @$list) {
+ next if $info->{vmid};
+ my $volid = $info->{volid};
+
+ printf "%-${maxlenname}s %5s %10d\n", $volid,
+ $info->{format}, $info->{size};
+ }
+};
+
+my $print_status = sub {
+ my $res = shift;
+
+ my $maxlen = 0;
+ foreach my $res (@$res) {
+ my $storeid = $res->{storage};
+ $maxlen = length ($storeid) if length ($storeid) > $maxlen;
+ }
+ $maxlen+=1;
+
+ printf "%-${maxlen}s %10s %10s %15s %15s %15s %8s\n", 'Name', 'Type',
+ 'Status', 'Total', 'Used', 'Available', '%';
+
+ foreach my $res (sort { $a->{storage} cmp $b->{storage} } @$res) {
+ my $storeid = $res->{storage};
+
+ my $active = $res->{active} ? 'active' : 'inactive';
+ my ($per, $per_fmt) = (0, '% 7.2f%%');
+ $per = ($res->{used}*100)/$res->{total} if $res->{total} > 0;
+
+ if (!$res->{enabled}) {
+ $per = 'N/A';
+ $per_fmt = '% 8s';
+ $active = 'disabled';
+ }
+
+ printf "%-${maxlen}s %10s %10s %15d %15d %15d $per_fmt\n", $storeid,
+ $res->{type}, $active, $res->{total}/1024, $res->{used}/1024,
+ $res->{avail}/1024, $per;
+ }
+};
+
+__PACKAGE__->register_method ({
+ name => 'list',
+ path => 'list',
+ method => 'GET',
+ description => "Get status for all datastores.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ remote => get_standard_option('pveclient-remote-name'),
+ storage => get_standard_option('pve-storage-id'),
+ format => get_standard_option('pveclient-output-format'),
+ node => {
+ description => "The cluster node name.",
+ type => 'string', format => 'pve-node',
+ optional => 1,
+ },
+ },
+ },
+ returns => { type => 'null'},
+ code => sub {
+ my ($param) = @_;
+
+ my $config = PVE::APIClient::Config->load();
+ my $conn = PVE::APIClient::Config->remote_conn($config, $param->{remote});
+
+ my $node = $param->{node} // 'localhost';
+ my $storage = $param->{storage};
+
+ my $resources = $conn->get("api2/json/nodes/$node/storage/$storage/content", {});
+
+ if (!defined($param->{format}) or $param->{format} eq 'text') {
+ $print_content->($resources);
+ } else {
+ print JSON::to_json($resources, {utf8 => 1, pretty => 1});
+ }
+
+ return undef;
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'status',
+ path => 'status',
+ method => 'GET',
+ description => "List storage content.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ remote => get_standard_option('pveclient-remote-name'),
+ format => get_standard_option('pveclient-output-format'),
+ node => {
+ description => "The cluster node name.",
+ type => 'string', format => 'pve-node',
+ optional => 1,
+ },
+ },
+ },
+ returns => { type => 'null'},
+ code => sub {
+ my ($param) = @_;
+
+ my $config = PVE::APIClient::Config->load();
+ my $conn = PVE::APIClient::Config->remote_conn($config, $param->{remote});
+
+ my $node = $param->{node} // 'localhost';
+
+ my $resources = $conn->get("api2/json/nodes/$node/storage", {});
+
+ if (!defined($param->{format}) or $param->{format} eq 'text') {
+ $print_status->($resources);
+ } else {
+ print JSON::to_json($resources, {utf8 => 1, pretty => 1});
+ }
+
+ return undef;
+ }});
+
+our $cmddef = {
+ list => [ __PACKAGE__, 'list', ['remote', 'storage']],
+ status => [ __PACKAGE__, 'status', ['remote']],
+};
+
+1;
diff --git a/pveclient b/pveclient
index 2995fd5..b905526 100755
--- a/pveclient
+++ b/pveclient
@@ -16,6 +16,7 @@ use PVE::APIClient::Helpers;
use PVE::APIClient::Config;
use PVE::APIClient::Commands::config;
use PVE::APIClient::Commands::remote;
+use PVE::APIClient::Commands::storage;
use PVE::APIClient::Commands::list;
use PVE::APIClient::Commands::lxc;
use PVE::APIClient::Commands::GuestStatus;
@@ -181,6 +182,7 @@ our $cmddef = {
list => $PVE::APIClient::Commands::list::cmddef,
lxc => $PVE::APIClient::Commands::lxc::cmddef,
remote => $PVE::APIClient::Commands::remote::cmddef,
+ storage => $PVE::APIClient::Commands::storage::cmddef,
resume => [ 'PVE::APIClient::Commands::GuestStatus', 'resume', ['remote', 'vmid']],
shutdown => [ 'PVE::APIClient::Commands::GuestStatus', 'shutdown', ['remote', 'vmid']],
--
2.11.0
More information about the pve-devel
mailing list