summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-04-08 12:52:39 +0000
committerGerrit Code Review <review@openstack.org>2015-04-08 12:52:39 +0000
commit580997f6ad242caca79c8760eecb1904ca2185cd (patch)
tree0a10b6c694e3d708a2be8cb376e158d443b1b6ca
parenta70b3c53484b6555fffb75cf55af931ed3b8449d (diff)
parentac219d5dd93c5c637336a9c79389fc260af65d36 (diff)
downloadcinder-580997f6ad242caca79c8760eecb1904ca2185cd.tar.gz
Merge "Rbd update volume stats in wrong way"
-rw-r--r--cinder/tests/test_rbd.py26
-rw-r--r--cinder/volume/drivers/rbd.py17
2 files changed, 30 insertions, 13 deletions
diff --git a/cinder/tests/test_rbd.py b/cinder/tests/test_rbd.py
index b30735293..fcd3bcc63 100644
--- a/cinder/tests/test_rbd.py
+++ b/cinder/tests/test_rbd.py
@@ -662,10 +662,14 @@ class RBDTestCase(test.TestCase):
client.__enter__.return_value = client
client.cluster = mock.Mock()
- client.cluster.get_cluster_stats = mock.Mock()
- client.cluster.get_cluster_stats.return_value = {'kb': 1024 ** 3,
- 'kb_avail': 1024 ** 2}
-
+ client.cluster.mon_command = mock.Mock()
+ client.cluster.mon_command.return_value = (
+ 0, '{"stats":{"total_bytes":64385286144,'
+ '"total_used_bytes":3289628672,"total_avail_bytes":61095657472},'
+ '"pools":[{"name":"rbd","id":2,"stats":{"kb_used":1510197,'
+ '"bytes_used":1546440971,"max_avail":28987613184,"objects":412}},'
+ '{"name":"volumes","id":3,"stats":{"kb_used":0,"bytes_used":0,'
+ '"max_avail":28987613184,"objects":0}}]}\n', '')
self.driver.configuration.safe_get = mock.Mock()
self.driver.configuration.safe_get.return_value = 'RBD'
@@ -674,12 +678,13 @@ class RBDTestCase(test.TestCase):
vendor_name='Open Source',
driver_version=self.driver.VERSION,
storage_protocol='ceph',
- total_capacity_gb=1024,
- free_capacity_gb=1,
+ total_capacity_gb=27,
+ free_capacity_gb=26,
reserved_percentage=0)
actual = self.driver.get_volume_stats(True)
- client.cluster.get_cluster_stats.assert_called_once_with()
+ client.cluster.mon_command.assert_called_once_with(
+ '{"prefix":"df", "format":"json"}', '')
self.assertDictMatch(expected, actual)
@common_mocks
@@ -688,8 +693,8 @@ class RBDTestCase(test.TestCase):
client.__enter__.return_value = client
client.cluster = mock.Mock()
- client.cluster.get_cluster_stats = mock.Mock()
- client.cluster.get_cluster_stats.side_effect = Exception
+ client.cluster.mon_command = mock.Mock()
+ client.cluster.mon_command.return_value = (22, '', '')
self.driver.configuration.safe_get = mock.Mock()
self.driver.configuration.safe_get.return_value = 'RBD'
@@ -703,7 +708,8 @@ class RBDTestCase(test.TestCase):
reserved_percentage=0)
actual = self.driver.get_volume_stats(True)
- client.cluster.get_cluster_stats.assert_called_once_with()
+ client.cluster.mon_command.assert_called_once_with(
+ '{"prefix":"df", "format":"json"}', '')
self.assertDictMatch(expected, actual)
@common_mocks
diff --git a/cinder/volume/drivers/rbd.py b/cinder/volume/drivers/rbd.py
index d9e939b5e..7dae2ec20 100644
--- a/cinder/volume/drivers/rbd.py
+++ b/cinder/volume/drivers/rbd.py
@@ -371,9 +371,20 @@ class RBDDriver(driver.VolumeDriver):
try:
with RADOSClient(self) as client:
- new_stats = client.cluster.get_cluster_stats()
- stats['total_capacity_gb'] = new_stats['kb'] / units.Mi
- stats['free_capacity_gb'] = new_stats['kb_avail'] / units.Mi
+ ret, outbuf, _outs = client.cluster.mon_command(
+ '{"prefix":"df", "format":"json"}', '')
+ if ret != 0:
+ LOG.warning(_LW('Unable to get rados pool stats.'))
+ else:
+ outbuf = json.loads(outbuf)
+ pool_stats = [pool for pool in outbuf['pools'] if
+ pool['name'] ==
+ self.configuration.rbd_pool][0]['stats']
+ stats['free_capacity_gb'] = (
+ pool_stats['max_avail'] / units.Gi)
+ used_capacity_gb = pool_stats['bytes_used'] / units.Gi
+ stats['total_capacity_gb'] = (stats['free_capacity_gb']
+ + used_capacity_gb)
except self.rados.Error:
# just log and return unknown capacities
LOG.exception(_LE('error refreshing volume stats'))