Signed-off-by: René Jochum <r.joc...@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 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel