summaryrefslogtreecommitdiffstats
path: root/cyborg_enhancement/mitaka_version/cyborg/cyborg/api/hooks.py
diff options
context:
space:
mode:
Diffstat (limited to 'cyborg_enhancement/mitaka_version/cyborg/cyborg/api/hooks.py')
-rw-r--r--cyborg_enhancement/mitaka_version/cyborg/cyborg/api/hooks.py112
1 files changed, 112 insertions, 0 deletions
diff --git a/cyborg_enhancement/mitaka_version/cyborg/cyborg/api/hooks.py b/cyborg_enhancement/mitaka_version/cyborg/cyborg/api/hooks.py
new file mode 100644
index 0000000..6793982
--- /dev/null
+++ b/cyborg_enhancement/mitaka_version/cyborg/cyborg/api/hooks.py
@@ -0,0 +1,112 @@
+# Copyright 2017 Huawei Technologies Co.,LTD.
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from oslo_config import cfg
+from oslo_context import context
+from pecan import hooks
+
+from cyborg.common import policy
+from cyborg.conductor import rpcapi
+
+
+class ConfigHook(hooks.PecanHook):
+ """Attach the config object to the request so controllers can get to it."""
+
+ def before(self, state):
+ state.request.cfg = cfg.CONF
+
+
+class PublicUrlHook(hooks.PecanHook):
+ """Attach the right public_url to the request.
+
+ Attach the right public_url to the request so resources can create
+ links even when the API service is behind a proxy or SSL terminator.
+ """
+
+ def before(self, state):
+ state.request.public_url = (
+ cfg.CONF.api.public_endpoint or state.request.host_url)
+
+
+class ConductorAPIHook(hooks.PecanHook):
+ """Attach the conductor_api object to the request."""
+
+ def __init__(self):
+ self.conductor_api = rpcapi.ConductorAPI()
+
+ def before(self, state):
+ state.request.conductor_api = self.conductor_api
+
+
+class ContextHook(hooks.PecanHook):
+ """Configures a request context and attaches it to the request.
+
+ The following HTTP request headers are used:
+
+ X-User-Id or X-User:
+ Used for context.user.
+
+ X-Tenant-Id or X-Tenant:
+ Used for context.tenant.
+
+ X-Auth-Token:
+ Used for context.auth_token.
+
+ X-Roles:
+ Used for setting context.is_admin flag to either True or False.
+ The flag is set to True, if X-Roles contains either an administrator
+ or admin substring. Otherwise it is set to False.
+
+ """
+
+ def __init__(self, public_api_routes):
+ self.public_api_routes = public_api_routes
+ super(ContextHook, self).__init__()
+
+ def before(self, state):
+ headers = state.request.headers
+ '''
+ creds = {
+ 'user_name': headers.get('X-User-Name'),
+ 'user': headers.get('X-User-Id'),
+ 'project_name': headers.get('X-Project-Name'),
+ 'tenant': headers.get('X-Project-Id'),
+ 'domain': headers.get('X-User-Domain-Id'),
+ 'domain_name': headers.get('X-User-Domain-Name'),
+ 'auth_token': headers.get('X-Auth-Token'),
+ 'roles': headers.get('X-Roles', '').split(','),
+ }'''
+
+ creds = {
+ 'user': headers.get('X-User-Id'),
+ 'tenant': headers.get('X-Project-Id'),
+ 'domain': headers.get('X-User-Domain-Id',''),
+ 'auth_token': headers.get('X-Auth-Token'),
+ 'roles': headers.get('X-Roles', '').split(','),
+ }
+
+
+ is_admin = policy.authorize('is_admin', creds, creds)
+ state.request.context = context.RequestContext(
+ is_admin=is_admin, **creds)
+
+ def after(self, state):
+ if state.request.context == {}:
+ # An incorrect url path will not create RequestContext
+ return
+ # RequestContext will generate a request_id if no one
+ # passing outside, so it always contain a request_id.
+ request_id = state.request.context.request_id
+ state.response.headers['Openstack-Request-Id'] = request_id