'')
def test_get_volume_stats(self):
- self.drv.zfssa.get_pool_stats.return_value = 2 * units.Gi, 3 * units.Gi
+ self.drv.zfssa.get_project_stats.return_value = 2 * units.Gi,\
+ 3 * units.Gi
lcfg = self.configuration
stats = self.drv.get_volume_stats(refresh=True)
- self.drv.zfssa.get_pool_stats.assert_called_once_with(lcfg.zfssa_pool)
+ self.drv.zfssa.get_project_stats.assert_called_once_with(
+ lcfg.zfssa_pool,
+ lcfg.zfssa_project)
self.assertEqual('Oracle', stats['vendor_name'])
self.assertEqual(self.configuration.volume_backend_name,
stats['volume_backend_name'])
'nodestroy': True}
self.zfssa.rclient.put.assert_called_with(expected_svc, expected_arg)
+ def test_get_project_stats(self):
+ ret_val = json.dumps({"project": {"name": self.project,
+ "space_available": 15754895360,
+ "space_total": 25754895360,
+ "dedup": False,
+ "logbias": "latency",
+ "encryption": "off"}})
+ self.zfssa.rclient.get.return_value = self._create_response(
+ client.Status.OK, ret_val)
+ self.zfssa.get_project_stats(self.pool, self.project)
+ expected_svc = '/api/storage/v1/pools/' + self.pool + '/projects/' + \
+ self.project
+ self.zfssa.rclient.get.assert_called_with(expected_svc)
+
+ self.zfssa.rclient.get.return_value = self._create_response(
+ client.Status.NOT_FOUND)
+ self.assertRaises(exception.VolumeBackendAPIException,
+ self.zfssa.get_project_stats,
+ self.pool,
+ self.project)
+
class TestZFSSANfsApi(test.TestCase):
data["storage_protocol"] = self.protocol
lcfg = self.configuration
- (avail, total) = self.zfssa.get_pool_stats(lcfg.zfssa_pool)
+ (avail, total) = self.zfssa.get_project_stats(lcfg.zfssa_pool,
+ lcfg.zfssa_project)
if avail is None or total is None:
return
LOG.error(exception_msg)
raise exception.VolumeBackendAPIException(data=exception_msg)
- def get_pool_stats(self, pool):
- """Get pool stats.
+ def get_project_stats(self, pool, project):
+ """Get project stats.
- Get space available and total properties of a pool
- returns (avail, total).
+ Get available space and total space of a project
+ returns (avail, total).
"""
- svc = '/api/storage/v1/pools/' + pool
+ svc = '/api/storage/v1/pools/%s/projects/%s' % (pool, project)
ret = self.rclient.get(svc)
if ret.status != restclient.Status.OK:
- exception_msg = (_('Error Getting Pool Stats: '
+ exception_msg = (_('Error Getting Project Stats: '
'Pool: %(pool)s '
+ 'Project: %(project)s '
'Return code: %(ret.status)d '
'Message: %(ret.data)s.')
% {'pool': pool,
+ 'project': project,
'ret.status': ret.status,
'ret.data': ret.data})
LOG.error(exception_msg)
- raise exception.InvalidVolume(reason=exception_msg)
+ raise exception.VolumeBackendAPIException(data=exception_msg)
val = json.loads(ret.data)
-
- if not self._is_pool_owned(val):
- LOG.error(_LE('Error Pool ownership: Pool %(pool)s is not owned '
- 'by %(host)s.'),
- {'pool': pool, 'host': self.host})
- raise exception.InvalidInput(reason=pool)
-
- avail = val['pool']['usage']['available']
- total = val['pool']['usage']['total']
+ avail = val['project']['space_available']
+ total = avail + val['project']['space_total']
return avail, total