Send Moon from a Keystone filter to a Keystone application. 77/4677/1
authorasteroide <thomas.duval@orange.com>
Wed, 16 Dec 2015 15:13:33 +0000 (16:13 +0100)
committerasteroide <thomas.duval@orange.com>
Wed, 16 Dec 2015 15:13:33 +0000 (16:13 +0100)
Change-Id: Ib74edc222e6d0705c7f7c6c602401fca75626c23

25 files changed:
keystone-moon/keystone/common/config.py
keystone-moon/keystone/contrib/moon/core.py
keystone-moon/keystone/contrib/moon/routers.py
keystone-moon/keystone/contrib/moon/service.py [new file with mode: 0644]
keystone-moon/keystone/contrib/moon/wsgi.py [new file with mode: 0644]
keystone-moon/setup.cfg
moonclient/moonclient/action_assignments.py
moonclient/moonclient/action_categories.py
moonclient/moonclient/action_scopes.py
moonclient/moonclient/actions.py
moonclient/moonclient/configuration.py
moonclient/moonclient/intraextension.py
moonclient/moonclient/logs.py
moonclient/moonclient/metarules.py
moonclient/moonclient/object_assignments.py
moonclient/moonclient/object_categories.py
moonclient/moonclient/object_scopes.py
moonclient/moonclient/objects.py
moonclient/moonclient/rules.py
moonclient/moonclient/shell.py
moonclient/moonclient/subject_assignments.py
moonclient/moonclient/subject_categories.py
moonclient/moonclient/subject_scopes.py
moonclient/moonclient/subjects.py
moonclient/moonclient/tenants.py

index 4ba740f..b42b29d 100644 (file)
@@ -1173,34 +1173,7 @@ FILE_OPTIONS = {
                     deprecated_name='cert_required', deprecated_group='ssl',
                     deprecated_for_removal=True,
                     help='Require client certificate.'),
-    ],
-    'moon': [
-        cfg.StrOpt('configuration_driver',
-                   default='keystone.contrib.moon.backends.memory.ConfigurationConnector',
-                   help='Configuration backend driver.'),
-        cfg.StrOpt('tenant_driver',
-                   default='keystone.contrib.moon.backends.sql.TenantConnector',
-                   help='Tenant backend driver.'),
-        cfg.StrOpt('authz_driver',
-                   default='keystone.contrib.moon.backends.flat.SuperExtensionConnector',
-                   help='Authorisation backend driver.'),
-        cfg.StrOpt('intraextension_driver',
-                   default='keystone.contrib.moon.backends.sql.IntraExtensionConnector',
-                   help='IntraExtension backend driver.'),
-        cfg.StrOpt('interextension_driver',
-                   default='keystone.contrib.moon.backends.sql.InterExtensionConnector',
-                   help='InterExtension backend driver.'),
-        cfg.StrOpt('log_driver',
-                   default='keystone.contrib.moon.backends.flat.LogConnector',
-                   help='Logs backend driver.'),
-        cfg.StrOpt('policy_directory',
-                   default='/etc/keystone/policies',
-                   help='Local directory where all policies are stored.'),
-        cfg.StrOpt('root_policy_directory',
-                   default='policy_root',
-                   help='Local directory where Root IntraExtension configuration is stored.'),
     ]
-
 }
 
 
index 8e19ff8..ddc88fb 100644 (file)
@@ -27,20 +27,35 @@ from keystone.contrib.moon.algorithms import *
 CONF = cfg.CONF
 LOG = log.getLogger(__name__)
 
-EXTENSION_DATA = {
-    'name': 'OpenStack Moon APIs',
-    'namespace': 'http://docs.openstack.org/identity/api/ext/'
-                 'OS-MOON',
-    'alias': 'OS-MOON',
-    'updated': '2015-09-02T12:00:0-00:00',
-    'description': 'OpenStack Authorization Providers Mechanism.',
-    'links': [{
-        'rel': 'describedby',
-        'type': 'text/html',
-        'href': 'https://git.opnfv.org/moon.git'
-    }]}
-extension.register_admin_extension(EXTENSION_DATA['alias'], EXTENSION_DATA)
-extension.register_public_extension(EXTENSION_DATA['alias'], EXTENSION_DATA)
+OPTS = [
+    cfg.StrOpt('configuration_driver',
+               default='keystone.contrib.moon.backends.memory.ConfigurationConnector',
+               help='Configuration backend driver.'),
+    cfg.StrOpt('tenant_driver',
+               default='keystone.contrib.moon.backends.sql.TenantConnector',
+               help='Tenant backend driver.'),
+    cfg.StrOpt('authz_driver',
+               default='keystone.contrib.moon.backends.flat.SuperExtensionConnector',
+               help='Authorisation backend driver.'),
+    cfg.StrOpt('intraextension_driver',
+               default='keystone.contrib.moon.backends.sql.IntraExtensionConnector',
+               help='IntraExtension backend driver.'),
+    cfg.StrOpt('interextension_driver',
+               default='keystone.contrib.moon.backends.sql.InterExtensionConnector',
+               help='InterExtension backend driver.'),
+    cfg.StrOpt('log_driver',
+               default='keystone.contrib.moon.backends.flat.LogConnector',
+               help='Logs backend driver.'),
+    cfg.StrOpt('policy_directory',
+               default='/etc/keystone/policies',
+               help='Local directory where all policies are stored.'),
+    cfg.StrOpt('root_policy_directory',
+               default='policy_root',
+               help='Local directory where Root IntraExtension configuration is stored.'),
+]
+
+for option in OPTS:
+    CONF.register_opt(option, group="moon")
 
 
 def filter_input(func_or_str):
@@ -150,7 +165,7 @@ def enforce(action_names, object_name, **extra):
                     else:
                         # id is not a known tenant ID, so we must check against the Root intra_extension
                         intra_extension_id = intra_root_extension_id
-                        LOG.warning("Cannot emanager because the intra-extension is unknown (fallback to the root intraextension)")
+                        LOG.warning("Cannot manage because the intra-extension is unknown (fallback to the root intraextension)")
                 for _tenant_id in tenants_dict:
                     if tenants_dict[_tenant_id]['intra_authz_extension_id'] == intra_extension_id or \
                                     tenants_dict[_tenant_id]['intra_admin_extension_id'] == intra_extension_id:
@@ -369,18 +384,6 @@ class TenantManager(manager.Manager):
         self.moonlog_api.debug("add_tenant_dict {}".format(tenant_dict))
         if 'intra_admin_extension_id' in tenant_dict and tenant_dict['intra_admin_extension_id']:
             if 'intra_authz_extension_id' in tenant_dict and tenant_dict['intra_authz_extension_id']:
-                # authz_subjects_dict = self.admin_api.get_subjects_dict(self.root_api.get_root_admin_id(), tenant_dict['intra_authz_extension_id'])
-                # admin_subjects_dict = self.admin_api.get_subjects_dict(self.root_api.get_root_admin_id(), tenant_dict['intra_admin_extension_id'])
-                # for _subject_id in authz_subjects_dict:
-                #     if _subject_id not in admin_subjects_dict:
-                #         self.admin_api.add_subject_dict(self.root_api.get_root_admin_id(), tenant_dict['intra_admin_extension_id'], authz_subjects_dict[_subject_id])
-                # for _subject_id in admin_subjects_dict:
-                #     if _subject_id not in authz_subjects_dict:
-                #         self.admin_api.add_subject_dict(self.root_api.get_root_admin_id(), tenant_dict['intra_authz_extension_id'], admin_subjects_dict[_subject_id])
-
-                # TODO (ateroide): check whether we can replace the below code by the above one
-                # NOTE (ateroide): at a first glance: no, subject_id changes depending on which intra_extesion is used
-                # we must use name which is constant.
                 authz_subjects_dict = self.admin_api.get_subjects_dict(self.root_api.root_admin_id, tenant_dict['intra_authz_extension_id'])
                 authz_subject_names_list = [authz_subjects_dict[subject_id]["name"] for subject_id in authz_subjects_dict]
                 admin_subjects_dict = self.admin_api.get_subjects_dict(self.root_api.root_admin_id, tenant_dict['intra_admin_extension_id'])
