]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard_v2: use global manager instance instead of injection
authorRicardo Dias <rdias@suse.com>
Mon, 26 Feb 2018 15:25:25 +0000 (15:25 +0000)
committerRicardo Dias <rdias@suse.com>
Mon, 5 Mar 2018 13:07:17 +0000 (13:07 +0000)
Signed-off-by: Ricardo Dias <rdias@suse.com>
19 files changed:
src/pybind/mgr/dashboard_v2/HACKING.rst
src/pybind/mgr/dashboard_v2/__init__.py
src/pybind/mgr/dashboard_v2/controllers/auth.py
src/pybind/mgr/dashboard_v2/controllers/cephfs.py
src/pybind/mgr/dashboard_v2/controllers/cluster_configuration.py
src/pybind/mgr/dashboard_v2/controllers/dashboard.py
src/pybind/mgr/dashboard_v2/controllers/host.py
src/pybind/mgr/dashboard_v2/controllers/monitor.py
src/pybind/mgr/dashboard_v2/controllers/osd.py
src/pybind/mgr/dashboard_v2/controllers/perf_counters.py
src/pybind/mgr/dashboard_v2/controllers/rbd.py
src/pybind/mgr/dashboard_v2/controllers/rbd_mirroring.py
src/pybind/mgr/dashboard_v2/controllers/summary.py
src/pybind/mgr/dashboard_v2/controllers/tcmu_iscsi.py
src/pybind/mgr/dashboard_v2/module.py
src/pybind/mgr/dashboard_v2/services/ceph_service.py
src/pybind/mgr/dashboard_v2/tests/test_rbd_mirroring.py
src/pybind/mgr/dashboard_v2/tests/test_tcmu_iscsi.py
src/pybind/mgr/dashboard_v2/tools.py

index 3cda2278d4bc9fd7b9fae876521247656f3d2b8a..498c83c99b9cb2d95567528576555f4c8ee92672 100644 (file)
@@ -315,21 +315,21 @@ Now only authenticated users will be able to "ping" your controller.
 How to access the manager module instance from a controller?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Each controller class derived from ``BaseController``has a class property that
-points to the manager module global instance. The property is named ``mgr``.
-There is another class property called ``logger`` to easily add log messages.
+We provide the manager module instance as a global variable that can be
+imported in any module. We also provide a logger instance in the same way.
 
 Example::
 
   import cherrypy
+  from .. import logger, mgr
   from ..tools import ApiController, RESTController
 
 
   @ApiController('servers')
   class Servers(RESTController):
     def list(self):
-      self.logger.debug('Listing available servers')
-      return {'servers': self.mgr.list_servers()}
+      logger.debug('Listing available servers')
+      return {'servers': mgr.list_servers()}
 
 
 How to write a unit test for a controller?
@@ -435,13 +435,14 @@ Consider the following example that implements a controller that retrieves the
 list of RBD images of the ``rbd`` pool::
 
   import rbd
+  from .. import mgr
   from ..tools import ApiController, RESTController
 
 
   @ApiController('rbdimages')
   class RbdImages(RESTController):
       def __init__(self):
-          self.ioctx = self.mgr.rados.open_ioctx('rbd')
+          self.ioctx = mgr.rados.open_ioctx('rbd')
           self.rbd = rbd.RBD()
 
       def list(self):
index db91456adf3b4d8c13c6564858b0a49a4c902f31..f09ef245276b6f8656259ba285dd05f98137f44f 100644 (file)
@@ -1,4 +1,5 @@
 # -*- coding: utf-8 -*-
+# pylint: disable=wrong-import-position,global-statement,protected-access
 """
 openATTIC module
 """
@@ -10,16 +11,31 @@ import os
 if 'UNITTEST' not in os.environ:
     class _LoggerProxy(object):
         def __init__(self):
-            self.logger = None
+            self._logger = None
 
         def __getattr__(self, item):
-            if self.logger is None:
-                raise AttributeError("Logging not initialized")
-            return getattr(self.logger, item)
+            if self._logger is None:
+                raise AttributeError("logger not initialized")
+            return getattr(self._logger, item)
 
+    class _ModuleProxy(object):
+        def __init__(self):
+            self._mgr = None
+
+        def init(self, module_inst):
+            global logger
+            self._mgr = module_inst
+            logger._logger = self._mgr._logger
+
+        def __getattr__(self, item):
+            if self._mgr is None:
+                raise AttributeError("global manager module instance not initialized")
+            return getattr(self._mgr, item)
+
+    mgr = _ModuleProxy()
     logger = _LoggerProxy()
