[pve-devel] [PATCH pve-client v3] Add "storage status" and "storage list"

René Jochum r.jochum at proxmox.com
Thu Jun 21 10:18:37 CEST 2018


Sorry, its v1.

On 2018-06-21 10:17, René Jochum wrote:
> 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']],





More information about the pve-devel mailing list