@@ -440,10 +443,8 @@ class IntraExtensionManager(manager.Manager):
 
     def __init__(self):
         super(IntraExtensionManager, self).__init__(CONF.moon.intraextension_driver)
-        # self.root_admin_id = self.__compute_admin_id_for_root_extension()
         self._root_admin_id = None
         self._root_extension_id = None
-        # self.__init_aggregation_algorithm()
 
     def __init_root(self, root_extension_id=None):
         LOG.debug("__init_root {}".format(root_extension_id))
@@ -490,12 +491,6 @@ class IntraExtensionManager(manager.Manager):
         LOG.debug("self.driver.get_intra_extensions_dict()={}".format(self.driver.get_intra_extensions_dict()))
         return {self.root_extension_id: self.driver.get_intra_extensions_dict()[self.root_extension_id]}
 
-    # def __compute_admin_id_for_root_extension(self):
-    #     for subject_id, subject_dict in self.driver.get_subjects_dict(self.root_extension_id).iteritems():
-    #         if subject_dict["name"] == "admin":
-    #             return subject_id
-    #     raise RootExtensionNotInitialized()
-
     def get_root_extension_id(self):
         extensions = self.driver.get_intra_extensions_dict()
         for extension_id, extension_dict in extensions.iteritems():
@@ -507,15 +502,6 @@ class IntraExtensionManager(manager.Manager):
                 raise IntraExtensionCreationError("The root extension is not created.")
             return extension['id']
 
