import jwt
 
 from . import ApiController, RESTController
-from .. import logger
+from .. import logger, mgr
 from ..exceptions import DashboardException
 from ..services.auth import AuthManager, JwtManager
 from ..services.access_control import UserDoesNotExist
-from ..services.sso import SSO_DB
 
 
 @ApiController('/auth', secure=False)
         token = JwtManager.get_token_from_header()
         JwtManager.blacklist_token(token)
         redirect_url = '#/login'
-        if SSO_DB.protocol == 'saml2':
+        if mgr.SSO_DB.protocol == 'saml2':
             redirect_url = 'auth/saml2/slo'
         return {
             'redirect_url': redirect_url
         }
 
     def _get_login_url(self):
-        if SSO_DB.protocol == 'saml2':
+        if mgr.SSO_DB.protocol == 'saml2':
             return 'auth/saml2/login'
         return '#/login'
 
 
 import cherrypy
 
 from . import ApiController, RESTController, UiApiController
+from .. import mgr
 from ..exceptions import RoleDoesNotExist, DashboardException,\
     RoleIsAssociatedWithUser, RoleAlreadyExists
 from ..security import Scope as SecurityScope, Permission
-from ..services.access_control import ACCESS_CTRL_DB, SYSTEM_ROLES
+from ..services.access_control import SYSTEM_ROLES
 
 
 @ApiController('/role', SecurityScope.USER)
                     role.set_scope_permissions(scope, permissions)
 
     def list(self):
-        roles = dict(ACCESS_CTRL_DB.roles)
+        roles = dict(mgr.ACCESS_CTRL_DB.roles)
         roles.update(SYSTEM_ROLES)
         roles = sorted(roles.values(), key=lambda role: role.name)
         return [Role._role_to_dict(r) for r in roles]
         role = SYSTEM_ROLES.get(name)
         if not role:
             try:
-                role = ACCESS_CTRL_DB.get_role(name)
+                role = mgr.ACCESS_CTRL_DB.get_role(name)
             except RoleDoesNotExist:
                 raise cherrypy.HTTPError(404)
         return Role._role_to_dict(role)
                                      component='role')
         Role._validate_permissions(scopes_permissions)
         try:
-            role = ACCESS_CTRL_DB.create_role(name, description)
+            role = mgr.ACCESS_CTRL_DB.create_role(name, description)
         except RoleAlreadyExists:
             raise DashboardException(msg='Role already exists',
                                      code='role_already_exists',
                                      component='role')
         Role._set_permissions(role, scopes_permissions)
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.save()
         return Role._role_to_dict(role)
 
     def set(self, name, description=None, scopes_permissions=None):
         try:
-            role = ACCESS_CTRL_DB.get_role(name)
+            role = mgr.ACCESS_CTRL_DB.get_role(name)
         except RoleDoesNotExist:
             if name in SYSTEM_ROLES:
                 raise DashboardException(msg='Cannot update system role',
         Role._validate_permissions(scopes_permissions)
         Role._set_permissions(role, scopes_permissions)
         role.description = description
-        ACCESS_CTRL_DB.update_users_with_roles(role)
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.update_users_with_roles(role)
+        mgr.ACCESS_CTRL_DB.save()
         return Role._role_to_dict(role)
 
     def delete(self, name):
         try:
-            ACCESS_CTRL_DB.delete_role(name)
+            mgr.ACCESS_CTRL_DB.delete_role(name)
         except RoleDoesNotExist:
             if name in SYSTEM_ROLES:
                 raise DashboardException(msg='Cannot delete system role',
             raise DashboardException(msg='Role is associated with user',
                                      code='role_is_associated_with_user',
                                      component='role')
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.save()
 
 
 @UiApiController('/scope', SecurityScope.USER)
 
 from .. import mgr, logger
 from ..exceptions import UserDoesNotExist
 from ..services.auth import JwtManager
-from ..services.access_control import ACCESS_CTRL_DB
-from ..services.sso import SSO_DB
 from ..tools import prepare_url_prefix
 from . import Controller, Endpoint, BaseController
 
             raise cherrypy.HTTPError(400,
                                      'Required library not found: `{}`'.format(python_saml_name))
         try:
-            OneLogin_Saml2_Settings(SSO_DB.saml2.onelogin_settings)
+            OneLogin_Saml2_Settings(mgr.SSO_DB.saml2.onelogin_settings)
         except OneLogin_Saml2_Error:
             raise cherrypy.HTTPError(400, 'Single Sign-On is not configured.')
 
     def auth_response(self, **kwargs):
         Saml2._check_python_saml()
         req = Saml2._build_req(self._request, kwargs)
-        auth = OneLogin_Saml2_Auth(req, SSO_DB.saml2.onelogin_settings)
+        auth = OneLogin_Saml2_Auth(req, mgr.SSO_DB.saml2.onelogin_settings)
         auth.process_response()
         errors = auth.get_errors()
 
         if auth.is_authenticated():
             JwtManager.reset_user()
-            username_attribute = auth.get_attribute(SSO_DB.saml2.get_username_attribute())
+            username_attribute = auth.get_attribute(mgr.SSO_DB.saml2.get_username_attribute())
             if username_attribute is None:
                 raise cherrypy.HTTPError(400,
                                          'SSO error - `{}` not found in auth attributes. '
                                          'Received attributes: {}'
                                          .format(
-                                             SSO_DB.saml2.get_username_attribute(),
+                                             mgr.SSO_DB.saml2.get_username_attribute(),
                                              auth.get_attributes()))
             username = username_attribute[0]
             try:
-                ACCESS_CTRL_DB.get_user(username)
+                mgr.ACCESS_CTRL_DB.get_user(username)
             except UserDoesNotExist:
                 raise cherrypy.HTTPError(400,
                                          'SSO error - Username `{}` does not exist.'
     @Endpoint(xml=True)
     def metadata(self):
         Saml2._check_python_saml()
-        saml_settings = OneLogin_Saml2_Settings(SSO_DB.saml2.onelogin_settings)
+        saml_settings = OneLogin_Saml2_Settings(mgr.SSO_DB.saml2.onelogin_settings)
         return saml_settings.get_sp_metadata()
 
     @Endpoint(json_response=False)
     def login(self):
         Saml2._check_python_saml()
         req = Saml2._build_req(self._request, {})
-        auth = OneLogin_Saml2_Auth(req, SSO_DB.saml2.onelogin_settings)
+        auth = OneLogin_Saml2_Auth(req, mgr.SSO_DB.saml2.onelogin_settings)
         raise cherrypy.HTTPRedirect(auth.login())
 
     @Endpoint(json_response=False)
     def slo(self):
         Saml2._check_python_saml()
         req = Saml2._build_req(self._request, {})
-        auth = OneLogin_Saml2_Auth(req, SSO_DB.saml2.onelogin_settings)
+        auth = OneLogin_Saml2_Auth(req, mgr.SSO_DB.saml2.onelogin_settings)
         raise cherrypy.HTTPRedirect(auth.logout())
 
     @Endpoint(json_response=False)
 
 import cherrypy
 
 from . import ApiController, RESTController
+from .. import mgr
 from ..exceptions import DashboardException, UserAlreadyExists, \
     UserDoesNotExist
 from ..security import Scope
-from ..services.access_control import ACCESS_CTRL_DB, SYSTEM_ROLES
+from ..services.access_control import SYSTEM_ROLES
 from ..services.auth import JwtManager
 
 
 
     @staticmethod
     def _get_user_roles(roles):
-        all_roles = dict(ACCESS_CTRL_DB.roles)
+        all_roles = dict(mgr.ACCESS_CTRL_DB.roles)
         all_roles.update(SYSTEM_ROLES)
         try:
             return [all_roles[rolename] for rolename in roles]
                                      component='user')
 
     def list(self):
-        users = ACCESS_CTRL_DB.users
+        users = mgr.ACCESS_CTRL_DB.users
         result = [User._user_to_dict(u) for _, u in users.items()]
         return result
 
     def get(self, username):
         try:
-            user = ACCESS_CTRL_DB.get_user(username)
+            user = mgr.ACCESS_CTRL_DB.get_user(username)
         except UserDoesNotExist:
             raise cherrypy.HTTPError(404)
         return User._user_to_dict(user)
         if roles:
             user_roles = User._get_user_roles(roles)
         try:
-            user = ACCESS_CTRL_DB.create_user(username, password, name, email)
+            user = mgr.ACCESS_CTRL_DB.create_user(username, password, name, email)
         except UserAlreadyExists:
             raise DashboardException(msg='Username already exists',
                                      code='username_already_exists',
                                      component='user')
         if user_roles:
             user.set_roles(user_roles)
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.save()
         return User._user_to_dict(user)
 
     def delete(self, username):
                                      code='cannot_delete_current_user',
                                      component='user')
         try:
-            ACCESS_CTRL_DB.delete_user(username)
+            mgr.ACCESS_CTRL_DB.delete_user(username)
         except UserDoesNotExist:
             raise cherrypy.HTTPError(404)
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.save()
 
     def set(self, username, password=None, name=None, email=None, roles=None):
         try:
-            user = ACCESS_CTRL_DB.get_user(username)
+            user = mgr.ACCESS_CTRL_DB.get_user(username)
         except UserDoesNotExist:
             raise cherrypy.HTTPError(404)
         user_roles = []
         user.name = name
         user.email = email
         user.set_roles(user_roles)
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.save()
         return User._user_to_dict(user)
 
         self._stopping = threading.Event()
         self.shutdown_event = threading.Event()
 
+        self.ACCESS_CTRL_DB = None
+        self.SSO_DB = None
+
     @classmethod
     def can_run(cls):
         if cherrypy is None:
 
         return cls(db['version'], users, roles)
 
 
-ACCESS_CTRL_DB = None
-
-
 def load_access_control_db():
-    # pylint: disable=W0603
-    global ACCESS_CTRL_DB
-    ACCESS_CTRL_DB = AccessControlDB.load()
+    mgr.ACCESS_CTRL_DB = AccessControlDB.load()
 
 
 # CLI dashboard access control scope commands
                  'Set the login credentials')
 def set_login_credentials_cmd(_, username, password):
     try:
-        user = ACCESS_CTRL_DB.get_user(username)
+        user = mgr.ACCESS_CTRL_DB.get_user(username)
         user.set_password(password)
     except UserDoesNotExist:
-        user = ACCESS_CTRL_DB.create_user(username, password, None, None)
+        user = mgr.ACCESS_CTRL_DB.create_user(username, password, None, None)
         user.set_roles([ADMIN_ROLE])
 
-    ACCESS_CTRL_DB.save()
+    mgr.ACCESS_CTRL_DB.save()
 
     return 0, '''\
 ******************************************************************
                 'Show role info')
 def ac_role_show_cmd(_, rolename=None):
     if not rolename:
-        roles = dict(ACCESS_CTRL_DB.roles)
+        roles = dict(mgr.ACCESS_CTRL_DB.roles)
         roles.update(SYSTEM_ROLES)
         roles_list = [name for name, _ in roles.items()]
         return 0, json.dumps(roles_list), ''
     try:
-        role = ACCESS_CTRL_DB.get_role(rolename)
+        role = mgr.ACCESS_CTRL_DB.get_role(rolename)
     except RoleDoesNotExist as ex:
         if rolename not in SYSTEM_ROLES:
             return -errno.ENOENT, '', str(ex)
                  'Create a new access control role')
 def ac_role_create_cmd(_, rolename, description=None):
     try:
-        role = ACCESS_CTRL_DB.create_role(rolename, description)
-        ACCESS_CTRL_DB.save()
+        role = mgr.ACCESS_CTRL_DB.create_role(rolename, description)
+        mgr.ACCESS_CTRL_DB.save()
         return 0, json.dumps(role.to_dict()), ''
     except RoleAlreadyExists as ex:
         return -errno.EEXIST, '', str(ex)
                  'Delete an access control role')
 def ac_role_delete_cmd(_, rolename):
     try:
-        ACCESS_CTRL_DB.delete_role(rolename)
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.delete_role(rolename)
+        mgr.ACCESS_CTRL_DB.save()
         return 0, "Role '{}' deleted".format(rolename), ""
     except RoleDoesNotExist as ex:
         if rolename in SYSTEM_ROLES:
                  'Add the scope permissions for a role')
 def ac_role_add_scope_perms_cmd(_, rolename, scopename, permissions):
     try:
-        role = ACCESS_CTRL_DB.get_role(rolename)
+        role = mgr.ACCESS_CTRL_DB.get_role(rolename)
         perms_array = [perm.strip() for perm in permissions]
         role.set_scope_permissions(scopename, perms_array)
-        ACCESS_CTRL_DB.update_users_with_roles(role)
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.update_users_with_roles(role)
+        mgr.ACCESS_CTRL_DB.save()
         return 0, json.dumps(role.to_dict()), ''
     except RoleDoesNotExist as ex:
         if rolename in SYSTEM_ROLES:
                  'Delete the scope permissions for a role')
 def ac_role_del_scope_perms_cmd(_, rolename, scopename):
     try:
-        role = ACCESS_CTRL_DB.get_role(rolename)
+        role = mgr.ACCESS_CTRL_DB.get_role(rolename)
         role.del_scope_permissions(scopename)
-        ACCESS_CTRL_DB.update_users_with_roles(role)
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.update_users_with_roles(role)
+        mgr.ACCESS_CTRL_DB.save()
         return 0, json.dumps(role.to_dict()), ''
     except RoleDoesNotExist as ex:
         if rolename in SYSTEM_ROLES:
                 'Show user info')
 def ac_user_show_cmd(_, username=None):
     if not username:
-        users = ACCESS_CTRL_DB.users
+        users = mgr.ACCESS_CTRL_DB.users
         users_list = [name for name, _ in users.items()]
         return 0, json.dumps(users_list), ''
     try:
-        user = ACCESS_CTRL_DB.get_user(username)
+        user = mgr.ACCESS_CTRL_DB.get_user(username)
         return 0, json.dumps(user.to_dict()), ''
     except UserDoesNotExist as ex:
         return -errno.ENOENT, '', str(ex)
 def ac_user_create_cmd(_, username, password=None, rolename=None, name=None,
                        email=None):
     try:
-        role = ACCESS_CTRL_DB.get_role(rolename) if rolename else None
+        role = mgr.ACCESS_CTRL_DB.get_role(rolename) if rolename else None
     except RoleDoesNotExist as ex:
         if rolename not in SYSTEM_ROLES:
             return -errno.ENOENT, '', str(ex)
         role = SYSTEM_ROLES[rolename]
 
     try:
-        user = ACCESS_CTRL_DB.create_user(username, password, name, email)
+        user = mgr.ACCESS_CTRL_DB.create_user(username, password, name, email)
     except UserAlreadyExists as ex:
         return -errno.EEXIST, '', str(ex)
 
     if role:
         user.set_roles([role])
-    ACCESS_CTRL_DB.save()
+    mgr.ACCESS_CTRL_DB.save()
     return 0, json.dumps(user.to_dict()), ''
 
 
                  'Delete user')
 def ac_user_delete_cmd(_, username):
     try:
-        ACCESS_CTRL_DB.delete_user(username)
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.delete_user(username)
+        mgr.ACCESS_CTRL_DB.save()
         return 0, "User '{}' deleted".format(username), ""
     except UserDoesNotExist as ex:
         return -errno.ENOENT, '', str(ex)
     roles = []
     for rolename in rolesname:
         try:
-            roles.append(ACCESS_CTRL_DB.get_role(rolename))
+            roles.append(mgr.ACCESS_CTRL_DB.get_role(rolename))
         except RoleDoesNotExist as ex:
             if rolename not in SYSTEM_ROLES:
                 return -errno.ENOENT, '', str(ex)
             roles.append(SYSTEM_ROLES[rolename])
     try:
-        user = ACCESS_CTRL_DB.get_user(username)
+        user = mgr.ACCESS_CTRL_DB.get_user(username)
         user.set_roles(roles)
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.save()
         return 0, json.dumps(user.to_dict()), ''
     except UserDoesNotExist as ex:
         return -errno.ENOENT, '', str(ex)
     roles = []
     for rolename in rolesname:
         try:
-            roles.append(ACCESS_CTRL_DB.get_role(rolename))
+            roles.append(mgr.ACCESS_CTRL_DB.get_role(rolename))
         except RoleDoesNotExist as ex:
             if rolename not in SYSTEM_ROLES:
                 return -errno.ENOENT, '', str(ex)
             roles.append(SYSTEM_ROLES[rolename])
     try:
-        user = ACCESS_CTRL_DB.get_user(username)
+        user = mgr.ACCESS_CTRL_DB.get_user(username)
         user.add_roles(roles)
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.save()
         return 0, json.dumps(user.to_dict()), ''
     except UserDoesNotExist as ex:
         return -errno.ENOENT, '', str(ex)
     roles = []
     for rolename in rolesname:
         try:
-            roles.append(ACCESS_CTRL_DB.get_role(rolename))
+            roles.append(mgr.ACCESS_CTRL_DB.get_role(rolename))
         except RoleDoesNotExist as ex:
             if rolename not in SYSTEM_ROLES:
                 return -errno.ENOENT, '', str(ex)
             roles.append(SYSTEM_ROLES[rolename])
     try:
-        user = ACCESS_CTRL_DB.get_user(username)
+        user = mgr.ACCESS_CTRL_DB.get_user(username)
         user.del_roles(roles)
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.save()
         return 0, json.dumps(user.to_dict()), ''
     except UserDoesNotExist as ex:
         return -errno.ENOENT, '', str(ex)
                  'Set user password')
 def ac_user_set_password(_, username, password):
     try:
-        user = ACCESS_CTRL_DB.get_user(username)
+        user = mgr.ACCESS_CTRL_DB.get_user(username)
         user.set_password(password)
 
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.save()
         return 0, json.dumps(user.to_dict()), ''
     except UserDoesNotExist as ex:
         return -errno.ENOENT, '', str(ex)
                  'Set user info')
 def ac_user_set_info(_, username, name, email):
     try:
-        user = ACCESS_CTRL_DB.get_user(username)
+        user = mgr.ACCESS_CTRL_DB.get_user(username)
         if name:
             user.name = name
         if email:
             user.email = email
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.save()
         return 0, json.dumps(user.to_dict()), ''
     except UserDoesNotExist as ex:
         return -errno.ENOENT, '', str(ex)
         load_access_control_db()
 
     def get_user(self, username):
-        return ACCESS_CTRL_DB.get_user(username)
+        return mgr.ACCESS_CTRL_DB.get_user(username)
 
     def authenticate(self, username, password):
         try:
-            user = ACCESS_CTRL_DB.get_user(username)
+            user = mgr.ACCESS_CTRL_DB.get_user(username)
             if user.password:
                 pass_hash = password_hash(password, user.password)
                 if pass_hash == user.password:
         return None
 
     def authorize(self, username, scope, permissions):
-        user = ACCESS_CTRL_DB.get_user(username)
+        user = mgr.ACCESS_CTRL_DB.get_user(username)
         return user.authorize(scope, permissions)
 
         return cls(db['version'], db.get('protocol'), Saml2.from_dict(db.get('saml2')))
 
 
-SSO_DB = None
-
-
 def load_sso_db():
-    # pylint: disable=W0603
-    global SSO_DB
-    SSO_DB = SsoDB.load()
+    mgr.SSO_DB = SsoDB.load()
 
 
 SSO_COMMANDS = [
 
     if cmd['prefix'] == 'dashboard sso enable saml2':
         try:
-            OneLogin_Saml2_Settings(SSO_DB.saml2.onelogin_settings)
+            OneLogin_Saml2_Settings(mgr.SSO_DB.saml2.onelogin_settings)
         except OneLogin_Saml2_Error:
             return -errno.EPERM, '', 'Single Sign-On is not configured: ' \
                           'use `ceph dashboard sso setup saml2`'
-        SSO_DB.protocol = 'saml2'
-        SSO_DB.save()
+        mgr.SSO_DB.protocol = 'saml2'
+        mgr.SSO_DB.save()
         return 0, 'SSO is "enabled" with "SAML2" protocol.', ''
 
     if cmd['prefix'] == 'dashboard sso disable':
-        SSO_DB.protocol = ''
-        SSO_DB.save()
+        mgr.SSO_DB.protocol = ''
+        mgr.SSO_DB.save()
         return 0, 'SSO is "disabled".', ''
 
     if cmd['prefix'] == 'dashboard sso status':
-        if SSO_DB.protocol == 'saml2':
+        if mgr.SSO_DB.protocol == 'saml2':
             return 0, 'SSO is "enabled" with "SAML2" protocol.', ''
 
         return 0, 'SSO is "disabled".', ''
 
     if cmd['prefix'] == 'dashboard sso show saml2':
-        return 0, json.dumps(SSO_DB.saml2.to_dict()), ''
+        return 0, json.dumps(mgr.SSO_DB.saml2.to_dict()), ''
 
     if cmd['prefix'] == 'dashboard sso setup saml2':
         ceph_dashboard_base_url = cmd['ceph_dashboard_base_url']
             }
         }
         settings = OneLogin_Saml2_IdPMetadataParser.merge_settings(settings, idp_settings)
-        SSO_DB.saml2.onelogin_settings = settings
-        SSO_DB.protocol = 'saml2'
-        SSO_DB.save()
-        return 0, json.dumps(SSO_DB.saml2.onelogin_settings), ''
+        mgr.SSO_DB.saml2.onelogin_settings = settings
+        mgr.SSO_DB.protocol = 'saml2'
+        mgr.SSO_DB.save()
+        return 0, json.dumps(mgr.SSO_DB.saml2.onelogin_settings), ''
 
     return -errno.ENOSYS, '', ''
 
         # kludge below
         mgr.set_store.side_effect = cls.mock_set_module_option
         mgr.get_store.side_effect = cls.mock_get_module_option
+        mgr.ACCESS_CONTROL_DB = None
 
     def setUp(self):
         self.CONFIG_KEY_DICT.clear()
     # not be needed unless we're testing very specific behaviors.
     #
     def setup_and_load_persistent_db(self):
-        from ..services.access_control import ACCESS_CTRL_DB
-        ACCESS_CTRL_DB.save()
+        mgr.ACCESS_CTRL_DB.save()
         self.load_persistent_db()
 
     def validate_persistent_role(self, rolename, scopes_permissions,