]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/dashboard: new controller for RBD mirroring site name
authorJason Dillaman <dillaman@redhat.com>
Thu, 17 Oct 2019 18:01:11 +0000 (14:01 -0400)
committerJason Dillaman <dillaman@redhat.com>
Thu, 5 Dec 2019 14:32:42 +0000 (09:32 -0500)
This allows setting and retrieving the current site name for
RBD mirroring. This is a global property of the cluster.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
qa/tasks/mgr/dashboard/test_rbd_mirroring.py
src/pybind/mgr/dashboard/controllers/rbd_mirroring.py
src/pybind/mgr/dashboard/tests/test_rbd_mirroring.py

index df719a72601c5a00436252170d23a6759e70653b..bb6e3d0be807411124c4cf6a6e0430e26c6eb3d3 100644 (file)
@@ -178,3 +178,12 @@ class RbdMirroringTest(DashboardTestCase):
 
         self.update_pool('rbd', 'disabled')
         self.assertStatus(200)
+
+    def test_site_name(self):
+        expected_site_name = {'site_name': 'site-a'}
+        self._task_put('/api/block/mirroring/site_name', expected_site_name)
+        self.assertStatus(200)
+
+        site_name = self._get('/api/block/mirroring/site_name')
+        self.assertStatus(200)
+        self.assertEqual(expected_site_name, site_name)
index e8f2d84cb3318700637c4a237dd6f685ffa1261b..8d94b7090958af86848369b976b73209d9f97910 100644 (file)
@@ -12,7 +12,7 @@ import cherrypy
 import rbd
 
 from . import ApiController, Endpoint, Task, BaseController, ReadPermission, \
-    RESTController
+    UpdatePermission, RESTController
 from .rbd import _rbd_call
 
 from .. import mgr
@@ -329,6 +329,26 @@ def _reset_view_cache():
     _get_content_data.reset()
 
 
+@ApiController('/block/mirroring', Scope.RBD_MIRRORING)
+class RbdMirroring(BaseController):
+
+    @Endpoint(method='GET', path='site_name')
+    @handle_rbd_mirror_error()
+    @ReadPermission
+    def get(self):
+        return self._get_site_name()
+
+    @Endpoint(method='PUT', path='site_name')
+    @handle_rbd_mirror_error()
+    @UpdatePermission
+    def set(self, site_name):
+        rbd.RBD().mirror_site_name_set(mgr.rados, site_name)
+        return self._get_site_name()
+
+    def _get_site_name(self):
+        return {'site_name': rbd.RBD().mirror_site_name_get(mgr.rados)}
+
+
 @ApiController('/block/mirroring/summary', Scope.RBD_MIRRORING)
 class RbdMirroringSummary(BaseController):
 
index 605cc4cd5a51fc62c2e01c1fb841891b8606373c..39f70594308b1510f66a32b5c1241ac94dd77c95 100644 (file)
@@ -9,7 +9,7 @@ except ImportError:
 from . import ControllerTestCase
 from .. import mgr
 from ..controllers.summary import Summary
-from ..controllers.rbd_mirroring import RbdMirroringSummary
+from ..controllers.rbd_mirroring import RbdMirroring, RbdMirroringSummary
 from ..services import progress
 
 
@@ -47,6 +47,37 @@ mock_osd_map = {
 }
 
 
+class RbdMirroringControllerTest(ControllerTestCase):
+
+    @classmethod
+    def setup_server(cls):
+        # pylint: disable=protected-access
+        RbdMirroring._cp_config['tools.authenticate.on'] = False
+        # pylint: enable=protected-access
+
+        cls.setup_controllers([RbdMirroring])
+
+    @mock.patch('dashboard.controllers.rbd_mirroring.rbd.RBD')
+    def test_site_name(self, mock_rbd):
+        result = {'site_name': 'fsid'}
+        mock_rbd_instance = mock_rbd.return_value
+        mock_rbd_instance.mirror_site_name_get.return_value = \
+            result['site_name']
+
+        self._get('/api/block/mirroring/site_name')
+        self.assertStatus(200)
+        self.assertJsonBody(result)
+
+        result['site_name'] = 'site-a'
+        mock_rbd_instance.mirror_site_name_get.return_value = \
+            result['site_name']
+        self._put('/api/block/mirroring/site_name', result)
+        self.assertStatus(200)
+        self.assertJsonBody(result)
+        mock_rbd_instance.mirror_site_name_set.assert_called_with(
+            mock.ANY, result['site_name'])
+
+
 class RbdMirroringSummaryControllerTest(ControllerTestCase):
 
     @classmethod