From 41aacc6cdeea9b0c8007cbfb280acf827932c3d6 Mon Sep 17 00:00:00 2001 From: Alwin Antreich Date: Fri, 13 Apr 2018 14:28:31 +0200 Subject: [PATCH] Fix #1542: show storage utilization per pool - 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 --- 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..d5d1da7 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; - } - } - }; + my ($d) = grep { $_->{name} eq $scfg->{pool} } @{$df->{pools}}; - eval { - run_rbd_command($cmd, errmsg => "rados error", errfunc => sub {}, outfunc => $parser); - }; - - 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 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),