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()
+ 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.
from ..tools import build_url, dict_contains_path, dict_get, json_str_to_object
try:
- from typing import Any, Dict, List, Optional
+ from typing import Any, Dict, List, Optional, Tuple
except ImportError:
pass # For typing only
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.
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.
# 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()
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)