]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/pybind/mgr/dashboard/tests/test_rgw.py
import ceph quincy 17.2.4
[ceph.git] / ceph / src / pybind / mgr / dashboard / tests / test_rgw.py
index 2c90e7d11be1dea7da026155586627ee7510caa4..ce1b5fd928fddc0a833c248d80f6164ea8cd82ab 100644 (file)
-try:
-    import mock
-except ImportError:
-    import unittest.mock as mock
+from unittest.mock import Mock, call, patch
 
-from . import ControllerTestCase
-from ..controllers.rgw import RgwUser
+from .. import mgr
+from ..controllers.rgw import Rgw, RgwDaemon, RgwUser
+from ..rest_client import RequestException
+from ..services.rgw_client import RgwClient
+from ..tests import ControllerTestCase, RgwStub
+
+
+class RgwControllerTestCase(ControllerTestCase):
+    @classmethod
+    def setup_server(cls):
+        cls.setup_controllers([Rgw], '/test')
+
+    def setUp(self) -> None:
+        RgwStub.get_daemons()
+        RgwStub.get_settings()
+
+    @patch.object(RgwClient, '_get_user_id', Mock(return_value='fake-user'))
+    @patch.object(RgwClient, 'is_service_online', Mock(return_value=True))
+    @patch.object(RgwClient, '_is_system_user', Mock(return_value=True))
+    def test_status_available(self):
+        self._get('/test/ui-api/rgw/status')
+        self.assertStatus(200)
+        self.assertJsonBody({'available': True, 'message': None})
+
+    @patch.object(RgwClient, '_get_user_id', Mock(return_value='fake-user'))
+    @patch.object(RgwClient, 'is_service_online', Mock(
+        side_effect=RequestException('My test error')))
+    def test_status_online_check_error(self):
+        self._get('/test/ui-api/rgw/status')
+        self.assertStatus(200)
+        self.assertJsonBody({'available': False,
+                             'message': 'My test error'})
+
+    @patch.object(RgwClient, '_get_user_id', Mock(return_value='fake-user'))
+    @patch.object(RgwClient, 'is_service_online', Mock(return_value=False))
+    def test_status_not_online(self):
+        self._get('/test/ui-api/rgw/status')
+        self.assertStatus(200)
+        self.assertJsonBody({'available': False,
+                             'message': "Failed to connect to the Object Gateway's Admin Ops API."})
+
+    @patch.object(RgwClient, '_get_user_id', Mock(return_value='fake-user'))
+    @patch.object(RgwClient, 'is_service_online', Mock(return_value=True))
+    @patch.object(RgwClient, '_is_system_user', Mock(return_value=False))
+    def test_status_not_system_user(self):
+        self._get('/test/ui-api/rgw/status')
+        self.assertStatus(200)
+        self.assertJsonBody({'available': False,
+                             'message': 'The system flag is not set for user "fake-user".'})
+
+    def test_status_no_service(self):
+        RgwStub.get_mgr_no_services()
+        self._get('/test/ui-api/rgw/status')
+        self.assertStatus(200)
+        self.assertJsonBody({'available': False, 'message': 'No RGW service is running.'})
+
+
+class RgwDaemonControllerTestCase(ControllerTestCase):
+    @classmethod
+    def setup_server(cls):
+        cls.setup_controllers([RgwDaemon], '/test')
+
+    @patch('dashboard.services.rgw_client.RgwClient._get_user_id', Mock(
+        return_value='dummy_admin'))
+    def test_list(self):
+        RgwStub.get_daemons()
+        RgwStub.get_settings()
+        mgr.list_servers.return_value = [{
+            'hostname': 'host1',
+            'services': [{'id': '4832', 'type': 'rgw'}, {'id': '5356', 'type': 'rgw'}]
+        }]
+        mgr.get_metadata.side_effect = [
+            {
+                'ceph_version': 'ceph version master (dev)',
+                'id': 'daemon1',
+                'realm_name': 'realm1',
+                'zonegroup_name': 'zg1',
+                'zone_name': 'zone1'
+            },
+            {
+                'ceph_version': 'ceph version master (dev)',
+                'id': 'daemon2',
+                'realm_name': 'realm2',
+                'zonegroup_name': 'zg2',
+                'zone_name': 'zone2'
+            }]
+        self._get('/test/api/rgw/daemon')
+        self.assertStatus(200)
+        self.assertJsonBody([{
+            'id': 'daemon1',
+            'service_map_id': '4832',
+            'version': 'ceph version master (dev)',
+            'server_hostname': 'host1',
+            'realm_name': 'realm1',
+            'zonegroup_name': 'zg1',
+            'zone_name': 'zone1', 'default': True
+        },
+            {
+            'id': 'daemon2',
+            'service_map_id': '5356',
+            'version': 'ceph version master (dev)',
+            'server_hostname': 'host1',
+            'realm_name': 'realm2',
+            'zonegroup_name': 'zg2',
+            'zone_name': 'zone2',
+            'default': False
+        }])
+
+    def test_list_empty(self):
+        RgwStub.get_mgr_no_services()
+        self._get('/test/api/rgw/daemon')
+        self.assertStatus(200)
+        self.assertJsonBody([])
 
 
 class RgwUserControllerTestCase(ControllerTestCase):
     @classmethod
     def setup_server(cls):
