[pve-devel] [PATCH v4 storage 1/2] Fix #1542: show storage utilization per pool
Alwin Antreich
a.antreich at proxmox.com
Fri Apr 13 14:28:31 CEST 2018
- get storage utilization per pool
- use librados2-perl for pool status
- add librados2-perl as build-depends and depends in debian/control
Signed-off-by: Alwin Antreich <a.antreich at proxmox.com>
---
PVE/Storage.pm | 3 +-
PVE/Storage/RBDPlugin.pm | 72 +++++++++++++++++++++++++++++++++++-------------
debian/control | 2 ++
3 files changed, 56 insertions(+), 21 deletions(-)
diff --git a/PVE/Storage.pm b/PVE/Storage.pm
index 4140a99..d733380 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -1065,8 +1065,7 @@ sub storage_info {
next;
}
- my ($total, $avail, $used, $active);
- eval { ($total, $avail, $used, $active) = $plugin->status($storeid, $scfg, $cache); };
+ my ($total, $avail, $used, $active) = eval { $plugin->status($storeid, $scfg, $cache); };
warn $@ if $@;
next if !$active;
$info->{$storeid}->{total} = int($total);
diff --git a/PVE/Storage/RBDPlugin.pm b/PVE/Storage/RBDPlugin.pm
index fd5a2ef..e71494d 100644
--- a/PVE/Storage/RBDPlugin.pm
+++ b/PVE/Storage/RBDPlugin.pm
@@ -7,6 +7,7 @@ use Net::IP;
use PVE::Tools qw(run_command trim);
use PVE::Storage::Plugin;
use PVE::JSONSchema qw(get_standard_option);
+use PVE::RADOS;
use base qw(PVE::Storage::Plugin);
@@ -90,6 +91,50 @@ my $rados_cmd = sub {
return $build_cmd->('/usr/bin/rados', $scfg, $storeid, $op, @options);
};
+my $ceph_connect_option = sub {
+ my ($scfg, $storeid, %options) = @_;
+
+ my $cmd_option = {};
+ my $ceph_storeid_conf = "/etc/pve/priv/ceph/${storeid}.conf";
+ my $keyring = "/etc/pve/priv/ceph/${storeid}.keyring";
+ my $pveceph_managed = !defined($scfg->{monhost});
+
+ $cmd_option->{ceph_conf} = $pveceph_config if (-e $pveceph_config);
+
+ if (-e $ceph_storeid_conf) {
+ if ($pveceph_managed) {
+ warn "ignoring custom ceph config for storage '$storeid', 'monhost' is not set (assuming pveceph managed cluster)!\n";
+ } else {
+ $cmd_option->{ceph_conf} = $ceph_storeid_conf;
+ }
+ }
+
+ $cmd_option->{keyring} = $keyring if (-e $keyring);
+ $cmd_option->{auth_supported} = (defined $cmd_option->{keyring}) ? 'cephx' : 'none';
+ $cmd_option->{userid} = $scfg->{username} ? $scfg->{username} : 'admin';
+ $cmd_option->{mon_host} = $hostlist->($scfg->{monhost}, ',') if (defined($scfg->{monhost}));
+
+ if (%options) {
+ foreach my $k (keys %options) {
+ $cmd_option->{$k} = $options{$k};
+ }
+ }
+
+
+ return $cmd_option;
+
+};
+
+my $librados_connect = sub {
+ my ($scfg, $storeid, $options) = @_;
+
+ my $librados_config = $ceph_connect_option->($scfg, $storeid);
+
+ my $rados = PVE::RADOS->new(%$librados_config);
+
+ return $rados;
+};
+
# needed for volumes created using ceph jewel (or higher)
my $krbd_feature_disable = sub {
my ($scfg, $storeid, $name) = @_;
@@ -539,28 +584,17 @@ sub list_images {
sub status {
my ($class, $storeid, $scfg, $cache) = @_;
- my $cmd = &$rados_cmd($scfg, $storeid, 'df');
- my $stats = {};
+ my $rados = &$librados_connect($scfg, $storeid);
+ my $df = $rados->mon_command({ prefix => 'df', format => 'json' });
- my $parser = sub {
- my $line = shift;
- if ($line =~ m/^\s*total(?:\s|_)(\S+)\s+(\d+)(k|M|G|T)?/) {
- $stats->{$1} = $2;
- # luminous has units here..
- if ($3) {
- $stats->{$1} *= $rbd_unittobytes->{$3}/1024;
- }
- }
- };
-
- eval {
- run_rbd_command($cmd, errmsg => "rados error", errfunc => sub {}, outfunc => $parser);
- };
+ my ($d) = grep { $_->{name} eq $scfg->{pool} } @{$df->{pools}};
- my $total = $stats->{space} ? $stats->{space}*1024 : 0;
- my $free = $stats->{avail} ? $stats->{avail}*1024 : 0;
- my $used = $stats->{used} ? $stats->{used}*1024: 0;
+ # max_avail -> max available space for data w/o replication in the pool
+ # bytes_used -> data w/o replication in the pool
+ my $free = $d->{stats}->{max_avail};
+ my $used = $d->{stats}->{bytes_used};
+ my $total = $used + $free;
my $active = 1;
return ($total, $free, $used, $active);
diff --git a/debian/control b/debian/control
index 3f39364..2cf585a 100644
--- a/debian/control
+++ b/debian/control
@@ -5,6 +5,7 @@ Maintainer: Proxmox Support Team <support at proxmox.com>
Build-Depends: debhelper (>= 7.0.50~),
libpve-common-perl (>= 5.0-28),
libtest-mockmodule-perl,
+ librados2-perl,
lintian,
perl (>= 5.10.0-19),
pve-doc-generator,
@@ -18,6 +19,7 @@ Depends: cstream,
libfile-chdir-perl,
libnet-dbus-perl,
libpve-common-perl (>= 5.0-28),
+ librados2-perl,
lvm2,
nfs-common,
perl (>= 5.6.0-16),
--
2.11.0
More information about the pve-devel
mailing list