-    # def __init_aggregation_algorithm(self):
-    #     try:
-    #         self._root_extension_id = self.get_root_extension_id()
-    #         self.aggregation_algorithm_dict = self.configuration_api.get_aggregation_algorithms_dict(self.root_extension_id)
-    #     except AttributeError as e:
-    #         LOG.warning("Error on init_aggregation_algorithm ({})".format(e))
-    #         self._root_extension_id = None
-    #         self.aggregation_algorithm_dict = {}
-
     def __get_authz_buffer(self, intra_extension_id, subject_id, object_id, action_id):
         """
         :param intra_extension_id:
@@ -602,8 +588,6 @@ class IntraExtensionManager(manager.Manager):
                     meta_rule_dict[sub_meta_rule_id],
                     self.driver.get_rules_dict(intra_extension_id, sub_meta_rule_id).values())
 
-        # if not self.root_extension_id:
-        #     self.__init_aggregation_algorithm()
         aggregation_algorithm_id = self.driver.get_aggregation_algorithm_id(intra_extension_id)['aggregation_algorithm']
         if self.aggregation_algorithm_dict[aggregation_algorithm_id]['name'] == 'all_true':
             decision = all_true(decision_buffer)
@@ -637,32 +621,15 @@ class IntraExtensionManager(manager.Manager):
         f = open(metadata_path)
         json_perimeter = json.load(f)
 
-        # subject_categories_dict = dict()
         for _cat in json_perimeter['subject_categories']:
             self.driver.set_subject_category_dict(intra_extension_dict["id"], uuid4().hex,
                                                   {"name": _cat, "description": _cat})
-        # Initialize scope categories
-        # for _cat in subject_categories_dict.keys():
-        #     self.driver.set_subject_scope_dict(intra_extension_dict["id"], _cat, {})
-        # intra_extension_dict['subject_categories'] = subject_categories_dict
-
-        # object_categories_dict = dict()
         for _cat in json_perimeter['object_categories']:
             self.driver.set_object_category_dict(intra_extension_dict["id"], uuid4().hex,
                                                  {"name": _cat, "description": _cat})
-        # Initialize scope categories
-        # for _cat in object_categories_dict.keys():
-        #     self.driver.set_object_scope_dict(intra_extension_dict["id"], _cat, {})
-        # intra_extension_dict['object_categories'] = object_categories_dict
-
-        # action_categories_dict = dict()
         for _cat in json_perimeter['action_categories']:
             self.driver.set_action_category_dict(intra_extension_dict["id"], uuid4().hex,
                                                  {"name": _cat, "description": _cat})
-        # Initialize scope categories
-        # for _cat in action_categories_dict.keys():
-        #     self.driver.set_action_scope_dict(intra_extension_dict["id"], _cat, {})
-        # intra_extension_dict['action_categories'] = action_categories_dict
 
     def __load_perimeter_file(self, intra_extension_dict, policy_dir):
 
@@ -805,7 +772,6 @@ class IntraExtensionManager(manager.Manager):
         metadata_path = os.path.join(policy_dir, 'metarule.json')
         f = open(metadata_path)
         json_metarule = json.load(f)
-        # ie["meta_rules"] = copy.deepcopy(json_metarule)
         metarule = dict()
         categories = {
             "subject_categories": self.driver.SUBJECT_CATEGORY,
@@ -847,13 +813,10 @@ class IntraExtensionManager(manager.Manager):
             sub_rule_id = self.driver.get_uuid_from_name(intra_extension_dict["id"],
                                                          sub_rule_name,
                                                          self.driver.SUB_META_RULE)
-            # if sub_rule_name not in self.get_sub_meta_rule_relations("admin", ie["id"])["sub_meta_rule_relations"]:
-            #     raise IntraExtensionException("Bad sub_rule_name name {} in rules".format(sub_rule_name))
             rules[sub_rule_id] = list()
             for rule in json_rules[sub_rule_name]:
                 subrule = list()
                 _rule = list(rule)
-                # sub_rule_id = self.driver.get_uuid_from_name(intra_extension_dict["id"], sub_rule_name, self.driver.SUB_META_RULE)
                 for category_uuid in sub_meta_rules[sub_rule_id]["subject_categories"]:
                     scope_name = _rule.pop(0)
                     scope_uuid = self.driver.get_uuid_from_name(intra_extension_dict["id"],
@@ -881,7 +844,6 @@ class IntraExtensionManager(manager.Manager):
                 else:
                     # if value doesn't exist add a default value
                     subrule.append(True)
-                # rules[sub_rule_id].append(subrule)
                 self.driver.set_rule_dict(intra_extension_dict["id"], sub_rule_id, uuid4().hex, subrule)
 
     @enforce(("read", "write"), "intra_extensions")
@@ -914,11 +876,6 @@ class IntraExtensionManager(manager.Manager):
         # Note (asteroide): Only one root Extension is authorized
         # and this extension is created at the very beginning of the server
         # so we don't need to use enforce here
-        # if self.get_root_extension_id():
-        #     # for ext in self.driver.get_intra_extensions_dict():
-        #     # Note (asteroide): if there is at least one Intra Extension, it implies that
-        #     # the Root Intra Extension had already been created...
-        #     return
         extensions = self.driver.get_intra_extensions_dict()
         for extension_id, extension_dict in extensions.iteritems():
             if extension_dict["name"] == CONF.moon.root_policy_directory:
@@ -930,10 +887,7 @@ class IntraExtensionManager(manager.Manager):
         ie_dict["genre"] = "admin"
         ie_dict["description"] = "policy_root"
         ref = self.driver.set_intra_extension_dict(ie_dict['id'], ie_dict)
-        # try:
         self.moonlog_api.debug("Creation of root IE: {}".format(ref))
-        # except AttributeError:
-        #     LOG.debug("Creation of root IE: {}".format(ref))
 
         # read the template given by "model" and populate default variables
         template_dir = os.path.join(CONF.moon.policy_directory, ie_dict["model"])
index fd1c0ad..fd821a4 100644 (file)
@@ -12,11 +12,14 @@ from oslo_log import log
 LOG = log.getLogger(__name__)
 
 
-class Routers(wsgi.V3ExtensionRouter):
+class Routers(wsgi.ComposableRouter):
     """API Endpoints for the Moon extension.
     """
 
-    PATH_PREFIX = '/OS-MOON'
+    PATH_PREFIX = ''
+
+    def __init__(self, description):
+        self.description = description
 
     @staticmethod
     def _get_rel(component):
@@ -34,419 +37,462 @@ class Routers(wsgi.V3ExtensionRouter):
         tenants_controller = controllers.Tenants()
         logs_controller = controllers.Logs()
         inter_ext_controller = controllers.InterExtensions()
+
         # Configuration route
-        self._add_resource(
-            mapper, configuration_controller,
-            path=self.PATH_PREFIX+'/configuration/templates',
-            get_action='get_policy_templates',
-            rel=self._get_rel('templates'),
-            path_vars={})
-        self._add_resource(
-            mapper, configuration_controller,
-            path=self.PATH_PREFIX+'/configuration/aggregation_algorithms',
-            get_action='get_aggregation_algorithms',
-            rel=self._get_rel('aggregation_algorithms'),
-            path_vars={})
-        self._add_resource(
-            mapper, configuration_controller,
-            path=self.PATH_PREFIX+'/configuration/sub_meta_rule_algorithms',
-            get_action='get_sub_meta_rule_algorithms',
-            rel=self._get_rel('sub_meta_rule_algorithms'),
-            path_vars={})
+        mapper.connect(
+            self.PATH_PREFIX+'/configuration/templates',
+            controller=configuration_controller,
+            action='get_policy_templates',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/configuration/aggregation_algorithms',
+            controller=configuration_controller,
+            action='get_aggregation_algorithms',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/configuration/sub_meta_rule_algorithms',
+            controller=configuration_controller,
+            action='get_sub_meta_rule_algorithms',
+            conditions=dict(method=['GET']))
 
         # Tenants route
-        self._add_resource(
-            mapper, tenants_controller,
-            path=self.PATH_PREFIX+'/tenants',
-            get_action='get_tenants',
-            post_action='add_tenant',
-            rel=self._get_rel('tenants'),
-            path_vars={})
-        self._add_resource(
-            mapper, tenants_controller,
-            path=self.PATH_PREFIX+'/tenants/{tenant_id}',
-            get_action='get_tenant',
-            delete_action='del_tenant',
-            post_action='set_tenant',
-            rel=self._get_rel('tenants'),
-            path_vars={
-                'tenant_id': self._get_path('tenants'),
-            })
+        mapper.connect(
+            self.PATH_PREFIX+'/tenants',
+            controller=tenants_controller,
+            action='get_tenants',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/tenants',
+            controller=tenants_controller,
+            action='add_tenant',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/tenants/{tenant_id}',
+            controller=tenants_controller,
+            action='get_tenant',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/tenants/{tenant_id}',
+            controller=tenants_controller,
+            action='del_tenant',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/tenants/{tenant_id}',
+            controller=tenants_controller,
+            action='set_tenant',
+            conditions=dict(method=['POST']))
 
         # Authz route
-        self._add_resource(
-            mapper, authz_controller,
-            path=self.PATH_PREFIX+'/authz/{tenant_id}/{subject_k_id}/{object_name}/{action_name}',
-            get_action='get_authz',
-            rel=self._get_rel('authz'),
-            path_vars={
-                'tenant_id': self._get_path('tenants'),
-                'subject_k_id': self._get_path('subjects'),
-                'object_name': self._get_path('objects'),
-                'action_name': self._get_path('actions'),
-            })
+        mapper.connect(
+            self.PATH_PREFIX+'/authz/{tenant_id}/{subject_k_id}/{object_name}/{action_name}',
+            controller=authz_controller,
+            action='get_authz',
+            conditions=dict(method=['GET']))
 
         # IntraExtensions/Admin route
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/init',
-            get_action='load_root_intra_extension',
-            rel=self._get_rel('intra_extensions'),
-            path_vars={})
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions',
-            get_action='get_intra_extensions',
-            post_action='add_intra_extension',
-            rel=self._get_rel('intra_extensions'),
-            path_vars={})
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}',
-            get_action='get_intra_extension',
-            delete_action='del_intra_extension',
-            post_action='set_intra_extension',
-            rel=self._get_rel('intra_extensions'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/init',
+            controller=intra_ext_controller,
+            action='load_root_intra_extension',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions',
+            controller=intra_ext_controller,
+            action='get_intra_extensions',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions',
+            controller=intra_ext_controller,
+            action='add_intra_extension',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}',
+            controller=intra_ext_controller,
+            action='get_intra_extension',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}',
+            controller=intra_ext_controller,
+            action='set_intra_extension',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}',
+            controller=intra_ext_controller,
+            action='del_intra_extension',
+            conditions=dict(method=['DELETE']))
 
         # Metadata route
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_categories',
-            get_action='get_subject_categories',
-            post_action='add_subject_category',
-            rel=self._get_rel('subject_categories'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_categories/{subject_category_id}',
-            get_action='get_subject_category',
-            delete_action='del_subject_category',
-            post_action='set_subject_category',
-            rel=self._get_rel('subject_categories'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_categories',
-            get_action='get_object_categories',
-            post_action='add_object_category',
-            rel=self._get_rel('object_categories'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_categories/{object_category_id}',
-            get_action='get_object_category',
-            delete_action='del_object_category',
-            post_action='set_object_category',
-            rel=self._get_rel('object_categories'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_categories',
-            get_action='get_action_categories',
-            post_action='add_action_category',
-            rel=self._get_rel('action_categories'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_categories/{action_category_id}',
-            get_action='get_action_category',
-            delete_action='del_action_category',
-            post_action='set_action_category',
-            rel=self._get_rel('action_categories'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_categories',
+            controller=intra_ext_controller,
+            action='get_subject_categories',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_categories',
+            controller=intra_ext_controller,
+            action='add_subject_category',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_categories/{subject_category_id}',
+            controller=intra_ext_controller,
+            action='get_subject_category',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_categories/{subject_category_id}',
+            controller=intra_ext_controller,
+            action='del_subject_category',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_categories/{subject_category_id}',
+            controller=intra_ext_controller,
+            action='set_subject_category',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_categories',
+            controller=intra_ext_controller,
+            action='get_object_categories',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_categories',
+            controller=intra_ext_controller,
+            action='add_object_category',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_categories/{object_category_id}',
+            controller=intra_ext_controller,
+            action='get_object_category',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_categories/{object_category_id}',
+            controller=intra_ext_controller,
+            action='del_object_category',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_categories/{object_category_id}',
+            controller=intra_ext_controller,
+            action='set_object_category',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_categories',
+            controller=intra_ext_controller,
+            action='get_action_categories',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_categories',
+            controller=intra_ext_controller,
+            action='add_action_category',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_categories/{action_category_id}',
+            controller=intra_ext_controller,
+            action='get_action_category',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_categories/{action_category_id}',
+            controller=intra_ext_controller,
+            action='del_action_category',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_categories/{action_category_id}',
+            controller=intra_ext_controller,
+            action='set_action_category',
+            conditions=dict(method=['POST']))
 
         # Perimeter route
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subjects',
-            get_action='get_subjects',
-            post_action='add_subject',
-            rel=self._get_rel('subjects'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subjects/{subject_id}',
-            get_action='get_subject',
-            delete_action='del_subject',
-            post_action='set_subject',
-            rel=self._get_rel('subjects'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/objects',
-            get_action='get_objects',
-            post_action='add_object',
-            rel=self._get_rel('subjects'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/objects/{object_id}',
-            get_action='get_object',
-            delete_action='del_object',
-            post_action='set_object',
-            rel=self._get_rel('objects'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/actions',
-            get_action='get_actions',
-            post_action='add_action',
-            rel=self._get_rel('actions'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/actions/{action_id}',
-            get_action='get_action',
-            delete_action='del_action',
-            post_action='set_action',
-            rel=self._get_rel('actions'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subjects',
+            controller=intra_ext_controller,
+            action='get_subjects',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subjects',
+            controller=intra_ext_controller,
+            action='add_subject',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subjects/{subject_id}',
+            controller=intra_ext_controller,
+            action='get_subject',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subjects/{subject_id}',
+            controller=intra_ext_controller,
+            action='del_subject',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subjects/{subject_id}',
+            controller=intra_ext_controller,
+            action='set_subject',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/objects',
+            controller=intra_ext_controller,
+            action='get_objects',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/objects',
+            controller=intra_ext_controller,
+            action='add_object',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/objects/{object_id}',
+            controller=intra_ext_controller,
+            action='get_object',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/objects/{object_id}',
+            controller=intra_ext_controller,
+            action='del_object',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/objects/{object_id}',
+            controller=intra_ext_controller,
+            action='set_object',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/actions',
+            controller=intra_ext_controller,
+            action='get_actions',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/actions',
+            controller=intra_ext_controller,
+            action='add_action',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/actions/{action_id}',
+            controller=intra_ext_controller,
+            action='get_action',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/actions/{action_id}',
+            controller=intra_ext_controller,
+            action='del_action',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/actions/{action_id}',
+            controller=intra_ext_controller,
+            action='set_action',
+            conditions=dict(method=['POST']))
 
         # Scope route
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}',
-            get_action='get_subject_scopes',
-            post_action='add_subject_scope',
-            rel=self._get_rel('subject_scope'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}/{subject_scope_id}',
-            get_action='get_subject_scope',
-            delete_action='del_subject_scope',
-            post_action='set_subject_scope',
-            rel=self._get_rel('subject_scope'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}',
-            get_action='get_object_scopes',
-            post_action='add_object_scope',
-            rel=self._get_rel('object_scope'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}/{object_scope_id}',
-            get_action='get_object_scope',
-            delete_action='del_object_scope',
-            post_action='set_object_scope',
-            rel=self._get_rel('object_scope'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}',
-            get_action='get_action_scopes',
-            post_action='add_action_scope',
-            rel=self._get_rel('action_scope'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}/{action_scope_id}',
-            get_action='get_action_scope',
-            delete_action='del_action_scope',
-            post_action='set_action_scope',
-            rel=self._get_rel('action_scope'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}',
+            controller=intra_ext_controller,
+            action='get_subject_scopes',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}',
+            controller=intra_ext_controller,
+            action='add_subject_scope',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}/{subject_scope_id}',
+            controller=intra_ext_controller,
+            action='get_subject_scope',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}/{subject_scope_id}',
+            controller=intra_ext_controller,
+            action='del_subject_scope',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_scopes/{subject_category_id}/{subject_scope_id}',
+            controller=intra_ext_controller,
+            action='set_subject_scope',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}',
+            controller=intra_ext_controller,
+            action='get_object_scopes',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}',
+            controller=intra_ext_controller,
+            action='add_object_scope',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}/{object_scope_id}',
+            controller=intra_ext_controller,
+            action='get_object_scope',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}/{object_scope_id}',
+            controller=intra_ext_controller,
+            action='del_object_scope',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_scopes/{object_category_id}/{object_scope_id}',
+            controller=intra_ext_controller,
+            action='set_object_scope',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}',
+            controller=intra_ext_controller,
+            action='get_action_scopes',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}',
+            controller=intra_ext_controller,
+            action='add_action_scope',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}/{action_scope_id}',
+            controller=intra_ext_controller,
+            action='get_action_scope',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}/{action_scope_id}',
+            controller=intra_ext_controller,
+            action='del_action_scope',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_scopes/{action_category_id}/{action_scope_id}',
+            controller=intra_ext_controller,
+            action='set_action_scope',
+            conditions=dict(method=['POST']))
 
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_assignments',
-            post_action='add_subject_assignment',
-            rel=self._get_rel('subject_assignments'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/subject_assignments',
+            controller=intra_ext_controller,
+            action='add_subject_assignment',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
                                   'subject_assignments/{subject_id}/{subject_category_id}',
-            get_action='get_subject_assignment',
-            rel=self._get_rel('subject_assignments'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
+            controller=intra_ext_controller,
+            action='get_subject_assignment',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
                                   'subject_assignments/{subject_id}/{subject_category_id}/{subject_scope_id}',
-            delete_action='del_subject_assignment',
-            rel=self._get_rel('subject_assignments'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_assignments',
-            post_action='add_object_assignment',
-            rel=self._get_rel('object_assignments'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
+            controller=intra_ext_controller,
+            action='del_subject_assignment',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/object_assignments',
+            controller=intra_ext_controller,
+            action='add_object_assignment',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
                                   'object_assignments/{object_id}/{object_category_id}',
-            get_action='get_object_assignment',
-            rel=self._get_rel('object_assignments'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
+            controller=intra_ext_controller,
+            action='get_object_assignment',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
                                   'object_assignments/{object_id}/{object_category_id}/{object_scope_id}',
-            delete_action='del_object_assignment',
-            rel=self._get_rel('object_assignments'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_assignments',
-            post_action='add_action_assignment',
-            rel=self._get_rel('action_assignments'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
+            controller=intra_ext_controller,
+            action='del_object_assignment',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/action_assignments',
+            controller=intra_ext_controller,
+            action='add_action_assignment',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
                                   'action_assignments/{action_id}/{action_category_id}',
-            get_action='get_action_assignment',
-            rel=self._get_rel('action_assignments'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
+            controller=intra_ext_controller,
+            action='get_action_assignment',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/'
                                   'action_assignments/{action_id}/{action_category_id}/{action_scope_id}',
-            delete_action='del_action_assignment',
-            rel=self._get_rel('action_assignments'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
+            controller=intra_ext_controller,
+            action='del_action_assignment',
+            conditions=dict(method=['DELETE']))
 
         # Metarule route
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/aggregation_algorithm',
-            post_action='set_aggregation_algorithm',
-            get_action='get_aggregation_algorithm',
-            rel=self._get_rel('aggregation_algorithms'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/sub_meta_rules',
-            get_action='get_sub_meta_rules',
-            post_action='add_sub_meta_rule',
-            rel=self._get_rel('sub_meta_rules'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/sub_meta_rules/{sub_meta_rule_id}',
-            get_action='get_sub_meta_rule',
-            delete_action='del_sub_meta_rule',
-            post_action='set_sub_meta_rule',
-            rel=self._get_rel('sub_meta_rules'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/aggregation_algorithm',
+            controller=intra_ext_controller,
+            action='get_aggregation_algorithm',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/aggregation_algorithm',
+            controller=intra_ext_controller,
+            action='set_aggregation_algorithm',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/sub_meta_rules',
+            controller=intra_ext_controller,
+            action='get_sub_meta_rules',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/sub_meta_rules',
+            controller=intra_ext_controller,
+            action='add_sub_meta_rule',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/sub_meta_rules/{sub_meta_rule_id}',
+            controller=intra_ext_controller,
+            action='get_sub_meta_rule',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/sub_meta_rules/{sub_meta_rule_id}',
+            controller=intra_ext_controller,
+            action='del_sub_meta_rule',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/sub_meta_rules/{sub_meta_rule_id}',
+            controller=intra_ext_controller,
+            action='set_sub_meta_rule',
+            conditions=dict(method=['POST']))
 
         # Rules route
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}',
-            get_action='get_rules',
-            post_action='add_rule',
-            rel=self._get_rel('rules'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
-        self._add_resource(
-            mapper, intra_ext_controller,
-            path=self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}/{rule_id}',
-            get_action='get_rule',
-            delete_action='del_rule',
-            post_action='set_rule',
-            rel=self._get_rel('rules'),
-            path_vars={
-                'intra_extension_id': self._get_path('intra_extensions'),
-            })
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}',
+            controller=intra_ext_controller,
+            action='get_rules',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}',
+            controller=intra_ext_controller,
+            action='add_rule',
+            conditions=dict(method=['POST']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}/{rule_id}',
+            controller=intra_ext_controller,
+            action='get_rule',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}/{rule_id}',
+            controller=intra_ext_controller,
+            action='del_rule',
+            conditions=dict(method=['DELETE']))
+        mapper.connect(
+            self.PATH_PREFIX+'/intra_extensions/{intra_extension_id}/rule/{sub_meta_rule_id}/{rule_id}',
+            controller=intra_ext_controller,
+            action='set_rule',
+            conditions=dict(method=['POST']))
 
         # Logs route
-        self._add_resource(
-            mapper, logs_controller,
-            path=self.PATH_PREFIX+'/logs',
-            get_action='get_logs',
-            rel=self._get_rel('logs'),
-            path_vars={
-            })
-        self._add_resource(
-            mapper, logs_controller,
-            path=self.PATH_PREFIX+'/logs/{options}',
-            get_action='get_logs',
-            rel=self._get_rel('logs'),
-            path_vars={
-            })
+        mapper.connect(
+            self.PATH_PREFIX+'/logs',
+            controller=logs_controller,
+            action='get_logs',
+            conditions=dict(method=['GET']))
+        mapper.connect(
+            self.PATH_PREFIX+'/logs/{options}',
+            controller=logs_controller,
+            action='get_logs',
+            conditions=dict(method=['GET']))
 
         # InterExtensions route
-        # self._add_resource(
-        #     mapper, inter_ext_controller,
-        #     path=self.PATH_PREFIX+'/inter_extensions',
-        #     get_action='get_inter_extensions',
-        #     post_action='create_inter_extension',
+        # mapper.connect(
+        #     controller=inter_ext_controller,
+        #     self.PATH_PREFIX+'/inter_extensions',
+        #     action='get_inter_extensions',
+        #     action='create_inter_extension',
         #     rel=self._get_rel('inter_extensions'),
         #     path_vars={})
-        # self._add_resource(
-        #     mapper, inter_ext_controller,
-        #     path=self.PATH_PREFIX+'/inter_extensions/{inter_extension_id}',
-        #     get_action='get_inter_extension',
-        #     delete_action='delete_inter_extension',
+        # mapper.connect(
+        #     controller=inter_ext_controller,
+        #     self.PATH_PREFIX+'/inter_extensions/{inter_extension_id}',
+        #     action='get_inter_extension',
+        #     action='delete_inter_extension',
         #     rel=self._get_rel('inter_extensions'),
         #     path_vars={
         #         'inter_extension_id': self._get_path('inter_extensions'),
diff --git a/keystone-moon/keystone/contrib/moon/service.py b/keystone-moon/keystone/contrib/moon/service.py
new file mode 100644 (file)
index 0000000..cd68e98
--- /dev/null
@@ -0,0 +1,57 @@
+import functools
+import sys
+
+from oslo_config import cfg
+from oslo_log import log
+from paste import deploy
+import routes
+from keystone.contrib.moon.routers import Routers
+
+from keystone import assignment
+from keystone import auth
+from keystone import catalog
+from keystone.common import wsgi
+from keystone import controllers
+from keystone import credential
+from keystone import endpoint_policy
+from keystone import identity
+from keystone import policy
+from keystone import resource
+from keystone import routers
+from keystone import token
+from keystone import trust
+
+
+CONF = cfg.CONF
+LOG = log.getLogger(__name__)
+
+
+# def loadapp(conf, name):
+#     # NOTE(blk-u): Save the application being loaded in the controllers module.
+#     # This is similar to how public_app_factory() and v3_app_factory()
+#     # register the version with the controllers module.
+#     controllers.latest_app = deploy.loadapp(conf, name=name)
+#     return controllers.latest_app
+
+
+def fail_gracefully(f):
+    """Logs exceptions and aborts."""
+    @functools.wraps(f)
+    def wrapper(*args, **kw):
+        try:
+            return f(*args, **kw)
+        except Exception as e:
+            LOG.debug(e, exc_info=True)
+
+            # exception message is printed to all logs
+            LOG.critical(e)
+            sys.exit(1)
+
+    return wrapper
+
+
+@fail_gracefully
+def moon_app_factory(global_conf, **local_conf):
+    return wsgi.ComposingRouter(routes.Mapper(),
+                                [Routers('moon_service')])
+
diff --git a/keystone-moon/keystone/contrib/moon/wsgi.py b/keystone-moon/keystone/contrib/moon/wsgi.py
new file mode 100644 (file)
index 0000000..f2a9963
--- /dev/null
@@ -0,0 +1,8 @@
+from keystone.server import wsgi
+from oslo_log import log
+
+LOG = log.getLogger(__name__)
+
+
+def initialize_moon_application():
+    return wsgi.initialize_application('moon_service')
index 2bb79c1..5290d40 100644 (file)
@@ -74,6 +74,7 @@ console_scripts =
 wsgi_scripts =
     keystone-wsgi-admin = keystone.server.wsgi:initialize_admin_application
     keystone-wsgi-public = keystone.server.wsgi:initialize_public_application
+    keystone-wsgi-moon = keystone.contrib.moon.wsgi:initialize_moon_application
 
 keystone.assignment =
     ldap = keystone.assignment.backends.ldap:Assignment
@@ -205,7 +206,6 @@ paste.filter_factory =
     token_auth = keystone.middleware:TokenAuthMiddleware.factory
     url_normalize = keystone.middleware:NormalizingFilter.factory
     user_crud_extension = keystone.contrib.user_crud:CrudExtension.factory
-    moon_extension = keystone.contrib.moon.routers:Routers.factory
 
 paste.app_factory =
     admin_service = keystone.service:admin_app_factory
@@ -213,3 +213,4 @@ paste.app_factory =
     public_service = keystone.service:public_app_factory
     public_version_service = keystone.service:public_version_app_factory
     service_v3 = keystone.service:v3_app_factory
+    moon_service = keystone.contrib.moon.service:moon_app_factory
index be2a66d..5625a2f 100644 (file)
@@ -34,7 +34,7 @@ class ActionAssignmentsList(Lister):
         return parser
 
     def __get_scope_from_id(self, intraextension_id, action_category_id, action_scope_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_scopes/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_scopes/{}".format(
             intraextension_id, action_category_id),
             authtoken=True)
         if action_scope_id in data:
@@ -43,7 +43,7 @@ class ActionAssignmentsList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_assignments/{}/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_assignments/{}/{}".format(
             parsed_args.intraextension, parsed_args.action_id, parsed_args.action_category_id),
             authtoken=True)
         return (
@@ -84,7 +84,7 @@ class ActionAssignmentsAdd(Command):
         return parser
 
     def __get_scope_from_id(self, intraextension_id, action_category_id, action_scope_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_scopes/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_scopes/{}".format(
             intraextension_id, action_category_id),
             authtoken=True)
         if action_scope_id in data:
@@ -93,7 +93,7 @@ class ActionAssignmentsAdd(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_assignments".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_assignments".format(parsed_args.intraextension),
                                 post_data={
                                     "action_id": parsed_args.action_id,
                                     "action_category_id": parsed_args.action_category_id,
@@ -139,7 +139,7 @@ class ActionAssignmentsDelete(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_assignments/{}/{}/{}".format(
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_assignments/{}/{}/{}".format(
             parsed_args.intraextension,
             parsed_args.action_id,
             parsed_args.action_category_id,
index f4400c7..bf7cb7e 100644 (file)
@@ -26,7 +26,7 @@ class ActionCategoriesList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_categories".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_categories".format(parsed_args.intraextension),
                                 authtoken=True)
         return (
             ("id", "name", "description"),
@@ -61,7 +61,7 @@ class ActionCategoriesAdd(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_categories".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_categories".format(parsed_args.intraextension),
                                 post_data={
                                     "action_category_name": parsed_args.action_category_name,
                                     "action_category_description": parsed_args.description},
@@ -94,7 +94,7 @@ class ActionCategoriesDelete(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_categories/{}".format(
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_categories/{}".format(
             parsed_args.intraextension,
             parsed_args.action_category_id),
             method="DELETE",
index 53ed260..9ddf8d4 100644 (file)
@@ -31,7 +31,7 @@ class ActionScopesList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_scopes/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_scopes/{}".format(
             parsed_args.intraextension, parsed_args.action_category_id),
             authtoken=True)
         self.log.debug(data)
@@ -73,7 +73,7 @@ class ActionScopesAdd(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_scopes/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_scopes/{}".format(
             parsed_args.intraextension, parsed_args.action_category_id),
             post_data={
                 "action_scope_name": parsed_args.action_scope_name,
@@ -113,7 +113,7 @@ class ActionScopesDelete(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_scopes/{}/{}".format(
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_scopes/{}/{}".format(
             parsed_args.intraextension,
             parsed_args.action_category_id,
             parsed_args.action_scope_id
index f255057..9fbad13 100644 (file)
@@ -26,7 +26,7 @@ class ActionsList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/actions".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/actions".format(parsed_args.intraextension),
                                 authtoken=True)
         return (
             ("id", "name", "description"),
@@ -61,7 +61,7 @@ class ActionsAdd(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/actions".format(parsed_args.intraextension),  # TODO: check method POST?
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/actions".format(parsed_args.intraextension),  # TODO: check method POST?
                                 post_data={
                                     "action_name": parsed_args.action_name,
                                     "action_description": parsed_args.description},
@@ -94,7 +94,7 @@ class ActionsDelete(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/actions/{}".format(
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/actions/{}".format(
             parsed_args.intraextension,
             parsed_args.action_id),
             method="DELETE",
index 3a77723..a05d715 100644 (file)
@@ -18,7 +18,7 @@ class TemplatesList(Lister):
         return parser
 
     def take_action(self, parsed_args):
-        templates = self.app.get_url("/v3/OS-MOON/configuration/templates", authtoken=True)
+        templates = self.app.get_url(self.app.url_prefix+"/configuration/templates", authtoken=True)
         return (
             ("id", "name", "description"),
             ((template_id, templates[template_id]["name"], templates[template_id]["description"])
@@ -36,7 +36,7 @@ class AggregationAlgorithmsList(Lister):
         return parser
 
     def take_action(self, parsed_args):
-        templates = self.app.get_url("/v3/OS-MOON/configuration/aggregation_algorithms", authtoken=True)
+        templates = self.app.get_url(self.app.url_prefix+"/configuration/aggregation_algorithms", authtoken=True)
         return (
             ("id", "name", "description"),
             ((template_id, templates[template_id]["name"], templates[template_id]["description"])
@@ -54,7 +54,7 @@ class SubMetaRuleAlgorithmsList(Lister):
         return parser
 
     def take_action(self, parsed_args):
-        templates = self.app.get_url("/v3/OS-MOON/configuration/sub_meta_rule_algorithms", authtoken=True)
+        templates = self.app.get_url(self.app.url_prefix+"/configuration/sub_meta_rule_algorithms", authtoken=True)
         return (
             ("id", "name", "description"),
             ((template_id, templates[template_id]["name"], templates[template_id]["description"])
index 24286dd..f66aabb 100644 (file)
@@ -26,7 +26,7 @@ class IntraExtensionSelect(Command):
         return parser
 
     def take_action(self, parsed_args):
-        ie = self.app.get_url("/v3/OS-MOON/intra_extensions", authtoken=True)
+        ie = self.app.get_url(self.app.url_prefix+"/intra_extensions", authtoken=True)
         if parsed_args.id in ie.keys():
             self.app.intraextension = parsed_args.id
             self.app.stdout.write("Select {} IntraExtension.\n".format(self.app.intraextension))
@@ -66,7 +66,7 @@ class IntraExtensionCreate(Command):
             "intra_extension_model": parsed_args.policy_model,
             "intra_extension_description": parsed_args.description
         }
-        ie = self.app.get_url("/v3/OS-MOON/intra_extensions", post_data=post_data, authtoken=True)
+        ie = self.app.get_url(self.app.url_prefix+"/intra_extensions", post_data=post_data, authtoken=True)
         if "id" not in ie:
             raise Exception("Error in command {}".format(ie))
         self.app.stdout.write("IntraExtension created: {}\n".format(ie["id"]))
@@ -83,7 +83,7 @@ class IntraExtensionList(Lister):
         return parser
 
     def take_action(self, parsed_args):
-        ie = self.app.get_url("/v3/OS-MOON/intra_extensions", authtoken=True)
+        ie = self.app.get_url(self.app.url_prefix+"/intra_extensions", authtoken=True)
         return (
             ("id", "name", "model"),
             ((_id, ie[_id]["name"], ie[_id]["model"]) for _id in ie.keys())
@@ -105,7 +105,7 @@ class IntraExtensionDelete(Command):
         return parser
 
     def take_action(self, parsed_args):
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}".format(parsed_args.uuid),
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}".format(parsed_args.uuid),
                          method="DELETE",
                          authtoken=True)
 
@@ -120,7 +120,7 @@ class IntraExtensionInit(Command):
         return parser
 
     def take_action(self, parsed_args):
-        self.app.get_url("/v3/OS-MOON/intra_extensions/init",
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/init",
                          method="GET",
                          authtoken=True)
 
@@ -145,7 +145,7 @@ class IntraExtensionShow(ShowOne):
         if parsed_args.uuid == "selected":
             intra_extension_id = self.app.intraextension
         self.log.debug("self.app.intraextension={}".format(intra_extension_id))
-        ie = self.app.get_url("/v3/OS-MOON/intra_extensions/{}".format(intra_extension_id), authtoken=True)
+        ie = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}".format(intra_extension_id), authtoken=True)
         self.log.debug("ie={}".format(ie))
         if "id" not in ie:
             self.log.error("Unknown intraextension {}".format(intra_extension_id))
index 3643778..e65a530 100644 (file)
@@ -85,9 +85,9 @@ class LogsList(Lister):
         if number:
             options.append("event_number={}".format(number))
         if len(options) > 0:
-            url = "/v3/OS-MOON/logs/{}".format(",".join(options))
+            url = self.app.url_prefix+"/logs/{}".format(",".join(options))
         else:
-            url = "/v3/OS-MOON/logs"
+            url = self.app.url_prefix+"/logs"
         data = self.app.get_url(url, authtoken=True)
         return (
             ("Time", "Message",),
index 8938f89..6727711 100644 (file)
@@ -16,7 +16,7 @@ class AggregationAlgorithmsList(Lister):
     log = logging.getLogger(__name__)
 
     def __get_aggregation_algorithm_from_id(self, algorithm_id):
-        algorithms = self.app.get_url("/v3/OS-MOON/configuration/aggregation_algorithms", authtoken=True)
+        algorithms = self.app.get_url(self.app.url_prefix+"/configuration/aggregation_algorithms", authtoken=True)
         if algorithm_id in algorithms:
             return algorithms[algorithm_id]
         return dict()
@@ -33,7 +33,7 @@ class AggregationAlgorithmsList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/aggregation_algorithm".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/aggregation_algorithm".format(
             parsed_args.intraextension),
             authtoken=True)
         algorithm = self.__get_aggregation_algorithm_from_id(data['aggregation_algorithm'])
@@ -49,7 +49,7 @@ class AggregationAlgorithmSet(Command):
     log = logging.getLogger(__name__)
 
     def __get_aggregation_algorithm_from_id(self, algorithm_id):
-        algorithms = self.app.get_url("/v3/OS-MOON/configuration/aggregation_algorithms", authtoken=True)
+        algorithms = self.app.get_url(self.app.url_prefix+"/configuration/aggregation_algorithms", authtoken=True)
         if algorithm_id in algorithms:
             return algorithms[algorithm_id]
         return dict()
@@ -76,7 +76,7 @@ class AggregationAlgorithmSet(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/aggregation_algorithm".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/aggregation_algorithm".format(
             parsed_args.intraextension),
             post_data={
                 "aggregation_algorithm_id": parsed_args.aggregation_algorithm_id,
@@ -104,19 +104,19 @@ class SubMetaRuleShow(Lister):
         return parser
 
     def __get_subject_category_name(self, intraextension, subject_category_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_categories".format(intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_categories".format(intraextension),
                                 authtoken=True)
         if subject_category_id in data:
             return data[subject_category_id]["name"]
 
     def __get_object_category_name(self, intraextension, object_category_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_categories".format(intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_categories".format(intraextension),
                                 authtoken=True)
         if object_category_id in data:
             return data[object_category_id]["name"]
 
     def __get_action_category_name(self, intraextension, action_category_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_categories".format(intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_categories".format(intraextension),
                                 authtoken=True)
         if action_category_id in data:
             return data[action_category_id]["name"]
@@ -124,7 +124,7 @@ class SubMetaRuleShow(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/sub_meta_rules".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/sub_meta_rules".format(parsed_args.intraextension),
                                 authtoken=True)
         return (
             ("id", "name", "algorithm", "subject categories", "object categories", "action categories"),
@@ -205,7 +205,7 @@ class SubMetaRuleSet(Command):
         post_data["sub_meta_rule_subject_categories"] = filter(lambda x: x, subject_category_id)
         post_data["sub_meta_rule_object_categories"] = filter(lambda x: x, object_category_id)
         post_data["sub_meta_rule_action_categories"] = filter(lambda x: x, action_category_id)
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/sub_meta_rules/{}".format(parsed_args.intraextension,
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/sub_meta_rules/{}".format(parsed_args.intraextension,
                                                                                     sub_meta_rule_id),
                          post_data=post_data,
                          method="POST",
index b5f8900..0942aa6 100644 (file)
@@ -34,7 +34,7 @@ class ObjectAssignmentsList(Lister):
         return parser
 
     def __get_scope_from_id(self, intraextension_id, object_category_id, object_scope_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_scopes/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_scopes/{}".format(
             intraextension_id, object_category_id),
             authtoken=True)
         if object_scope_id in data:
@@ -43,7 +43,7 @@ class ObjectAssignmentsList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_assignments/{}/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_assignments/{}/{}".format(
             parsed_args.intraextension, parsed_args.object_id, parsed_args.object_category_id),
             authtoken=True)
         return (
@@ -84,7 +84,7 @@ class ObjectAssignmentsAdd(Command):
         return parser
 
     def __get_scope_from_id(self, intraextension_id, object_category_id, object_scope_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_scopes/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_scopes/{}".format(
             intraextension_id, object_category_id),
             authtoken=True)
         if object_scope_id in data:
@@ -93,7 +93,7 @@ class ObjectAssignmentsAdd(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_assignments".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_assignments".format(parsed_args.intraextension),
                                 post_data={
                                     "object_id": parsed_args.object_id,
                                     "object_category_id": parsed_args.object_category_id,
@@ -139,7 +139,7 @@ class ObjectAssignmentsDelete(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_assignments/{}/{}/{}".format(
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_assignments/{}/{}/{}".format(
             parsed_args.intraextension,
             parsed_args.object_id,
             parsed_args.object_category_id,
index c86586f..5641f4b 100644 (file)
@@ -26,7 +26,7 @@ class ObjectCategoriesList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_categories".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_categories".format(parsed_args.intraextension),
                                 authtoken=True)
         return (
             ("id", "name", "description"),
@@ -61,7 +61,7 @@ class ObjectCategoriesAdd(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_categories".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_categories".format(parsed_args.intraextension),
                                 post_data={
                                     "object_category_name": parsed_args.object_category_name,
                                     "object_category_description": parsed_args.description},
@@ -94,7 +94,7 @@ class ObjectCategoriesDelete(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_categories/{}".format(
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_categories/{}".format(
             parsed_args.intraextension,
             parsed_args.object_category_id),
             method="DELETE",
index 0fbd757..41b9aef 100644 (file)
@@ -31,7 +31,7 @@ class ObjectScopesList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_scopes/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_scopes/{}".format(
             parsed_args.intraextension, parsed_args.object_category_id),
             authtoken=True)
         self.log.debug(data)  # TODO: why log here?
@@ -73,7 +73,7 @@ class ObjectScopesAdd(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_scopes/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_scopes/{}".format(
             parsed_args.intraextension, parsed_args.object_category_id),
             post_data={
                 "object_scope_name": parsed_args.object_scope_name,
@@ -113,7 +113,7 @@ class ObjectScopesDelete(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_scopes/{}/{}".format(
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_scopes/{}/{}".format(
             parsed_args.intraextension,
             parsed_args.object_category_id,
             parsed_args.object_scope_id
index 0f6fef0..0fc04ab 100644 (file)
@@ -26,7 +26,7 @@ class ObjectsList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/objects".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/objects".format(parsed_args.intraextension),
                                 authtoken=True)
         return (
             ("id", "name", "description"),
@@ -61,7 +61,7 @@ class ObjectsAdd(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/objects".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/objects".format(parsed_args.intraextension),
                                 post_data={
                                     "object_name": parsed_args.object_name,
                                     "object_description": parsed_args.description},
@@ -94,7 +94,7 @@ class ObjectsDelete(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/objects/{}".format(
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/objects/{}".format(
             parsed_args.intraextension,
             parsed_args.object_id),
             method="DELETE",
index 682c830..207533a 100644 (file)
@@ -30,39 +30,39 @@ class RulesList(Lister):
         return parser
 
     def __get_subject_category_name(self, intraextension, category_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_categories".format(intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_categories".format(intraextension),
                                 authtoken=True)
         if category_id in data:
             return data[category_id]["name"]
 
     def __get_object_category_name(self, intraextension, category_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_categories".format(intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_categories".format(intraextension),
                                 authtoken=True)
         if category_id in data:
             return data[category_id]["name"]
 
     def __get_action_category_name(self, intraextension, category_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_categories".format(intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_categories".format(intraextension),
                                 authtoken=True)
         if category_id in data:
             return data[category_id]["name"]
 
     def __get_subject_scope_name(self, intraextension, category_id, scope_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_scopes/{}".format(intraextension, category_id),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_scopes/{}".format(intraextension, category_id),
                                 authtoken=True)
         if scope_id in data:
             return data[scope_id]["name"]
         return scope_id
 
     def __get_object_scope_name(self, intraextension, category_id, scope_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_scopes/{}".format(intraextension, category_id),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_scopes/{}".format(intraextension, category_id),
                                 authtoken=True)
         if scope_id in data:
             return data[scope_id]["name"]
         return scope_id
 
     def __get_action_scope_name(self, intraextension, category_id, scope_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_scopes/{}".format(intraextension, category_id),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_scopes/{}".format(intraextension, category_id),
                                 authtoken=True)
         if scope_id in data:
             return data[scope_id]["name"]
@@ -72,7 +72,7 @@ class RulesList(Lister):
         headers = list()
         headers.append("")
         headers.append("id")
-        self.sub_meta_rules = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/sub_meta_rules".format(intraextension),
+        self.sub_meta_rules = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/sub_meta_rules".format(intraextension),
                                                authtoken=True)
         for cat in self.sub_meta_rules[submetarule_id]["subject_categories"]:
             headers.append("s:" + self.__get_subject_category_name(intraextension, cat))
@@ -105,7 +105,7 @@ class RulesList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/rule/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/rule/{}".format(
             parsed_args.intraextension,
             parsed_args.submetarule_id,
         ),
@@ -144,7 +144,7 @@ class RuleAdd(Command):
         return parser
 
     def __get_subject_scope_id(self, intraextension, category_id, scope_name):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_scopes/{}".format(intraextension, category_id),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_scopes/{}".format(intraextension, category_id),
                                 authtoken=True)
         self.log.debug("__get_subject_scope_id {}".format(data))
         for scope_id in data:
@@ -153,7 +153,7 @@ class RuleAdd(Command):
         return scope_name
 
     def __get_object_scope_id(self, intraextension, category_id, scope_name):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/object_scopes/{}".format(intraextension, category_id),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/object_scopes/{}".format(intraextension, category_id),
                                 authtoken=True)
         self.log.debug("__get_action_scope_id {}".format(data))
         for scope_id in data:
@@ -162,7 +162,7 @@ class RuleAdd(Command):
         return scope_name
 
     def __get_action_scope_id(self, intraextension, category_id, scope_name):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/action_scopes/{}".format(intraextension, category_id),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/action_scopes/{}".format(intraextension, category_id),
                                 authtoken=True)
         self.log.debug("__get_object_scope_id {}".format(data))
         for scope_id in data:
@@ -173,7 +173,7 @@ class RuleAdd(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.sub_meta_rules = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/sub_meta_rules".format(
+        self.sub_meta_rules = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/sub_meta_rules".format(
             parsed_args.intraextension),
             authtoken=True)
         new_rule = map(lambda x: x.strip(), parsed_args.rule.split(","))
@@ -198,7 +198,7 @@ class RuleAdd(Command):
             post["object_categories"].append(self.__get_object_scope_id(
                 parsed_args.intraextension, cat, new_rule.pop(0))
             )
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/rule/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/rule/{}".format(
             parsed_args.intraextension, parsed_args.submetarule_id),
             post_data=post,
             authtoken=True)
@@ -232,7 +232,7 @@ class RuleDelete(Command):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
         self.app.get_url(
-            "/v3/OS-MOON/intra_extensions/{intra_extensions_id}/rule/{submetarule_id}/{rule_id}".format(
+            self.app.url_prefix+"/intra_extensions/{intra_extensions_id}/rule/{submetarule_id}/{rule_id}".format(
                 intra_extensions_id=parsed_args.intraextension,
                 submetarule_id=parsed_args.submetarule_id,
                 rule_id=parsed_args.rule_id
index 1be1a42..ce2b010 100644 (file)
@@ -32,13 +32,14 @@ class MoonClient(App):
     log = logging.getLogger(__name__)
     x_subject_token = None
     host = "localhost"
-    port = "35357"
+    port = "35358"
     tenant = None
     _intraextension = None
     _tenant_id = None
     _tenant_name = None
     secureprotocol = False
     user_saving_file = ".moonclient"
+    url_prefix = "/moon"
     post = {
         "auth": {
             "identity": {
@@ -112,7 +113,7 @@ class MoonClient(App):
     def tenant_id(self):
         if not self._tenant_id:
             self._tenant_id = self.get_url("/v3/projects?name={}".format(self._tenant_name),
-                                           authtoken=True)["projects"][0]["id"]
+                                           authtoken=True, port=5000)["projects"][0]["id"]
         return self._tenant_id
 
     @property
@@ -129,16 +130,18 @@ class MoonClient(App):
         open(os.path.join(os.getenv('HOME'), self.user_saving_file), "w").write(value)
 
     def get_tenant_uuid(self, tenant_name):
-        return self.get_url("/v3/projects?name={}".format(tenant_name), authtoken=True)["projects"][0]["id"]
+        return self.get_url("/v3/projects?name={}".format(tenant_name), authtoken=True, port=5000)["projects"][0]["id"]
 
-    def get_url(self, url, post_data=None, delete_data=None, method="GET", authtoken=None):
+    def get_url(self, url, post_data=None, delete_data=None, method="GET", authtoken=None, port=None):
         if post_data:
             method = "POST"
         if delete_data:
             method = "DELETE"
         self.log.debug("\033[32m{} {}\033[m".format(method, url))
         # TODO: we must manage authentication and requests with secure protocol (ie. HTTPS)
-        conn = httplib.HTTPConnection(self.host, self.port)
+        if not port:
+            port = self.port
+        conn = httplib.HTTPConnection(self.host, port)
         self.log.debug("Host: {}:{}".format(self.host, self.port))
         headers = {
             "Content-type": "application/x-www-form-urlencoded",
index 5ca3129..ec5e954 100644 (file)
@@ -34,7 +34,7 @@ class SubjectAssignmentsList(Lister):
         return parser
 
     def __get_scope_from_id(self, intraextension_id, subject_category_id, subject_scope_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_scopes/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_scopes/{}".format(
             intraextension_id, subject_category_id),
             authtoken=True)
         if subject_scope_id in data:
@@ -43,7 +43,7 @@ class SubjectAssignmentsList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_assignments/{}/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_assignments/{}/{}".format(
             parsed_args.intraextension, parsed_args.subject_id, parsed_args.subject_category_id),
             authtoken=True)
         return (
@@ -84,7 +84,7 @@ class SubjectAssignmentsAdd(Command):
         return parser
 
     def __get_scope_from_id(self, intraextension_id, subject_category_id, subject_scope_id):
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_scopes/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_scopes/{}".format(
             intraextension_id, subject_category_id),
             authtoken=True)
         if subject_scope_id in data:
@@ -93,7 +93,7 @@ class SubjectAssignmentsAdd(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_assignments".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_assignments".format(parsed_args.intraextension),
                                 post_data={
                                     "subject_id": parsed_args.subject_id,
                                     "subject_category_id": parsed_args.subject_category_id,
@@ -139,7 +139,7 @@ class SubjectAssignmentsDelete(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_assignments/{}/{}/{}".format(
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_assignments/{}/{}/{}".format(
             parsed_args.intraextension,
             parsed_args.subject_id,
             parsed_args.subject_category_id,
index e7ecfe6..810b0b5 100644 (file)
@@ -26,7 +26,7 @@ class SubjectCategoriesList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_categories".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_categories".format(parsed_args.intraextension),
                                 authtoken=True)
         return (
             ("id", "name", "description"),
@@ -61,7 +61,7 @@ class SubjectCategoriesAdd(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_categories".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_categories".format(parsed_args.intraextension),
                                 post_data={
                                     "subject_category_name": parsed_args.subject_category_name,
                                     "subject_category_description": parsed_args.description},
@@ -94,7 +94,7 @@ class SubjectCategoriesDelete(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_categories/{}".format(
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_categories/{}".format(
             parsed_args.intraextension,
             parsed_args.subject_category_id),
             method="DELETE",
index f960a1d..90cc5dc 100644 (file)
@@ -31,7 +31,7 @@ class SubjectScopesList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_scopes/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_scopes/{}".format(
             parsed_args.intraextension,
             parsed_args.subject_category_id),
             authtoken=True)
@@ -73,7 +73,7 @@ class SubjectScopesAdd(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_scopes/{}".format(
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_scopes/{}".format(
             parsed_args.intraextension, parsed_args.subject_category_id),
             post_data={
                 "subject_scope_name": parsed_args.subject_scope_name,
@@ -113,7 +113,7 @@ class SubjectScopesDelete(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subject_scopes/{}/{}".format(
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subject_scopes/{}/{}".format(
             parsed_args.intraextension,
             parsed_args.subject_category_id,
             parsed_args.subject_scope_id
index 29ce745..8203cd9 100644 (file)
@@ -27,7 +27,7 @@ class SubjectsList(Lister):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subjects".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subjects".format(parsed_args.intraextension),
                                 authtoken=True)
         return (
             ("id", "name", "Keystone ID"),
@@ -74,7 +74,7 @@ class SubjectsAdd(Command):
             parsed_args.intraextension = self.app.intraextension
         if not parsed_args.password:
             parsed_args.password = getpass.getpass("Password for user {}:".format(parsed_args.subject_name))
-        data = self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subjects".format(parsed_args.intraextension),
+        data = self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subjects".format(parsed_args.intraextension),
                                 post_data={
                                     "subject_name": parsed_args.subject_name,
                                     "subject_description": parsed_args.description,
@@ -110,7 +110,7 @@ class SubjectsDelete(Command):
     def take_action(self, parsed_args):
         if not parsed_args.intraextension:
             parsed_args.intraextension = self.app.intraextension
-        self.app.get_url("/v3/OS-MOON/intra_extensions/{}/subjects/{}".format(
+        self.app.get_url(self.app.url_prefix+"/intra_extensions/{}/subjects/{}".format(
             parsed_args.intraextension,
             parsed_args.subject_id
             ),
index b2e0aaf..99c6e50 100644 (file)
@@ -19,7 +19,7 @@ class TenantList(Lister):
         return parser
 
     def take_action(self, parsed_args):
-        tenants = self.app.get_url("/v3/OS-MOON/tenants", authtoken=True)
+        tenants = self.app.get_url(self.app.url_prefix+"/tenants", authtoken=True)
         self.log.debug(tenants)
         return (
             ("id", "name", "description", "intra_authz_extension_id", "intra_admin_extension_id"),
@@ -72,7 +72,7 @@ class TenantAdd(Command):
             post_data["tenant_intra_admin_extension_id"] = parsed_args.admin
         if parsed_args.desc:
             post_data["tenant_description"] = parsed_args.desc
-        tenants = self.app.get_url("/v3/OS-MOON/tenants",
+        tenants = self.app.get_url(self.app.url_prefix+"/tenants",
                                    post_data=post_data,
                                    authtoken=True)
         return (
@@ -103,7 +103,7 @@ class TenantShow(Command):
         return parser
 
     def take_action(self, parsed_args):
-        tenants = self.app.get_url("/v3/OS-MOON/tenants/{}".format(parsed_args.tenant_name),
+        tenants = self.app.get_url(self.app.url_prefix+"/tenants/{}".format(parsed_args.tenant_name),
                                    authtoken=True)
         return (
             ("id", "name", "description", "intra_authz_extension_id", "intra_admin_extension_id"),
@@ -164,7 +164,7 @@ class TenantSet(Command):
             post_data["tenant_intra_admin_extension_id"] = parsed_args.admin
         if parsed_args.desc is not None:
             post_data["tenant_description"] = parsed_args.desc
-        tenants = self.app.get_url("/v3/OS-MOON/tenants/{}".format(post_data["tenant_id"]),
+        tenants = self.app.get_url(self.app.url_prefix+"/tenants/{}".format(post_data["tenant_id"]),
                                    post_data=post_data,
                                    authtoken=True)
         return (
@@ -195,6 +195,6 @@ class TenantDelete(Command):
         return parser
 
     def take_action(self, parsed_args):
-        self.app.get_url("/v3/OS-MOON/tenants/{}".format(parsed_args.tenant_id),
+        self.app.get_url(self.app.url_prefix+"/tenants/{}".format(parsed_args.tenant_id),
                          method="DELETE",
                          authtoken=True)