]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Drop invalid RGW client instances, improve logging 38583/head
authorVolker Theile <vtheile@suse.com>
Wed, 2 Dec 2020 16:14:45 +0000 (17:14 +0100)
committerVolker Theile <vtheile@suse.com>
Tue, 15 Dec 2020 09:28:30 +0000 (10:28 +0100)
* Log RGW settings for easier problem tracking.
* Drop RGW client instances that do not exist anymore. This happens when a RGW service is removed via the orchestrator. The Dashboard tries to access the RGW client using the previous settings which leads to an error which might be confusing. Without dropping the error message 'RGW REST API failed request ...' is displayed instead of the correct one 'No RGW found'. Dropping the RGW client instance will produce correct error messages the next time the backend tries to establish a new connection.

Fixes: https://tracker.ceph.com/issues/48586
Signed-off-by: Volker Theile <vtheile@suse.com>
(cherry picked from commit 495ff0a2cf1713312deba3b61da6d213019fc920)

src/pybind/mgr/dashboard/controllers/rgw.py
src/pybind/mgr/dashboard/services/rgw_client.py

index 31271514850328aa172cfad0f8c16356508ada02..6e17f3e80278abc6ac216caa2dfb8eaf8bba8592 100644 (file)
@@ -32,7 +32,19 @@ class Rgw(BaseController):
         try:
             instance = RgwClient.admin_instance()
             # Check if the service is online.
-            if not instance.is_service_online():  # pragma: no cover - no complexity there
+            try:
+                is_online = instance.is_service_online()  # pragma: no cover - no complexity there
+            except RequestException as e:
+                # Drop this instance because the RGW client seems not to
+                # exist anymore (maybe removed via orchestrator). Removing
+                # the instance from the cache will result in the correct
+                # error message next time when the backend tries to
+                # establish a new connection (-> 'No RGW found' instead
+                # of 'RGW REST API failed request ...').
+                # Note, this only applies to auto-detected RGW clients.
+                RgwClient.drop_instance(instance.userid)
+                raise e
+            if not is_online:
                 msg = 'Failed to connect to the Object Gateway\'s Admin Ops API.'
                 raise RequestException(msg)
             # Ensure the API user ID is known by the RGW.
index 63865051c95a009c73b05320a8c7cf14583c62a9..69093acf599b4a6d4a3739b0a72f16c14d244aac 100644 (file)
@@ -16,7 +16,7 @@ from ..tools import build_url, dict_contains_path, json_str_to_object,\
 from .. import mgr
 
 try:
-    from typing import Any, Dict, List, Optional  # pylint: disable=unused-import
+    from typing import Any, Dict, List, Optional, Tuple  # pylint: disable=unused-import
 except ImportError:
     pass  # For typing only
 
@@ -89,19 +89,21 @@ def _get_daemon_info() -> Dict[str, Any]:
     return daemon
 
 
-def _determine_rgw_addr():
+def _determine_rgw_addr() -> Tuple[str, int, bool]:
     """
     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'])
 
+    logger.info('Auto-detected RGW configuration: addr=%s, port=%d, ssl=%s',
+                addr, port, str(ssl))
+
     return addr, port, ssl
 
 
-def _parse_addr(value):
+def _parse_addr(value) -> str:
     """
     Get the IP address the RGW is running on.
 
@@ -155,7 +157,7 @@ def _parse_addr(value):
     raise LookupError('Failed to determine RGW address')
 
 
-def _parse_frontend_config(config):
+def _parse_frontend_config(config) -> Tuple[int, bool]:
     """
     Get the port the RGW is running on. Due the complexity of the
     syntax not all variations are supported.
@@ -271,7 +273,7 @@ class RgwClient(RestClient):
         # Discard all cached instances if any rgw setting has changed
         if RgwClient._rgw_settings_snapshot != RgwClient._rgw_settings():
             RgwClient._rgw_settings_snapshot = RgwClient._rgw_settings()
-            RgwClient._user_instances.clear()
+            RgwClient.drop_instance()
 
         if not RgwClient._user_instances:
             RgwClient._load_settings()
@@ -298,6 +300,16 @@ class RgwClient(RestClient):
     def admin_instance():
         return RgwClient.instance(RgwClient._SYSTEM_USERID)
 
+    @staticmethod
+    def drop_instance(userid: Optional[str] = None):
+        """
+        Drop a cached instance by name or all.
+        """
+        if userid:
+            RgwClient._user_instances.pop(userid, None)
+        else:
+            RgwClient._user_instances.clear()
+
     def _reset_login(self):
         if self.userid != RgwClient._SYSTEM_USERID:
             logger.info("Fetching new keys for user: %s", self.userid)