-        RgwUser._cp_config['tools.authenticate.on'] = False  # pylint: disable=protected-access
         cls.setup_controllers([RgwUser], '/test')
 
-    @mock.patch('dashboard.controllers.rgw.RgwRESTController.proxy')
+    @patch('dashboard.controllers.rgw.RgwRESTController.proxy')
     def test_user_list(self, mock_proxy):
         mock_proxy.side_effect = [{
             'count': 3,
             'keys': ['test1', 'test2', 'test3'],
             'truncated': False
         }]
-        self._get('/test/api/rgw/user')
+        self._get('/test/api/rgw/user?daemon_name=dummy-daemon')
         self.assertStatus(200)
         mock_proxy.assert_has_calls([
-            mock.call('GET', 'user?list', {})
+            call('dummy-daemon', 'GET', 'user?list', {})
         ])
         self.assertJsonBody(['test1', 'test2', 'test3'])
 
-    @mock.patch('dashboard.controllers.rgw.RgwRESTController.proxy')
+    @patch('dashboard.controllers.rgw.RgwRESTController.proxy')
     def test_user_list_marker(self, mock_proxy):
         mock_proxy.side_effect = [{
             'count': 3,
@@ -42,12 +149,12 @@ class RgwUserControllerTestCase(ControllerTestCase):
         self._get('/test/api/rgw/user')
         self.assertStatus(200)
         mock_proxy.assert_has_calls([
-            mock.call('GET', 'user?list', {}),
-            mock.call('GET', 'user?list', {'marker': 'foo:bar'})
+            call(None, 'GET', 'user?list', {}),
+            call(None, 'GET', 'user?list', {'marker': 'foo:bar'})
         ])
         self.assertJsonBody(['test1', 'test2', 'test3', 'admin'])
 
-    @mock.patch('dashboard.controllers.rgw.RgwRESTController.proxy')
+    @patch('dashboard.controllers.rgw.RgwRESTController.proxy')
     def test_user_list_duplicate_marker(self, mock_proxy):
         mock_proxy.side_effect = [{
             'count': 3,
@@ -67,7 +174,7 @@ class RgwUserControllerTestCase(ControllerTestCase):
         self._get('/test/api/rgw/user')
         self.assertStatus(500)
 
-    @mock.patch('dashboard.controllers.rgw.RgwRESTController.proxy')
+    @patch('dashboard.controllers.rgw.RgwRESTController.proxy')
     def test_user_list_invalid_marker(self, mock_proxy):
         mock_proxy.side_effect = [{
             'count': 3,
@@ -87,8 +194,8 @@ class RgwUserControllerTestCase(ControllerTestCase):
         self._get('/test/api/rgw/user')
         self.assertStatus(500)
 
-    @mock.patch('dashboard.controllers.rgw.RgwRESTController.proxy')
-    @mock.patch.object(RgwUser, '_keys_allowed')
+    @patch('dashboard.controllers.rgw.RgwRESTController.proxy')
+    @patch.object(RgwUser, '_keys_allowed')
     def test_user_get_with_keys(self, keys_allowed, mock_proxy):
         keys_allowed.return_value = True
         mock_proxy.return_value = {
@@ -102,8 +209,8 @@ class RgwUserControllerTestCase(ControllerTestCase):
         self.assertInJsonBody('keys')
         self.assertInJsonBody('swift_keys')
 
-    @mock.patch('dashboard.controllers.rgw.RgwRESTController.proxy')
-    @mock.patch.object(RgwUser, '_keys_allowed')
+    @patch('dashboard.controllers.rgw.RgwRESTController.proxy')
+    @patch.object(RgwUser, '_keys_allowed')
     def test_user_get_without_keys(self, keys_allowed, mock_proxy):
         keys_allowed.return_value = False
         mock_proxy.return_value = {