-    # pylint: disable=wildcard-import, wrong-import-position
-    from .module import *  # NOQA
+
+    from .module import Module, StandbyModule
 else:
     import logging
     logging.basicConfig(level=logging.DEBUG)
@@ -33,3 +49,5 @@ else:
     import sys
     import mock
     sys.modules['ceph_module'] = mock.Mock()
+
+    mgr = mock.Mock()
index efa7479196261d3540ba948bcc4827c0c0d29840..28a2f28f7d36f9a94f701b2019247179cb62f6c2 100644 (file)
@@ -8,7 +8,7 @@ import bcrypt
 import cherrypy
 
 from ..tools import ApiController, RESTController, Session
-from .. import logger
+from .. import logger, mgr
 
 
 @ApiController('auth')
@@ -29,8 +29,8 @@ class Auth(RESTController):
     @RESTController.args_from_json
     def create(self, username, password, stay_signed_in=False):
         now = time.time()
-        config_username = self.mgr.get_config('username', None)
-        config_password = self.mgr.get_config('password', None)
+        config_username = mgr.get_config('username', None)
+        config_password = mgr.get_config('password', None)
         hash_password = Auth.password_hash(password,
                                            config_password)
         if username == config_username and hash_password == config_password:
@@ -71,7 +71,7 @@ class Auth(RESTController):
             raise cherrypy.HTTPError(401, 'You are not authorized to access '
                                           'that resource')
         now = time.time()
-        expires = float(Auth.mgr.get_config(
+        expires = float(mgr.get_config(
             'session-expire', Session.DEFAULT_EXPIRE))
         if expires > 0:
             username_ts = cherrypy.session.get(Session.TS, None)
@@ -86,6 +86,6 @@ class Auth(RESTController):
 
     @staticmethod
     def set_login_credentials(username, password):
-        Auth.mgr.set_config('username', username)
+        mgr.set_config('username', username)
         hashed_passwd = Auth.password_hash(password)
-        Auth.mgr.set_config('password', hashed_passwd)
+        mgr.set_config('password', hashed_passwd)
index 00b241f1b2833875a021605016eea78e160ebc34..c4786cebaf92fcf820849465fe9e50715a8dd40e 100644 (file)
@@ -7,6 +7,7 @@ import json
 import cherrypy
 from mgr_module import CommandResult
 
+from .. import mgr
 from ..tools import ApiController, AuthRequired, BaseController, ViewCache
 
 
@@ -66,7 +67,7 @@ class CephFS(BaseController):
         for mds_name in mds_names:
             result[mds_name] = {}
             for counter in counters:
-                data = self.mgr.get_counter("mds", mds_name, counter)
+                data = mgr.get_counter("mds", mds_name, counter)
                 if data is not None:
                     result[mds_name][counter] = data[counter]
                 else:
@@ -84,7 +85,7 @@ class CephFS(BaseController):
     def _get_mds_names(self, filesystem_id=None):
         names = []
 
-        fsmap = self.mgr.get("fs_map")
+        fsmap = mgr.get("fs_map")
         for fs in fsmap['filesystems']:
             if filesystem_id is not None and fs['id'] != filesystem_id:
                 continue
@@ -97,7 +98,7 @@ class CephFS(BaseController):
         return names
 
     def get_rate(self, daemon_type, daemon_name, stat):
-        data = self.mgr.get_counter(daemon_type, daemon_name, stat)[stat]
+        data = mgr.get_counter(daemon_type, daemon_name, stat)[stat]
 
         if data and len(data) > 1:
             return (data[-1][1] - data[-2][1]) / float(data[-1][0] - data[-2][0])
@@ -108,7 +109,7 @@ class CephFS(BaseController):
     def fs_status(self, fs_id):
         mds_versions = defaultdict(list)
 
-        fsmap = self.mgr.get("fs_map")
+        fsmap = mgr.get("fs_map")
         filesystem = None
         for fs in fsmap['filesystems']:
             if fs['id'] == fs_id:
@@ -163,7 +164,7 @@ class CephFS(BaseController):
                                              info['name'],
                                              "mds_server.handle_client_request")
 
-                metadata = self.mgr.get_metadata('mds', info['name'])
+                metadata = mgr.get_metadata('mds', info['name'])
                 mds_versions[metadata.get('ceph_version', 'unknown')].append(
                     info['name'])
                 rank_table.append(
@@ -212,9 +213,9 @@ class CephFS(BaseController):
                 }
             )
 
-        df = self.mgr.get("df")
+        df = mgr.get("df")
         pool_stats = dict([(p['id'], p['stats']) for p in df['pools']])
-        osdmap = self.mgr.get("osd_map")
+        osdmap = mgr.get("osd_map")
         pools = dict([(p['pool'], p) for p in osdmap['pools']])
         metadata_pool_id = mdsmap['metadata_pool']
         data_pool_ids = mdsmap['data_pools']
@@ -232,7 +233,7 @@ class CephFS(BaseController):
 
         standby_table = []
         for standby in fsmap['standbys']:
-            metadata = self.mgr.get_metadata('mds', standby['name'])
+            metadata = mgr.get_metadata('mds', standby['name'])
             mds_versions[metadata.get('ceph_version', 'unknown')].append(
                 standby['name'])
 
@@ -255,7 +256,7 @@ class CephFS(BaseController):
     def _clients(self, fs_id):
         cephfs_clients = self.cephfs_clients.get(fs_id, None)
         if cephfs_clients is None:
-            cephfs_clients = CephFSClients(self.mgr, fs_id)
+            cephfs_clients = CephFSClients(mgr, fs_id)
             self.cephfs_clients[fs_id] = cephfs_clients
 
         try:
@@ -290,7 +291,7 @@ class CephFS(BaseController):
         }
 
     def get_latest(self, daemon_type, daemon_name, stat):
-        data = self.mgr.get_counter(daemon_type, daemon_name, stat)[stat]
+        data = mgr.get_counter(daemon_type, daemon_name, stat)[stat]
         if data:
             return data[-1][1]
         return 0
index c8626aadf62c514c740f9c80db86913095edd1f1..80d5909d73246ab7df638988a4caf894d8a3e0e5 100644 (file)
@@ -1,4 +1,9 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
 import cherrypy
+
+from .. import mgr
 from ..tools import ApiController, RESTController, AuthRequired
 
 
@@ -10,7 +15,7 @@ class ClusterConfiguration(RESTController):
         if level is not None:
             assert level in levels
 
-        options = self.mgr.get("config_options")['options']
+        options = mgr.get("config_options")['options']
 
         if service is not None:
             options = [o for o in options if service in o['services']]
@@ -24,7 +29,7 @@ class ClusterConfiguration(RESTController):
         return options
 
     def get(self, name):
-        for option in self.mgr.get('config_options')['options']:
+        for option in mgr.get('config_options')['options']:
             if option['name'] == name:
                 return option
 
index da8a3b341c4f9136a33ecebf3b60d6d71efaae43..01dc441c5423ad4376c9b1edb0d758a9afc87d4c 100644 (file)
@@ -9,6 +9,7 @@ import time
 import cherrypy
 from mgr_module import CommandResult
 
+from .. import mgr
 from ..tools import ApiController, AuthRequired, BaseController, NotificationQueue
 
 
@@ -34,7 +35,7 @@ class Dashboard(BaseController):
 
     def load_buffer(self, buf, channel_name):
         result = CommandResult("")
-        self.mgr.send_command(result, "mon", "", json.dumps({
+        mgr.send_command(result, "mon", "", json.dumps({
             "prefix": "log last",
             "format": "json",
             "channel": channel_name,
@@ -71,14 +72,14 @@ class Dashboard(BaseController):
 
         osd_map = self.osd_map()
 
-        pg_summary = self.mgr.get("pg_summary")
+        pg_summary = mgr.get("pg_summary")
 
         pools = []
 
         pool_stats = defaultdict(lambda: defaultdict(
             lambda: collections.deque(maxlen=10)))
 
-        df = self.mgr.get("df")
+        df = mgr.get("df")
         pool_stats_dict = dict([(p['id'], p['stats']) for p in df['pools']])
         now = time.time()
         for pool_id, stats in pool_stats_dict.items():
@@ -115,33 +116,33 @@ class Dashboard(BaseController):
         return {
             "health": self.health_data(),
             "mon_status": self.mon_status(),
-            "fs_map": self.mgr.get('fs_map'),
+            "fs_map": mgr.get('fs_map'),
             "osd_map": osd_map,
             "clog": list(self.log_buffer),
             "audit_log": list(self.audit_buffer),
             "pools": pools,
-            "mgr_map": self.mgr.get("mgr_map"),
+            "mgr_map": mgr.get("mgr_map"),
             "df": df
         }
 
     def mon_status(self):
-        mon_status_data = self.mgr.get("mon_status")
+        mon_status_data = mgr.get("mon_status")
         return json.loads(mon_status_data['json'])
 
     def osd_map(self):
-        osd_map = self.mgr.get("osd_map")
+        osd_map = mgr.get("osd_map")
 
         assert osd_map is not None
 
-        osd_map['tree'] = self.mgr.get("osd_map_tree")
-        osd_map['crush'] = self.mgr.get("osd_map_crush")
-        osd_map['crush_map_text'] = self.mgr.get("osd_map_crush_map_text")
-        osd_map['osd_metadata'] = self.mgr.get("osd_metadata")
+        osd_map['tree'] = mgr.get("osd_map_tree")
+        osd_map['crush'] = mgr.get("osd_map_crush")
+        osd_map['crush_map_text'] = mgr.get("osd_map_crush_map_text")
+        osd_map['osd_metadata'] = mgr.get("osd_metadata")
 
         return osd_map
 
     def health_data(self):
-        health_data = self.mgr.get("health")
+        health_data = mgr.get("health")
         health = json.loads(health_data['json'])
 
         # Transform the `checks` dict into a list for the convenience
index 5e280d7365e1e214a8d6502f0aa6727e949af1ea..8bef07185ae9932762fc7c5ac245fa01ee5d6704 100644 (file)
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 from __future__ import absolute_import
 
+from .. import mgr
 from ..tools import ApiController, AuthRequired, RESTController
 
 
@@ -8,4 +9,4 @@ from ..tools import ApiController, AuthRequired, RESTController
 @AuthRequired()
 class Host(RESTController):
     def list(self):
-        return self.mgr.list_servers()
+        return mgr.list_servers()
index ef245d54580512801ad9a8298cd36a124ead3740..ac3bfe478b63eea97de5ec74c3bb90cde833d774 100644 (file)
@@ -5,6 +5,7 @@ import json
 
 import cherrypy
 
+from .. import mgr
 from ..tools import ApiController, AuthRequired, BaseController
 
 
@@ -18,13 +19,13 @@ class Monitor(BaseController):
 
         counters = ['mon.num_sessions']
 
-        mon_status_json = self.mgr.get("mon_status")
+        mon_status_json = mgr.get("mon_status")
         mon_status = json.loads(mon_status_json['json'])
 
         for mon in mon_status["monmap"]["mons"]:
             mon["stats"] = {}
             for counter in counters:
-                data = self.mgr.get_counter("mon", mon["name"], counter)
+                data = mgr.get_counter("mon", mon["name"], counter)
                 if data is not None:
                     mon["stats"][counter.split(".")[1]] = data[counter]
                 else:
index 5f89fa032856a4a0d1512d45aa99179546120fd6..24fca6d9828d572e2d2540b5e2a7d1a9bbb423e5 100644 (file)
@@ -4,15 +4,16 @@ from __future__ import absolute_import
 import json
 
 from mgr_module import CommandResult
+
+from .. import logger, mgr
 from ..tools import ApiController, AuthRequired, RESTController
-from .. import logger
 
 
 @ApiController('osd')
 @AuthRequired()
 class Osd(RESTController):
     def get_counter(self, daemon_name, stat):
-        return self.mgr.get_counter('osd', daemon_name, stat)[stat]
+        return mgr.get_counter('osd', daemon_name, stat)[stat]
 
     def get_rate(self, daemon_name, stat):
         data = self.get_counter(daemon_name, stat)
@@ -31,10 +32,10 @@ class Osd(RESTController):
     def list(self):
         osds = self.get_osd_map()
         # Extending by osd stats information
-        for s in self.mgr.get('osd_stats')['osd_stats']:
+        for s in mgr.get('osd_stats')['osd_stats']:
             osds[str(s['osd'])].update({'osd_stats': s})
         # Extending by osd node information
-        nodes = self.mgr.get('osd_map_tree')['nodes']
+        nodes = mgr.get('osd_map_tree')['nodes']
         osd_tree = [(str(o['id']), o) for o in nodes if o['id'] >= 0]
         for o in osd_tree:
             osds[o[0]].update({'tree': o[1]})
@@ -61,18 +62,18 @@ class Osd(RESTController):
 
     def get_osd_map(self):
         osds = {}
-        for osd in self.mgr.get('osd_map')['osds']:
+        for osd in mgr.get('osd_map')['osds']:
             osd['id'] = osd['osd']
             osds[str(osd['id'])] = osd
         return osds
 
     def get(self, svc_id):
         result = CommandResult('')
-        self.mgr.send_command(result, 'osd', svc_id,
-                              json.dumps({
-                                  'prefix': 'perf histogram dump',
-                              }),
-                              '')
+        mgr.send_command(result, 'osd', svc_id,
+                         json.dumps({
+                             'prefix': 'perf histogram dump',
+                         }),
+                         '')
         r, outb, outs = result.wait()
         if r != 0:
             histogram = None
@@ -83,6 +84,6 @@ class Osd(RESTController):
             histogram = json.loads(outb)
         return {
             'osd_map': self.get_osd_map()[svc_id],
-            'osd_metadata': self.mgr.get_metadata('osd', svc_id),
+            'osd_metadata': mgr.get_metadata('osd', svc_id),
             'histogram': histogram,
         }
index 70b78e4b5592f92e07e67b89be79f3a0bc35e451..418760d25968c79ab4fafbe80bd9b14702f0ded1 100644 (file)
@@ -1,27 +1,28 @@
 # -*- coding: utf-8 -*-
 from __future__ import absolute_import
+
+from .. import mgr
 from ..tools import ApiController, AuthRequired, RESTController
 
 
 class PerfCounter(RESTController):
-    def __init__(self, service_type, mgr):
-        PerfCounter.mgr = mgr
+    def __init__(self, service_type):
         self._service_type = service_type
 
     def _get_rate(self, daemon_type, daemon_name, stat):
-        data = self.mgr.get_counter(daemon_type, daemon_name, stat)[stat]
+        data = mgr.get_counter(daemon_type, daemon_name, stat)[stat]
         if data and len(data) > 1:
             return (data[-1][1] - data[-2][1]) / float(data[-1][0] - data[-2][0])
         return 0
 
     def _get_latest(self, daemon_type, daemon_name, stat):
-        data = self.mgr.get_counter(daemon_type, daemon_name, stat)[stat]
+        data = mgr.get_counter(daemon_type, daemon_name, stat)[stat]
         if data:
             return data[-1][1]
         return 0
 
     def get(self, service_id):
-        schema = self.mgr.get_perf_schema(
+        schema = mgr.get_perf_schema(
             self._service_type, str(service_id)).values()[0]
         counters = []
 
@@ -30,7 +31,7 @@ class PerfCounter(RESTController):
             counter['name'] = str(key)
             counter['description'] = value['description']
             # pylint: disable=W0212
-            if self.mgr._stattype_to_str(value['type']) == 'counter':
+            if mgr._stattype_to_str(value['type']) == 'counter':
                 counter['value'] = self._get_rate(
                     self._service_type, service_id, key)
                 counter['unit'] = '/s'
@@ -53,12 +54,12 @@ class PerfCounter(RESTController):
 @AuthRequired()
 class PerfCounters(RESTController):
     def __init__(self):
-        self.mds = PerfCounter('mds', self.mgr)
-        self.mon = PerfCounter('mon', self.mgr)
-        self.osd = PerfCounter('osd', self.mgr)
-        self.rgw = PerfCounter('rgw', self.mgr)
-        self.rbd_mirror = PerfCounter('rbd-mirror', self.mgr)
+        self.mds = PerfCounter('mds')
+        self.mon = PerfCounter('mon')
+        self.osd = PerfCounter('osd')
+        self.rgw = PerfCounter('rgw')
+        self.rbd_mirror = PerfCounter('rbd-mirror')
 
     def list(self):
-        counters = self.mgr.get_all_perf_counters()
+        counters = mgr.get_all_perf_counters()
         return counters
index dd03d572b16304d709f5febef6019f0a081e8155..87a5d7678289254c9c51efec1302e77459f098f6 100644 (file)
@@ -3,6 +3,7 @@ from __future__ import absolute_import
 
 import rbd
 
+from .. import mgr
 from ..tools import ApiController, AuthRequired, RESTController, ViewCache
 
 
@@ -38,7 +39,7 @@ class Rbd(RESTController):
 
     @ViewCache()
     def _rbd_list(self, pool_name):
-        ioctx = self.mgr.rados.open_ioctx(pool_name)
+        ioctx = mgr.rados.open_ioctx(pool_name)
         self.rbd = rbd.RBD()
         names = self.rbd.list(ioctx)
         result = []
index a9115a3dbf3b943f86317df8578442439af5a3a6..62164ffa479989406f74b665531f61d78f5f415e 100644 (file)
@@ -9,13 +9,13 @@ from functools import partial
 import cherrypy
 import rbd
 
+from .. import logger, mgr
 from ..services.ceph_service import CephService
 from ..tools import ApiController, AuthRequired, BaseController, ViewCache
-from .. import logger
 
 
 @ViewCache()
-def get_daemons_and_pools(mgr):  # pylint: disable=R0915
+def get_daemons_and_pools():  # pylint: disable=R0915
     def get_daemons():
         daemons = []
         for hostname, server in CephService.get_service_map('rbd-mirror').items():
@@ -170,7 +170,7 @@ class RbdMirror(BaseController):
         data = {}
         logger.debug("Constructing IOCtx %s", pool_name)
         try:
-            ioctx = self.mgr.rados.open_ioctx(pool_name)
+            ioctx = mgr.rados.open_ioctx(pool_name)
         except TypeError:
             logger.exception("Failed to open pool %s", pool_name)
             return None
@@ -247,7 +247,7 @@ class RbdMirror(BaseController):
             return value
 
         pool_names = [pool['pool_name'] for pool in CephService.get_pool_list('rbd')]
-        _, data = get_daemons_and_pools(self.mgr)
+        _, data = get_daemons_and_pools()
         if isinstance(data, Exception):
             logger.exception("Failed to get rbd-mirror daemons list")
             raise type(data)(str(data))
index 68fa09893cf002249ab497f163b390fab695ceb8..93631bbaec1df6128e73fb2f0214395143b7b747 100644 (file)
@@ -5,10 +5,10 @@ import json
 
 import cherrypy
 
+from .. import logger, mgr
 from ..controllers.rbd_mirroring import get_daemons_and_pools
 from ..tools import AuthRequired, ApiController, BaseController
 from ..services.ceph_service import CephService
-from .. import logger
 
 
 @ApiController('summary')
@@ -19,11 +19,11 @@ class Summary(BaseController):
         return sorted(pool_names)
 
     def _health_status(self):
-        health_data = self.mgr.get("health")
+        health_data = mgr.get("health")
         return json.loads(health_data["json"])['status']
 
     def _filesystems(self):
-        fsmap = self.mgr.get("fs_map")
+        fsmap = mgr.get("fs_map")
         return [
             {
                 "id": f['id'],
@@ -33,7 +33,7 @@ class Summary(BaseController):
         ]
 
     def _rbd_mirroring(self):
-        _, data = get_daemons_and_pools(self.mgr)
+        _, data = get_daemons_and_pools()
 
         if isinstance(data, Exception):
             logger.exception("Failed to get rbd-mirror daemons and pools")
@@ -64,6 +64,6 @@ class Summary(BaseController):
             'health_status': self._health_status(),
             'filesystems': self._filesystems(),
             'rbd_mirroring': self._rbd_mirroring(),
-            'mgr_id': self.mgr.get_mgr_id(),
-            'have_mon_connection': self.mgr.have_mon_connection()
+            'mgr_id': mgr.get_mgr_id(),
+            'have_mon_connection': mgr.have_mon_connection()
         }
index 31136ef003ec155a5bc8df80e29090e3bb5c7427..f4849b7daa54a0b42c762e3c4635f7ca8ca134b8 100644 (file)
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 from __future__ import absolute_import
 
+from .. import mgr
 from ..services.ceph_service import CephService
 from ..tools import ApiController, AuthRequired, RESTController
 
@@ -52,7 +53,7 @@ class TcmuIscsi(RESTController):
                     pool=metadata['pool_name'],
                     name=metadata['image_name'])
                 perf_key = "{}lock_acquired_time".format(perf_key_prefix)
-                lock_acquired_time = (self.mgr.get_counter(
+                lock_acquired_time = (mgr.get_counter(
                     'tcmu-runner', service_id, perf_key)[perf_key] or
                                       [[0, 0]])[-1][1] / 1000000000
                 if lock_acquired_time > image.get('optimized_since', 0):
@@ -61,9 +62,9 @@ class TcmuIscsi(RESTController):
                     image['stats_history'] = {}
                     for s in ['rd', 'wr', 'rd_bytes', 'wr_bytes']:
                         perf_key = "{}{}".format(perf_key_prefix, s)
-                        image['stats'][s] = self.mgr.get_rate(
+                        image['stats'][s] = mgr.get_rate(
                             'tcmu-runner', service_id, perf_key)
-                        image['stats_history'][s] = self.mgr.get_counter(
+                        image['stats_history'][s] = mgr.get_counter(
                             'tcmu-runner', service_id, perf_key)[perf_key]
             else:
                 daemon['non_optimized_paths'] += 1
index f271f8e7c5f70af3182d941a0fb90d4729b80f41..502e2c5d1002d0245fa8987be60c8e39bc6d758e 100644 (file)
@@ -20,11 +20,10 @@ if 'COVERAGE_ENABLED' in os.environ:
     _cov.start()
 
 # pylint: disable=wrong-import-position
+from . import logger, mgr
 from .controllers.auth import Auth
 from .tools import load_controllers, json_error_page, SessionExpireAtBrowserCloseTool, \
                    NotificationQueue
-from .services import Service
-from . import logger
 
 
 # cherrypy likes to sys.exit on error.  don't let it take us down too!
@@ -72,12 +71,10 @@ class Module(MgrModule):
 
     def __init__(self, *args, **kwargs):
         super(Module, self).__init__(*args, **kwargs)
-        logger.logger = self._logger
+        mgr.init(self)
         self._url_prefix = ''
 
     def configure_cherrypy(self):
-        Service.mgr = self  # injects module instance into Service class
-
         server_addr = self.get_localized_config('server_addr', '::')
         server_port = self.get_localized_config('server_port', '8080')
         if server_addr is None:
@@ -168,7 +165,7 @@ class Module(MgrModule):
         }
 
         def __init__(self, mgrmod):
-            self.ctrls = load_controllers(mgrmod)
+            self.ctrls = load_controllers()
             logger.debug('Loaded controllers: %s', self.ctrls)
 
             first_level_ctrls = [ctrl for ctrl in self.ctrls
index 3019df71baa8778c0fd78061a5680b8dd391e2dc..ca76e16ab290536f776e9c5b7f48148e3353e4db 100644 (file)
@@ -2,13 +2,14 @@
 from __future__ import absolute_import
 
 from . import Service
+from .. import mgr
 
 
 class CephService(Service):
     @classmethod
     def get_service_map(cls, service_name):
         service_map = {}
-        for server in cls.mgr.list_servers():
+        for server in mgr.list_servers():
             for service in server['services']:
                 if service['type'] == service_name:
                     if server['hostname'] not in service_map:
@@ -17,8 +18,8 @@ class CephService(Service):
                             'services': []
                         }
                     inst_id = service['id']
-                    metadata = cls.mgr.get_metadata(service_name, inst_id)
-                    status = cls.mgr.get_daemon_status(service_name, inst_id)
+                    metadata = mgr.get_metadata(service_name, inst_id)
+                    status = mgr.get_daemon_status(service_name, inst_id)
                     service_map[server['hostname']]['services'].append({
                         'id': inst_id,
                         'type': service_name,
@@ -35,13 +36,13 @@ class CephService(Service):
 
     @classmethod
     def get_service(cls, service_name, service_id):
-        for server in cls.mgr.list_servers():
+        for server in mgr.list_servers():
             for service in server['services']:
                 if service['type'] == service_name:
                     inst_id = service['id']
                     if inst_id == service_id:
-                        metadata = cls.mgr.get_metadata(service_name, inst_id)
-                        status = cls.mgr.get_daemon_status(service_name, inst_id)
+                        metadata = mgr.get_metadata(service_name, inst_id)
+                        status = mgr.get_daemon_status(service_name, inst_id)
                         return {
                             'id': inst_id,
                             'type': service_name,
@@ -53,7 +54,7 @@ class CephService(Service):
 
     @classmethod
     def get_pool_list(cls, application=None):
-        osd_map = cls.mgr.get('osd_map')
+        osd_map = mgr.get('osd_map')
         if not application:
             return osd_map['pools']
         return [pool for pool in osd_map['pools']
index 39468dab122ded63d8050dd49e976258598233cc..9add9d95022dff8aa751f034b703160361be6057 100644 (file)
@@ -4,6 +4,7 @@ import mock
 import cherrypy
 from cherrypy.test.helper import CPWebCase
 
+from .. import mgr
 from ..controllers.auth import Auth
 from ..controllers.summary import Summary
 from ..controllers.rbd_mirroring import RbdMirror
@@ -59,26 +60,21 @@ class RbdMirroringControllerTest(ControllerTestCase, CPWebCase):
 
     @classmethod
     def setup_test(cls):
-        mgr_mock = mock.Mock()
-        mgr_mock.list_servers.return_value = mock_list_servers
-        mgr_mock.get_metadata.return_value = mock_get_metadata
-        mgr_mock.get_daemon_status.return_value = mock_get_daemon_status
-        mgr_mock.get.side_effect = lambda key: {
+        mgr.list_servers.return_value = mock_list_servers
+        mgr.get_metadata.return_value = mock_get_metadata
+        mgr.get_daemon_status.return_value = mock_get_daemon_status
+        mgr.get.side_effect = lambda key: {
             'osd_map': mock_osd_map,
             'health': {'json': '{"status": 1}'},
             'fs_map': {'filesystems': []},
 
         }[key]
-        mgr_mock.url_prefix = ''
-        mgr_mock.get_mgr_id.return_value = 0
-        mgr_mock.have_mon_connection.return_value = True
+        mgr.url_prefix = ''
+        mgr.get_mgr_id.return_value = 0
+        mgr.have_mon_connection.return_value = True
 
-        Service.mgr = mgr_mock
-
-        RbdMirror.mgr = mgr_mock
         RbdMirror._cp_config['tools.authenticate.on'] = False  # pylint: disable=protected-access
 
-        Summary.mgr = mgr_mock
         Summary._cp_config['tools.authenticate.on'] = False  # pylint: disable=protected-access
 
         cherrypy.tree.mount(RbdMirror(), '/api/test/rbdmirror')
index f5b292e4fd348c5a2798c54f8151808f5be6208b..d58e972b24812ce56a33b2d02fe64a97960ae8a4 100644 (file)
@@ -2,6 +2,7 @@ from cherrypy.test.helper import CPWebCase
 import cherrypy
 import mock
 
+from .. import mgr
 from ..controllers.auth import Auth
 from ..services import Service
 from ..tools import SessionExpireAtBrowserCloseTool
@@ -50,15 +51,12 @@ class TcmuIscsiControllerTest(ControllerTestCase, CPWebCase):
 
     @classmethod
     def setup_test(cls):
-        mgr_mock = mock.Mock()
-        mgr_mock.list_servers.return_value = mocked_servers
-        mgr_mock.get_metadata.return_value = mocked_metadata
-        mgr_mock.get_daemon_status.return_value = mocked_get_daemon_status
-        mgr_mock.get_counter.return_value = mocked_get_counter
-        mgr_mock.get_rate.return_value = mocked_get_rate
-        mgr_mock.url_prefix = ''
-        Service.mgr = mgr_mock
-        TcmuIscsi.mgr = mgr_mock
+        mgr.list_servers.return_value = mocked_servers
+        mgr.get_metadata.return_value = mocked_metadata
+        mgr.get_daemon_status.return_value = mocked_get_daemon_status
+        mgr.get_counter.return_value = mocked_get_counter
+        mgr.get_rate.return_value = mocked_get_rate
+        mgr.url_prefix = ''
         TcmuIscsi._cp_config['tools.authenticate.on'] = False  # pylint: disable=protected-access
 
         cherrypy.tree.mount(TcmuIscsi(), "/api/test/tcmu")
index 57b1f0f0bcc2cace7bfe47e29041cb831ea9904a..47b60158774ff5e76c618c38ab330e22dc44eebc 100644 (file)
@@ -54,7 +54,7 @@ def AuthRequired(enabled=True):
     return decorate
 
 
-def load_controllers(mgrmodule):
+def load_controllers():
     # setting sys.path properly when not running under the mgr
     dashboard_dir = os.path.dirname(os.path.realpath(__file__))
     mgr_dir = os.path.dirname(dashboard_dir)
@@ -71,7 +71,6 @@ def load_controllers(mgrmodule):
             # Controllers MUST be derived from the class BaseController.
             if isinstance(cls, BaseControllerMeta) and \
                     hasattr(cls, '_cp_controller_'):
-                cls.mgr = mgrmodule
                 controllers.append(cls)
 
     return controllers