From 135b5c820655c054d65f5cc3ef9ece6051df2b5f Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Wed, 6 Jul 2022 17:47:31 +0200 Subject: [PATCH] mgr/dashboard: fix rbdconfiguration init type Signed-off-by: Pere Diaz Bou (cherry picked from commit 80964fb5204ab18208d1033c927a620448802451) (cherry picked from commit 110b099e4dee0de6ac6c91746397d9aa2922637f) Resolves: rhbz#2125432 --- qa/tasks/mgr/dashboard/test_rbd.py | 8 ++++--- src/pybind/mgr/dashboard/controllers/rbd.py | 4 ++-- src/pybind/mgr/dashboard/services/rbd.py | 21 ++++++++----------- .../mgr/dashboard/tests/test_rbd_service.py | 1 - 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/qa/tasks/mgr/dashboard/test_rbd.py b/qa/tasks/mgr/dashboard/test_rbd.py index 5cd4ac209a93c..500a49f0c726c 100644 --- a/qa/tasks/mgr/dashboard/test_rbd.py +++ b/qa/tasks/mgr/dashboard/test_rbd.py @@ -10,10 +10,12 @@ from .helper import DashboardTestCase, JLeaf, JList, JObj 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) @@ -284,12 +286,12 @@ class RbdTest(DashboardTestCase): 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']) diff --git a/src/pybind/mgr/dashboard/controllers/rbd.py b/src/pybind/mgr/dashboard/controllers/rbd.py index 58a7ab7710dd8..c20ee8ca282b3 100644 --- a/src/pybind/mgr/dashboard/controllers/rbd.py +++ b/src/pybind/mgr/dashboard/controllers/rbd.py @@ -92,9 +92,9 @@ class Rbd(RESTController): cherrypy.response.headers['X-Total-Count'] = num_total_images pool_result = {} for i, image in enumerate(images): - pool = image['pool'] + pool = image['pool_name'] if pool not in pool_result: - pool_result[pool] = {'value': [], 'pool_name': image['pool']} + pool_result[pool] = {'value': [], 'pool_name': image['pool_name']} pool_result[pool]['value'].append(image) images[i]['configuration'] = RbdConfiguration( diff --git a/src/pybind/mgr/dashboard/services/rbd.py b/src/pybind/mgr/dashboard/services/rbd.py index 2384d42e9bc25..f79a65e36e9e3 100644 --- a/src/pybind/mgr/dashboard/services/rbd.py +++ b/src/pybind/mgr/dashboard/services/rbd.py @@ -5,6 +5,7 @@ import json from enum import IntEnum import cherrypy +import rados import rbd from .. import mgr @@ -115,9 +116,8 @@ def rbd_image_call(pool_name, namespace, image_name, func, *args, **kwargs): 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 '' @@ -425,7 +425,7 @@ class RbdService(object): 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 @@ -445,7 +445,7 @@ class RbdService(object): 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) @@ -456,28 +456,25 @@ class RbdService(object): 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) diff --git a/src/pybind/mgr/dashboard/tests/test_rbd_service.py b/src/pybind/mgr/dashboard/tests/test_rbd_service.py index 64382d92913fc..3e82ceda62428 100644 --- a/src/pybind/mgr/dashboard/tests/test_rbd_service.py +++ b/src/pybind/mgr/dashboard/tests/test_rbd_service.py @@ -137,7 +137,6 @@ class RbdServiceTest(unittest.TestCase): 'source': 'REMOVING', 'deletion_time': '{}Z'.format(time.isoformat()), 'deferment_end_time': '{}Z'.format(time.isoformat()), - 'pool': 'test_pool', 'pool_name': 'test_pool', 'namespace': '' }], 1)) -- 2.39.5