Sorry, its v1. On 2018-06-21 10:17, René Jochum wrote: > 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']],
_______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel