]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/mgr/restful: move global variable into context.py
authorKefu Chai <kchai@redhat.com>
Fri, 9 Feb 2018 14:59:21 +0000 (22:59 +0800)
committerKefu Chai <kchai@redhat.com>
Sun, 11 Feb 2018 06:12:16 +0000 (14:12 +0800)
otherwise we need to tackle with the circular import. it's not fatal, if
we can "import foo" in py2 and "from . import foo" in py3, respectively.
but we cannot unify them using "from . import foo", because the circular
reference issue. and conditionalize the import statement is ugly. so, i
think we'd better break the loop. so i am moving the "instance" variable
into its own file.

Signed-off-by: Kefu Chai <kchai@redhat.com>
12 files changed:
src/pybind/mgr/restful/api/config.py
src/pybind/mgr/restful/api/crush.py
src/pybind/mgr/restful/api/doc.py
src/pybind/mgr/restful/api/mon.py
src/pybind/mgr/restful/api/osd.py
src/pybind/mgr/restful/api/pool.py
src/pybind/mgr/restful/api/request.py
src/pybind/mgr/restful/api/server.py
src/pybind/mgr/restful/context.py [new file with mode: 0644]
src/pybind/mgr/restful/decorators.py
src/pybind/mgr/restful/hooks.py
src/pybind/mgr/restful/module.py

index 51fabfad4d68ed0f5cc61a902aa494095208870d..4176c003c4aec1d1816dba677b85af880f3ef464 100644 (file)
@@ -1,7 +1,7 @@
 from pecan import expose, request
 from pecan.rest import RestController
 
-from restful import common, module
+from restful import common, context
 from restful.decorators import auth
 
 
@@ -12,7 +12,7 @@ class ConfigOsd(RestController):
         """
         Show OSD configuration options
         """
-        flags = module.instance.get("osd_map")['flags']
+        flags = context.instance.get("osd_map")['flags']
 
         # pause is a valid osd config command that sets pauserd,pausewr
         flags = flags.replace('pauserd,pausewr', 'pause')
@@ -33,7 +33,7 @@ class ConfigOsd(RestController):
         valid_flags = set(args.keys()) & set(common.OSD_FLAGS)
         invalid_flags = list(set(args.keys()) - valid_flags)
         if invalid_flags:
-            module.instance.log.warn("%s not valid to set/unset" % invalid_flags)
+            context.instance.log.warn("%s not valid to set/unset" % invalid_flags)
 
         for flag in list(valid_flags):
             if args[flag]:
@@ -46,7 +46,7 @@ class ConfigOsd(RestController):
                 'key': flag,
             })
 
-        return module.instance.submit_request([commands], **kwargs)
+        return context.instance.submit_request([commands], **kwargs)
 
 
 
@@ -61,7 +61,7 @@ class ConfigClusterKey(RestController):
         """
         Show specific configuration option
         """
-        return module.instance.get("config").get(self.key, None)
+        return context.instance.get("config").get(self.key, None)
 
 
 
@@ -72,7 +72,7 @@ class ConfigCluster(RestController):
         """
         Show all cluster configuration options
         """
-        return module.instance.get("config")
+        return context.instance.get("config")
 
 
     @expose()
index 11a04264da23a5e8e65319cba9e328591e0635a7..ee8589df0a41ae4abcdf307731b64481361c14e1 100644 (file)
@@ -1,7 +1,7 @@
 from pecan import expose
 from pecan.rest import RestController
 
-from restful import common, module
+from restful import common, context
 from collections import defaultdict
 
 from restful.decorators import auth
@@ -14,8 +14,8 @@ class CrushRule(RestController):
         """
         Show crush rules
         """
-        rules = module.instance.get('osd_map_crush')['rules']
-        nodes = module.instance.get('osd_map_tree')['nodes']
+        rules = context.instance.get('osd_map_crush')['rules']
+        nodes = context.instance.get('osd_map_tree')['nodes']
 
         for rule in rules:
             rule['osd_count'] = len(common.crush_rule_osds(nodes, rule))
index 96e4d6a3379b5a7062746d3b2f0c4e081f94a72f..f1038c21b1642fcdacfe3d5aa42a8daed9119e5b 100644 (file)
@@ -1,7 +1,7 @@
 from pecan import expose
 from pecan.rest import RestController
 
-from restful import module
+from restful import context
 
 import restful
 
@@ -12,4 +12,4 @@ class Doc(RestController):
         """
         Show documentation information
         """
-        return module.instance.get_doc_api(restful.api.Root)
+        return context.instance.get_doc_api(restful.api.Root)
index 5b19aaefb299dd6a2bc02bb1a6d8740e126ba3ef..807d6df3bf790e9a5978fe0da266f815d4e9b74a 100644 (file)
@@ -1,7 +1,7 @@
 from pecan import expose, response
 from pecan.rest import RestController
 
-from restful import module
+from restful import context
 from restful.decorators import auth
 
 
@@ -18,7 +18,7 @@ class MonName(RestController):
         """
         mon = filter(
             lambda x: x['name'] == self.name,
-            module.instance.get_mons()
+            context.instance.get_mons()
         )
 
         if len(mon) != 1:
@@ -36,7 +36,7 @@ class Mon(RestController):
         """
         Show the information for all the monitors
         """
-        return module.instance.get_mons()
+        return context.instance.get_mons()
 
 
     @expose()
index b42f33941f1c312b93f9e389834f257b163b1f1d..99f9ed4c8e72e52476cbc72b10ea11c9ea1e2956 100644 (file)
@@ -1,7 +1,7 @@
 from pecan import expose, request, response
 from pecan.rest import RestController
 
-from restful import common, module
+from restful import common, context
 from restful.decorators import auth
 
 
@@ -16,7 +16,7 @@ class OsdIdCommand(RestController):
         """
         Show implemented commands for the OSD id
         """
-        osd = module.instance.get_osd_by_id(self.osd_id)
+        osd = context.instance.get_osd_by_id(self.osd_id)
 
         if not osd:
             response.status = 500
@@ -36,7 +36,7 @@ class OsdIdCommand(RestController):
         """
         command = request.json.get('command', None)
 
-        osd = module.instance.get_osd_by_id(self.osd_id)
+        osd = context.instance.get_osd_by_id(self.osd_id)
 
         if not osd:
             response.status = 500
@@ -46,7 +46,7 @@ class OsdIdCommand(RestController):
             response.status = 500
             return {'message': 'Command "%s" not available' % command}
 
-        return module.instance.submit_request([[{
+        return context.instance.submit_request([[{
             'prefix': 'osd ' + command,
             'who': str(self.osd_id)
         }]], **kwargs)
@@ -65,7 +65,7 @@ class OsdId(RestController):
         """
         Show the information for the OSD id
         """
-        osd = module.instance.get_osds(ids=[str(self.osd_id)])
+        osd = context.instance.get_osds(ids=[str(self.osd_id)])
         if len(osd) != 1:
             response.status = 500
             return {'message': 'Failed to identify the OSD id "%d"' % self.osd_id}
@@ -112,7 +112,7 @@ class OsdId(RestController):
                 'weight': args['reweight']
             })
 
-        return module.instance.submit_request([commands], **kwargs)
+        return context.instance.submit_request([commands], **kwargs)
 
 
 
@@ -127,7 +127,7 @@ class Osd(RestController):
         # TODO Filter by ids
         pool_id = kwargs.get('pool', None)
 
-        return module.instance.get_osds(pool_id)
+        return context.instance.get_osds(pool_id)
 
 
     @expose()
index b9d2a8bae2007efdfde32ccf1680cb0a77d27df3..abf3e98133a69a2b5631509cc0790efe78be1c03 100644 (file)
@@ -1,7 +1,7 @@
 from pecan import expose, request, response
 from pecan.rest import RestController
 
-from restful import common, module
+from restful import common, context
 from restful.decorators import auth
 
 
@@ -16,7 +16,7 @@ class PoolId(RestController):
         """
         Show the information for the pool id
         """
-        pool = module.instance.get_pool_by_id(self.pool_id)
+        pool = context.instance.get_pool_by_id(self.pool_id)
 
         if not pool:
             response.status = 500
@@ -41,7 +41,7 @@ class PoolId(RestController):
             return {'message': 'Bad request: malformed JSON or wrong Content-Type'}
 
         # Get the pool info for its name
-        pool = module.instance.get_pool_by_id(self.pool_id)
+        pool = context.instance.get_pool_by_id(self.pool_id)
         if not pool:
             response.status = 500
             return {'message': 'Failed to identify the pool id "%d"' % self.pool_id}
@@ -53,7 +53,7 @@ class PoolId(RestController):
             return {'message': 'Invalid arguments found: "%s"' % str(invalid)}
 
         # Schedule the update request
-        return module.instance.submit_request(common.pool_update_commands(pool['pool_name'], args), **kwargs)
+        return context.instance.submit_request(common.pool_update_commands(pool['pool_name'], args), **kwargs)
 
 
     @expose(template='json')
@@ -62,13 +62,13 @@ class PoolId(RestController):
         """
         Remove the pool data for the pool id
         """
-        pool = module.instance.get_pool_by_id(self.pool_id)
+        pool = context.instance.get_pool_by_id(self.pool_id)
 
         if not pool:
             response.status = 500
             return {'message': 'Failed to identify the pool id "%d"' % self.pool_id}
 
-        return module.instance.submit_request([[{
+        return context.instance.submit_request([[{
             'prefix': 'osd pool delete',
             'pool': pool['pool_name'],
             'pool2': pool['pool_name'],
@@ -84,7 +84,7 @@ class Pool(RestController):
         """
         Show the information for all the pools
         """
-        pools = module.instance.get('osd_map')['pools']
+        pools = context.instance.get('osd_map')['pools']
 
         # pgp_num is called pg_placement_num, deal with that
         for pool in pools:
@@ -128,7 +128,7 @@ class Pool(RestController):
             return {'message': 'Invalid arguments found: "%s"' % str(invalid)}
 
         # Schedule the creation and update requests
-        return module.instance.submit_request(
+        return context.instance.submit_request(
             [[create_command]] +
             common.pool_update_commands(pool_name, args),
             **kwargs
index b22b80bff8a45104cd2a32feb25f6f9f2d58246c..82c7fe16a75da0ef15b9bd95cc4dd677e5a0191a 100644 (file)
@@ -1,7 +1,7 @@
 from pecan import expose, request, response
 from pecan.rest import RestController
 
-from restful import module
+from restful import context
 from restful.decorators import auth, lock, paginate
 
 
@@ -18,7 +18,7 @@ class RequestId(RestController):
         """
         request = filter(
             lambda x: x.id == self.request_id,
-            module.instance.requests
+            context.instance.requests
         )
 
         if len(request) != 1:
@@ -36,9 +36,9 @@ class RequestId(RestController):
         """
         Remove the request id from the database
         """
-        for index in range(len(module.instance.requests)):
-            if module.instance.requests[index].id == self.request_id:
-                return module.instance.requests.pop(index)
+        for index in range(len(context.instance.requests)):
+            if context.instance.requests[index].id == self.request_id:
+                return context.instance.requests.pop(index)
 
         # Failed to find the job to cancel
         response.status = 500
@@ -54,7 +54,7 @@ class Request(RestController):
         """
         List all the available requests
         """
-        return module.instance.requests
+        return context.instance.requests
 
 
     @expose(template='json')
@@ -64,17 +64,17 @@ class Request(RestController):
         """
         Remove all the finished requests
         """
-        num_requests = len(module.instance.requests)
+        num_requests = len(context.instance.requests)
 
-        module.instance.requests = filter(
+        context.instance.requests = filter(
             lambda x: not x.is_finished(),
-            module.instance.requests
+            context.instance.requests
         )
 
         # Return the job statistics
         return {
-            'cleaned': num_requests - len(module.instance.requests),
-            'remaining': len(module.instance.requests),
+            'cleaned': num_requests - len(context.instance.requests),
+            'remaining': len(context.instance.requests),
         }
 
 
@@ -84,7 +84,7 @@ class Request(RestController):
         """
         Pass through method to create any request
         """
-        return module.instance.submit_request([[request.json]], **kwargs)
+        return context.instance.submit_request([[request.json]], **kwargs)
 
 
     @expose()
index 9e6a20784ec0b7d0dbaa23086e170de1f719a5ab..8ce63493754dce2983ea7fbff4ddf4a40c825fa5 100644 (file)
@@ -1,7 +1,7 @@
 from pecan import expose
 from pecan.rest import RestController
 
-from restful import module
+from restful import context
 from restful.decorators import auth
 
 
@@ -16,7 +16,7 @@ class ServerFqdn(RestController):
         """
         Show the information for the server fqdn
         """
-        return module.instance.get_server(self.fqdn)
+        return context.instance.get_server(self.fqdn)
 
 
 
@@ -27,7 +27,7 @@ class Server(RestController):
         """
         Show the information for all the servers
         """
-        return module.instance.list_servers()
+        return context.instance.list_servers()
 
 
     @expose()
diff --git a/src/pybind/mgr/restful/context.py b/src/pybind/mgr/restful/context.py
new file mode 100644 (file)
index 0000000..a05ea85
--- /dev/null
@@ -0,0 +1,2 @@
+# Global instance to share
+instance = None
index e5d7d62ae87ce779117ddcc6cef4b75334b53544..47f82f5a68d41edf1901a73615d369c1195f42f8 100644 (file)
@@ -4,7 +4,7 @@ from functools import wraps
 
 import traceback
 
-import module
+from . import context
 
 
 # Handle authorization
@@ -19,13 +19,13 @@ def auth(f):
         username, password = b64decode(request.authorization[1]).split(':')
 
         # Check that the username exists
-        if username not in module.instance.keys:
+        if username not in context.instance.keys:
             response.status = 401
             response.headers['WWW-Authenticate'] = 'Basic realm="Login Required"'
             return {'message': 'auth: No such user'}
 
         # Check the password
-        if module.instance.keys[username] != password:
+        if context.instance.keys[username] != password:
             response.status = 401
             response.headers['WWW-Authenticate'] = 'Basic realm="Login Required"'
             return {'message': 'auth: Incorrect password'}
@@ -38,7 +38,7 @@ def auth(f):
 def lock(f):
     @wraps(f)
     def decorated(*args, **kwargs):
-        with module.instance.requests_lock:
+        with context.instance.requests_lock:
             return f(*args, **kwargs)
     return decorated
 
index 8a62c84fc3a5304ca4cf506a5d2cf7d5946a55d0..7623a71538f2c50d90e7f15344240b261b2951b0 100644 (file)
@@ -2,8 +2,8 @@ from pecan.hooks import PecanHook
 
 import traceback
 
-from . import module
+from . import context
 
 class ErrorHook(PecanHook):
     def on_error(self, stat, exc):
-        module.instance.log.error(str(traceback.format_exc()))
+        context.instance.log.error(str(traceback.format_exc()))
index b67474d79114e2b8fc10d4553e94436945cc0d8b..72af5b8464cc7247f491ff875a3ecd60534f30e6 100644 (file)
@@ -13,6 +13,7 @@ import traceback
 import socket
 
 from . import common
+from . import context
 
 from uuid import uuid4
 from pecan import jsonify, make_app
@@ -29,9 +30,6 @@ try:
 except:
     iteritems = dict.items
 
-# Global instance to share
-instance = None
-
 
 class CannotServe(Exception):
     pass
@@ -93,7 +91,7 @@ class CommandsRequest(object):
             results.append(result)
 
             # Run the command
-            instance.send_command(result, 'mon', '', json.dumps(commands[index]), tag)
+            context.instance.send_command(result, 'mon', '', json.dumps(commands[index]), tag)
 
         return results
 
@@ -234,8 +232,7 @@ class Module(MgrModule):
 
     def __init__(self, *args, **kwargs):
         super(Module, self).__init__(*args, **kwargs)
-        global instance
-        instance = self
+        context.instance = self
 
         self.requests = []
         self.requests_lock = threading.RLock()