class RbdTest(DashboardTestCase):
AUTH_ROLES = ['pool-manager', 'block-manager', 'cluster-manager']
+ LIST_VERSION = '2.0'
@DashboardTestCase.RunAs('test', 'test', [{'rbd-image': ['create', 'update', 'delete']}])
def test_read_access_permissions(self):
- self._get('/api/block/image?offset=0&limit=-1&search=&sort=+name')
+ self._get('/api/block/image?offset=0&limit=-1&search=&sort=+name',
+ version=RbdTest.LIST_VERSION)
self.assertStatus(403)
self.get_image('pool', None, 'image')
self.assertStatus(403)
self.fail("Snapshot {} not found".format(snap_name))
def test_list(self):
- data = self._get('/api/block/image?offset=0&limit=-1&search=&sort=+name')
+ data = self._get('/api/block/image?offset=0&limit=-1&search=&sort=+name',
+ version=RbdTest.LIST_VERSION)
self.assertStatus(200)
self.assertEqual(len(data), 2)
for pool_view in data:
- self.assertEqual(pool_view['status'], 0)
self.assertIsNotNone(pool_view['value'])
self.assertIn('pool_name', pool_view)
self.assertIn(pool_view['pool_name'], ['rbd', 'rbd_iscsi'])
from enum import IntEnum
import cherrypy
+import rados
import rbd
from .. import mgr
class RbdConfiguration(object):
_rbd = rbd.RBD()
- def __init__(self, pool_name='', namespace='', image_name='', pool_ioctx=None,
- image_ioctx=None):
- # type: (str, str, str, object, object) -> None
+ def __init__(self, pool_name: str = '', namespace: str = '', image_name: str = '',
+ pool_ioctx: Optional[rados.Ioctx] = None, image_ioctx: Optional[rbd.Image] = None):
assert bool(pool_name) != bool(pool_ioctx) # xor
self._pool_name = pool_name
self._namespace = namespace if namespace is not None else ''
image_refs = cls._rbd_image_refs(ioctx)
for image in image_refs:
image['namespace'] = current_namespace
- image['pool'] = pool
+ image['pool_name'] = pool
joint_refs.append(image)
return joint_refs
for ref in refs:
if search in ref['name']:
image_refs.append(ref)
- elif search in ref['pool']:
+ elif search in ref['pool_name']:
image_refs.append(ref)
elif search in ref['namespace']:
image_refs.append(ref)
sort = '+name'
descending = sort[0] == '-'
sort_by = sort[1:]
- if sort_by == 'pool_name':
- sort_by = 'pool'
- if sort_by not in ['name', 'pool', 'namespace']:
+ if sort_by not in ['name', 'pool_name', 'namespace']:
sort_by = 'name'
if limit == -1:
end = len(image_refs)
for image_ref in sorted(image_refs, key=lambda v: v[sort_by],
reverse=descending)[offset:end]:
- with mgr.rados.open_ioctx(image_ref['pool']) as ioctx:
+ with mgr.rados.open_ioctx(image_ref['pool_name']) as ioctx:
ioctx.set_namespace(image_ref['namespace'])
try:
stat = cls._rbd_image_stat(
- ioctx, image_ref['pool'], image_ref['namespace'], image_ref['name'])
+ ioctx, image_ref['pool_name'], image_ref['namespace'], image_ref['name'])
except rbd.ImageNotFound:
# Check if the RBD has been deleted partially. This happens for example if
# the deletion process of the RBD has been started and was interrupted.
try:
stat = cls._rbd_image_stat_removing(
- ioctx, image_ref['pool'], image_ref['namespace'], image_ref['id'])
+ ioctx, image_ref['pool_name'], image_ref['namespace'], image_ref['id'])
except rbd.ImageNotFound:
continue
- stat['pool'] = image_ref['pool']
result.append(stat)
return result, len(image_refs)