]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Takeover PR #20799 and adapt comments. 21258/head
authorVolker Theile <vtheile@suse.com>
Mon, 9 Apr 2018 13:26:26 +0000 (15:26 +0200)
committerVolker Theile <vtheile@suse.com>
Wed, 11 Apr 2018 10:26:42 +0000 (12:26 +0200)
Signed-off-by: Volker Theile <vtheile@suse.com>
src/pybind/mgr/dashboard/controllers/rgw.py
src/pybind/mgr/dashboard/rest_client.py
src/pybind/mgr/dashboard/services/rgw_client.py
src/pybind/mgr/dashboard/tests/test_tools.py
src/pybind/mgr/dashboard/tools.py

index ad4f4c2cc1c074bcacba058bd4e0ee0fd2752aec..d43e9e476b94688b216f263604f6be3b062ac2f9 100644 (file)
@@ -2,12 +2,11 @@
 from __future__ import absolute_import
 
 import json
-
 import cherrypy
 
+from . import ApiController, BaseController, RESTController, AuthRequired
 from .. import logger
 from ..services.ceph_service import CephService
-from ..tools import ApiController, RESTController, AuthRequired
 from ..services.rgw_client import RgwClient
 from ..rest_client import RequestException
 from ..exceptions import NoCredentialsException
@@ -22,20 +21,12 @@ class Rgw(RESTController):
 @ApiController('rgw/daemon')
 @AuthRequired()
 class RgwDaemon(RESTController):
+
     def list(self):
         daemons = []
         for hostname, server in CephService.get_service_map('rgw').items():
             for service in server['services']:
                 metadata = service['metadata']
-                status = service['status']
-                if 'json' in status:
-                    try:
-                        status = json.loads(status['json'])
-                    except ValueError:
-                        logger.warning("%s had invalid status json", service['id'])
-                        status = {}
-                else:
-                    logger.warning('%s has no key "json" in status', service['id'])
 
                 # extract per-daemon service data and health
                 daemon = {
@@ -71,25 +62,23 @@ class RgwDaemon(RESTController):
 
         daemon['rgw_metadata'] = metadata
         daemon['rgw_status'] = status
-
         return daemon
 
 
-@ApiController('rgw/proxy')
+@ApiController('rgw/proxy/{path:.*}')
 @AuthRequired()
-class RgwProxy(RESTController):
+class RgwProxy(BaseController):
     @cherrypy.expose
-    def default(self, *vpath, **params):
+    def __call__(self, path, **params):
         try:
             rgw_client = RgwClient.admin_instance()
 
         except NoCredentialsException as e:
             cherrypy.response.headers['Content-Type'] = 'application/json'
             cherrypy.response.status = 401
-            return json.dumps({'message': e.message})
+            return json.dumps({'message': str(e)}).encode('utf-8')
 
         method = cherrypy.request.method
-        path = '/'.join(vpath)
         data = None
 
         if cherrypy.request.body.length:
index cf339ef97b656ac3ad9fd964a16e5a11c95173a4..3105545fc3beb73019453542917a161e482dc4e3 100644 (file)
@@ -15,7 +15,6 @@ from __future__ import absolute_import
 
 from .tools import build_url
 import inspect
-import itertools
 import re
 import requests
 from requests.exceptions import ConnectionError, InvalidURL
@@ -474,7 +473,7 @@ class RestClient(object):
                 method = api_kwargs.get('method', None)
                 resp_structure = api_kwargs.get('resp_structure', None)
                 args_name = inspect.getargspec(func).args
-                args_dict = dict(itertools.izip(args_name[1:], args))
+                args_dict = dict(zip(args_name[1:], args))
                 for key, val in kwargs:
                     args_dict[key] = val
                 return func(
index 405e0b0b5c6e30d06864e4f46c84ca5d047d0dc4..0089e9f006f673bf5252a39ef9213f51233d3b6b 100644 (file)
@@ -11,21 +11,64 @@ from .. import mgr, logger
 
 
 def _determine_rgw_addr():
+    """
+    Get a RGW daemon to determine the configured host (IP address) and port.
+    Note, the service id of the RGW daemons may differ depending on the setup.
+    Example 1:
+    {
+        ...
+        'services': {
+            'rgw': {
+                'daemons': {
+                    'summary': '',
+                    '0': {
+                        ...
+                        'metadata': {
+                            'frontend_config#0': 'civetweb port=7280',
+                        }
+                        ...
+                    }
+                }
+            }
+        }
+    }
+    Example 2:
+    {
+        ...
+        'services': {
+            'rgw': {
+                'daemons': {
+                    'summary': '',
+                    'rgw': {
+                        ...
+                        'metadata': {
+                            'frontend_config#0': 'civetweb port=8000',
+                        }
+                        ...
+                    }
+                }
+            }
+        }
+    }
+    """
     service_map = mgr.get('service_map')
+    if not dict_contains_path(service_map, ['services', 'rgw', 'daemons']):
+        raise LookupError('No RGW found.')
+    daemon = None
+    daemons = service_map['services']['rgw']['daemons']
+    for key in daemons.keys():
+        if dict_contains_path(daemons[key], ['metadata', 'frontend_config#0']):
+            daemon = daemons[key]
+            break
+    if daemon is None:
+        raise LookupError('No RGW daemon found.')
 
-    if not dict_contains_path(service_map, ['services', 'rgw', 'daemons', 'rgw']):
-        msg = 'No RGW found.'
-        raise LookupError(msg)
-
-    daemon = service_map['services']['rgw']['daemons']['rgw']
     addr = daemon['addr'].split(':')[0]
-    match = re.search(r'port=(\d+)',
-                      daemon['metadata']['frontend_config#0'])
+    match = re.search(r'port=(\d+)', daemon['metadata']['frontend_config#0'])
     if match:
         port = int(match.group(1))
     else:
-        msg = 'Failed to determine RGW port'
-        raise LookupError(msg)
+        raise LookupError('Failed to determine RGW port')
 
     return addr, port
 
index 7c82ea2136c740a0a07963018d0b680f58f1ae7b..4ec6ce943fb8855df749e2f30175d74b5fb4fb0c 100644 (file)
@@ -153,5 +153,4 @@ class TestFunctions(unittest.TestCase):
         self.assertTrue(dict_contains_path(x, ['a', 'b', 'c']))
         self.assertTrue(dict_contains_path(x, ['a']))
         self.assertFalse(dict_contains_path(x, ['a', 'c']))
-
         self.assertTrue(dict_contains_path(x, []))
index 802fd8af4deaf6033586868b7adb6b09f3e39353..1e99dd7a78b172028b275d9cf1774fd1f141761f 100644 (file)
@@ -8,10 +8,10 @@ import fnmatch
 import time
 import threading
 import socket
+from six.moves import urllib
 import cherrypy
 
 from . import logger
-from six.moves import urllib
 
 
 class RequestLoggingTool(cherrypy.Tool):
@@ -673,13 +673,15 @@ def build_url(host, scheme=None, port=None):
 
 def dict_contains_path(dct, keys):
     """
-    Tests wheter the keys exist recursively in `dictionary`.
+    Tests whether the keys exist recursively in `dictionary`.
 
     :type dct: dict
     :type keys: list
     :rtype: bool
     """
     if keys:
+        if not isinstance(dct, dict):
+            return False
         key = keys.pop(0)
         if key in dct:
             dct = dct[key]