]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: get rgw daemon zonegroup name from mgr 37449/head
authorAlfonso Martínez <almartin@redhat.com>
Tue, 29 Sep 2020 14:37:01 +0000 (16:37 +0200)
committerAlfonso Martínez <almartin@redhat.com>
Tue, 6 Oct 2020 19:52:27 +0000 (21:52 +0200)
Fixes: https://tracker.ceph.com/issues/47676
Signed-off-by: Alfonso Martinez <almartin@redhat.com>
src/pybind/mgr/dashboard/services/rgw_client.py
src/pybind/mgr/dashboard/tests/test_rgw_client.py

index 28256fc2cc63bb3da31a295216a542a59303b2cd..0013d671c74880cd6b6f815e86f054e838572e76 100644 (file)
@@ -12,10 +12,10 @@ from ..awsauth import S3Auth
 from ..exceptions import DashboardException
 from ..rest_client import RequestException, RestClient
 from ..settings import Options, Settings
-from ..tools import build_url, dict_contains_path, dict_get, json_str_to_object, partial_dict
+from ..tools import build_url, dict_contains_path, dict_get, json_str_to_object
 
 try:
-    from typing import Dict, List, Optional
+    from typing import Any, Dict, List, Optional
 except ImportError:
     pass  # For typing only
 
@@ -30,9 +30,9 @@ class NoCredentialsException(RequestException):
             'the dashboard.')
 
 
