+++ /dev/null
-# -*- coding: utf-8 -*-
-from __future__ import absolute_import
-
-import cherrypy
-import rbd
-
-from ..tools import ApiController, AuthRequired, BaseController, ViewCache
-
-
-@ApiController('block_pool')
-@AuthRequired()
-class BlockPool(BaseController):
-
- def __init__(self):
- self.rbd = None
-
- def _format_bitmask(self, features):
- RBD_FEATURES_NAME_MAPPING = {
- rbd.RBD_FEATURE_LAYERING: "layering",
- rbd.RBD_FEATURE_STRIPINGV2: "striping",
- rbd.RBD_FEATURE_EXCLUSIVE_LOCK: "exclusive-lock",
- rbd.RBD_FEATURE_OBJECT_MAP: "object-map",
- rbd.RBD_FEATURE_FAST_DIFF: "fast-diff",
- rbd.RBD_FEATURE_DEEP_FLATTEN: "deep-flatten",
- rbd.RBD_FEATURE_JOURNALING: "journaling",
- rbd.RBD_FEATURE_DATA_POOL: "data-pool",
- rbd.RBD_FEATURE_OPERATIONS: "operations",
- }
- names = [val for key, val in RBD_FEATURES_NAME_MAPPING.items()
- if key & features == key]
- return ', '.join(sorted(names))
-
- @ViewCache()
- def _rbd_list(self, pool_name):
- ioctx = self.mgr.rados.open_ioctx(pool_name)
- self.rbd = rbd.RBD()
- names = self.rbd.list(ioctx)
- result = []
- for name in names:
- i = rbd.Image(ioctx, name)
- stat = i.stat()
- stat['name'] = name
- features = i.features()
- stat['features'] = features
- stat['features_name'] = self._format_bitmask(features)
-
- try:
- parent_info = i.parent_info()
- parent = "{}@{}".format(parent_info[0], parent_info[1])
- if parent_info[0] != pool_name:
- parent = "{}/{}".format(parent_info[0], parent)
- stat['parent'] = parent
- except rbd.ImageNotFound:
- pass
- result.append(stat)
- return result
-
- @cherrypy.expose
- @cherrypy.tools.json_out()
- def rbd_pool_data(self, pool_name):
- # pylint: disable=unbalanced-tuple-unpacking
- status, value = self._rbd_list(pool_name)
- if status == ViewCache.VALUE_EXCEPTION:
- raise value
- return {'status': status, 'value': value}
--- /dev/null
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+import rbd
+
+from ..tools import ApiController, AuthRequired, RESTController, ViewCache
+
+
+@ApiController('rbd')
+@AuthRequired()
+class Rbd(RESTController):
+
+ def __init__(self):
+ self.rbd = None
+
+ @staticmethod
+ def _format_bitmask(features):
+ """
+ Formats the bitmask:
+
+ >>> Rbd._format_bitmask(45)
+ 'deep-flatten, exclusive-lock, layering, object-map'
+ """
+ RBD_FEATURES_NAME_MAPPING = {
+ rbd.RBD_FEATURE_LAYERING: "layering",
+ rbd.RBD_FEATURE_STRIPINGV2: "striping",
+ rbd.RBD_FEATURE_EXCLUSIVE_LOCK: "exclusive-lock",
+ rbd.RBD_FEATURE_OBJECT_MAP: "object-map",
+ rbd.RBD_FEATURE_FAST_DIFF: "fast-diff",
+ rbd.RBD_FEATURE_DEEP_FLATTEN: "deep-flatten",
+ rbd.RBD_FEATURE_JOURNALING: "journaling",
+ rbd.RBD_FEATURE_DATA_POOL: "data-pool",
+ rbd.RBD_FEATURE_OPERATIONS: "operations",
+ }
+ names = [val for key, val in RBD_FEATURES_NAME_MAPPING.items()
+ if key & features == key]
+ return ', '.join(sorted(names))
+
+ @ViewCache()
+ def _rbd_list(self, pool_name):
+ ioctx = self.mgr.rados.open_ioctx(pool_name)
+ self.rbd = rbd.RBD()
+ names = self.rbd.list(ioctx)
+ result = []
+ for name in names:
+ i = rbd.Image(ioctx, name)
+ stat = i.stat()
+ stat['name'] = name
+ features = i.features()
+ stat['features'] = features
+ stat['features_name'] = self._format_bitmask(features)
+
+ try:
+ parent_info = i.parent_info()
+ parent = "{}@{}".format(parent_info[0], parent_info[1])
+ if parent_info[0] != pool_name:
+ parent = "{}/{}".format(parent_info[0], parent)
+ stat['parent'] = parent
+ except rbd.ImageNotFound:
+ pass
+ result.append(stat)
+ return result
+
+ def get(self, pool_name):
+ # pylint: disable=unbalanced-tuple-unpacking
+ status, value = self._rbd_list(pool_name)
+ if status == ViewCache.VALUE_EXCEPTION:
+ raise value
+ return {'status': status, 'value': value}
}
rbdPoolImages(pool) {
- return this.http.get(`/api/block_pool/rbd_pool_data/${pool}`).toPromise().then((resp: any) => {
+ return this.http.get(`/api/rbd/${pool}`).toPromise().then((resp: any) => {
return resp;
});
}
+++ /dev/null
-# -*- coding: utf-8 -*-
-
-from __future__ import absolute_import
-
-from .helper import ControllerTestCase, authenticate
-
-
-class BlockPoolTest(ControllerTestCase):
-
- @classmethod
- def setUpClass(cls):
- cls._ceph_cmd(['osd', 'pool', 'create', 'rbd', '100', '100'])
- cls._ceph_cmd(['osd', 'pool', 'application', 'enable', 'rbd', 'rbd'])
- cls._rbd_cmd(['create', '--size=1G', 'img1'])
- cls._rbd_cmd(['create', '--size=2G', 'img2'])
-
- @classmethod
- def tearDownClass(cls):
- cls._ceph_cmd(['osd', 'pool', 'delete', 'rbd', '--yes-i-really-really-mean-it'])
-
- @authenticate
- def test_list(self):
- data = self._get('/api/block_pool/rbd_pool_data/rbd')
- self.assertStatus(200)
-
- img1 = data['value'][0]
- self.assertEqual(img1['name'], 'img1')
- self.assertEqual(img1['size'], 1073741824)
- self.assertEqual(img1['num_objs'], 256)
- self.assertEqual(img1['obj_size'], 4194304)
- self.assertEqual(img1['features_name'],
- 'deep-flatten, exclusive-lock, fast-diff, layering, object-map')
-
- img2 = data['value'][1]
- self.assertEqual(img2['name'], 'img2')
- self.assertEqual(img2['size'], 2147483648)
- self.assertEqual(img2['num_objs'], 512)
- self.assertEqual(img2['obj_size'], 4194304)
- self.assertEqual(img2['features_name'],
- 'deep-flatten, exclusive-lock, fast-diff, layering, object-map')
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from __future__ import absolute_import
+
+from .helper import ControllerTestCase, authenticate
+
+
+class RbdTest(ControllerTestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ cls._ceph_cmd(['osd', 'pool', 'create', 'rbd', '100', '100'])
+ cls._ceph_cmd(['osd', 'pool', 'application', 'enable', 'rbd', 'rbd'])
+ cls._rbd_cmd(['create', '--size=1G', 'img1'])
+ cls._rbd_cmd(['create', '--size=2G', 'img2'])
+
+ @classmethod
+ def tearDownClass(cls):
+ cls._ceph_cmd(['osd', 'pool', 'delete', 'rbd', '--yes-i-really-really-mean-it'])
+
+ @authenticate
+ def test_list(self):
+ data = self._get('/api/rbd/rbd')
+ self.assertStatus(200)
+
+ img1 = data['value'][0]
+ self.assertEqual(img1['name'], 'img1')
+ self.assertEqual(img1['size'], 1073741824)
+ self.assertEqual(img1['num_objs'], 256)
+ self.assertEqual(img1['obj_size'], 4194304)
+ self.assertEqual(img1['features_name'],
+ 'deep-flatten, exclusive-lock, fast-diff, layering, object-map')
+
+ img2 = data['value'][1]
+ self.assertEqual(img2['name'], 'img2')
+ self.assertEqual(img2['size'], 2147483648)
+ self.assertEqual(img2['num_objs'], 512)
+ self.assertEqual(img2['obj_size'], 4194304)
+ self.assertEqual(img2['features_name'],
+ 'deep-flatten, exclusive-lock, fast-diff, layering, object-map')
PATH = {toxinidir}/../../../../build/bin:$PATH
DASHBOARD_V2_PORT=9865
commands=
- {envbindir}/py.test --cov=. --cov-report= --junitxml=junit.{envname}.xml tests/
+ {envbindir}/py.test --cov=. --cov-report= --junitxml=junit.{envname}.xml --doctest-modules controllers/rbd.py tests/
[testenv:cov-init]
setenv =