-def _determine_rgw_addr():
+def _get_daemon_info() -> Dict[str, Any]:
     """
-    Get a RGW daemon to determine the configured host (IP address) and port.
+    Retrieve RGW daemon info from MGR.
     Note, the service id of the RGW daemons may differ depending on the setup.
     Example 1:
     {
@@ -85,6 +85,15 @@ def _determine_rgw_addr():
     if daemon is None:
         raise LookupError('No RGW daemon found')
 
+    return daemon
+
+
+def _determine_rgw_addr():
+    """
+    Parse RGW daemon info to determine the configured host (IP address) and port.
+    """
+    daemon = _get_daemon_info()
+
     addr = _parse_addr(daemon['addr'])
     port, ssl = _parse_frontend_config(daemon['metadata']['frontend_config#0'])
 
@@ -241,16 +250,6 @@ class RgwClient(RestClient):
     def _get_daemon_zone_info(self):  # type: () -> dict
         return json_str_to_object(self.proxy('GET', 'config?type=zone', None, None))
 
-    def _get_daemon_zonegroup_map(self):  # type: () -> List[dict]
-        zonegroups = json_str_to_object(
-            self.proxy('GET', 'config?type=zonegroup-map', None, None)
-        )
-
-        return [partial_dict(
-            zonegroup['val'],
-            ['api_name', 'zones']
-        ) for zonegroup in zonegroups['zonegroups']]
-
     def _get_realms_info(self):  # type: () -> dict
         return json_str_to_object(self.proxy('GET', 'realm?list', None, None))
 
@@ -335,6 +334,8 @@ class RgwClient(RestClient):
         # If user ID is not set, then try to get it via the RGW Admin Ops API.
         self.userid = userid if userid else self._get_user_id(self.admin_path)  # type: str
 
+        self._zonegroup_name: str = _get_daemon_info()['metadata']['zonegroup_name']
+
         logger.info("Created new connection: user=%s, host=%s, port=%s, ssl=%d, sslverify=%d",
                     self.userid, host, port, ssl, ssl_verify)
 
@@ -473,16 +474,6 @@ class RgwClient(RestClient):
 
     def get_placement_targets(self):  # type: () -> dict
         zone = self._get_daemon_zone_info()
-        # A zone without realm id can only belong to default zonegroup.
-        zonegroup_name = 'default'
-        if zone['realm_id']:
-            zonegroup_map = self._get_daemon_zonegroup_map()
-            for zonegroup in zonegroup_map:
-                for realm_zone in zonegroup['zones']:
-                    if realm_zone['id'] == zone['id']:
-                        zonegroup_name = zonegroup['api_name']
-                        break
-
         placement_targets = []  # type: List[Dict]
         for placement_pool in zone['placement_pools']:
             placement_targets.append(
@@ -492,7 +483,7 @@ class RgwClient(RestClient):
                 }
             )
 
-        return {'zonegroup': zonegroup_name, 'placement_targets': placement_targets}
+        return {'zonegroup': self._zonegroup_name, 'placement_targets': placement_targets}
 
     def get_realms(self):  # type: () -> List
         realms_info = self._get_realms_info()
index fa711b45cac68899464ce592b39e9c70f7caa373..7cde2d4c3ff421341b435523aeb8b911fe1f5723 100644 (file)
@@ -12,6 +12,16 @@ from ..settings import Settings
 from . import KVStoreMockMixin  # pylint: disable=no-name-in-module
 
 
+def _dummy_daemon_info():
+    return {
+        'addr': '172.20.0.2:0/256594694',
+        'metadata': {
+            'zonegroup_name': 'zonegroup2-realm1'
+        }
+    }
+
+
+@patch('dashboard.services.rgw_client._get_daemon_info', _dummy_daemon_info)
 class RgwClientTest(unittest.TestCase, KVStoreMockMixin):
     def setUp(self):
         RgwClient._user_instances.clear()  # pylint: disable=protected-access
@@ -34,41 +44,7 @@ class RgwClientTest(unittest.TestCase, KVStoreMockMixin):
         self.assertFalse(instance.session.verify)
 
     @patch.object(RgwClient, '_get_daemon_zone_info')
-    def test_get_placement_targets_from_default_zone(self, zone_info):
-        zone_info.return_value = {
-            'placement_pools': [
-                {
-                    'key': 'default-placement',
-                    'val': {
-                        'index_pool': 'default.rgw.buckets.index',
-                        'storage_classes': {
-                            'STANDARD': {
-                                'data_pool': 'default.rgw.buckets.data'
-                            }
-                        },
-                        'data_extra_pool': 'default.rgw.buckets.non-ec',
-                        'index_type': 0
-                    }
-                }
-            ],
-            'realm_id': ''
-        }
-
-        instance = RgwClient.admin_instance()
-        expected_result = {
-            'zonegroup': 'default',
-            'placement_targets': [
-                {
-                    'name': 'default-placement',
-                    'data_pool': 'default.rgw.buckets.data'
-                }
-            ]
-        }
-        self.assertEqual(expected_result, instance.get_placement_targets())
-
-    @patch.object(RgwClient, '_get_daemon_zone_info')
-    @patch.object(RgwClient, '_get_daemon_zonegroup_map')
-    def test_get_placement_targets_from_realm_zone(self, zonegroup_map, zone_info):
+    def test_get_placement_targets_from_zone(self, zone_info):
         zone_info.return_value = {
             'id': 'a0df30ea-4b5b-4830-b143-2bedf684663d',
             'placement_pools': [
@@ -83,35 +59,9 @@ class RgwClientTest(unittest.TestCase, KVStoreMockMixin):
                         }
                     }
                 }
-            ],
-            'realm_id': 'b5a25d1b-e7ed-4fe5-b461-74f24b8e759b'
+            ]
         }
 
-        zonegroup_map.return_value = [
-            {
-                'api_name': 'zonegroup1-realm1',
-                'zones': [
-                    {
-                        'id': '2ef7d0ef-7616-4e9c-8553-b732ebf0592b'
-                    },
-                    {
-                        'id': 'b1d15925-6c8e-408e-8485-5a62cbccfe1f'
-                    }
-                ]
-            },
-            {
-                'api_name': 'zonegroup2-realm1',
-                'zones': [
-                    {
-                        'id': '645f0f59-8fcc-4e11-95d5-24f289ee8e25'
-                    },
-                    {
-                        'id': 'a0df30ea-4b5b-4830-b143-2bedf684663d'
-                    }
-                ]
-            }
-        ]
-
         instance = RgwClient.admin_instance()
         expected_result = {
             'zonegroup': 'zonegroup2-realm1',