From 38ffca6a9239d171f679936c7b66718507555265 Mon Sep 17 00:00:00 2001 From: Vitaly Gridnev Date: Fri, 10 Apr 2015 16:49:40 +0300 Subject: [PATCH] Support x-openstack-request-id This patch aims to support "x-openstack-request-id" for Sahara. Nova, Cinder and Neutron have realized "x-openstack-request-id" functionality. This functionality will enable effective log tracing. Change-Id: If0a0b10145d85eff811cdd2114f73494ae7e324a --- sahara/context.py | 6 +++++- sahara/main.py | 3 ++- sahara/service/periodic.py | 27 +++++++++++++++------------ sahara/utils/api.py | 6 ++++-- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/sahara/context.py b/sahara/context.py index c7cfef39..031a7005 100644 --- a/sahara/context.py +++ b/sahara/context.py @@ -45,6 +45,7 @@ class Context(context.RequestContext): auth_uri=None, resource_uuid=None, current_instance_info=None, + request_id=None, overwrite=True, **kwargs): if kwargs: @@ -55,7 +56,8 @@ class Context(context.RequestContext): user=user_id, tenant=tenant_id, is_admin=is_admin, - resource_uuid=resource_uuid) + resource_uuid=resource_uuid, + request_id=request_id) self.service_catalog = service_catalog self.username = username self.tenant_name = tenant_name @@ -88,6 +90,7 @@ class Context(context.RequestContext): self.auth_uri, self.resource_uuid, self.current_instance_info, + self.request_id, overwrite=False) def to_dict(self): @@ -102,6 +105,7 @@ class Context(context.RequestContext): 'roles': self.roles, 'auth_uri': self.auth_uri, 'resource_uuid': self.resource_uuid, + 'request_id': self.request_id, } def is_auth_capable(self): diff --git a/sahara/main.py b/sahara/main.py index 7b557609..b2336da7 100644 --- a/sahara/main.py +++ b/sahara/main.py @@ -18,6 +18,7 @@ import os import flask from oslo_config import cfg from oslo_log import log +from oslo_middleware import request_id import six import stevedore from werkzeug import exceptions as werkzeug_exceptions @@ -42,7 +43,6 @@ from sahara.utils import remote from sahara.utils import rpc as messaging from sahara.utils import wsgi - LOG = log.getLogger(__name__) @@ -157,6 +157,7 @@ def make_app(): app.wsgi_app = auth_valid.wrap(app.wsgi_app) app.wsgi_app = acl.wrap(app.wsgi_app) + app.wsgi_app = request_id.RequestId(app.wsgi_app) return app diff --git a/sahara/service/periodic.py b/sahara/service/periodic.py index e90c4340..4abe70c1 100644 --- a/sahara/service/periodic.py +++ b/sahara/service/periodic.py @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import functools import random from oslo_config import cfg @@ -108,6 +109,16 @@ def terminate_cluster(ctx, cluster, description): {'status': 'AwaitingTermination'}) +def set_context(func): + @functools.wraps(func) + def handler(self, ctx): + ctx = context.get_admin_context() + context.set_ctx(ctx) + func(self, ctx) + context.set_ctx(None) + return handler + + def _make_periodic_tasks(): '''Return the periodic tasks object @@ -119,18 +130,15 @@ def _make_periodic_tasks(): class SaharaPeriodicTasks(periodic_task.PeriodicTasks): @periodic_task.periodic_task(spacing=45, run_immediately=True) + @set_context def update_job_statuses(self, ctx): LOG.debug('Updating job statuses') - ctx = context.get_admin_context() - context.set_ctx(ctx) job_manager.update_job_statuses() - context.set_ctx(None) @periodic_task.periodic_task(spacing=90) + @set_context def terminate_unneeded_transient_clusters(self, ctx): LOG.debug('Terminating unneeded transient clusters') - ctx = context.get_admin_context() - context.set_ctx(ctx) for cluster in conductor.cluster_get_all(ctx, status='Active'): if not cluster.is_transient: continue @@ -149,12 +157,10 @@ def _make_periodic_tasks(): terminate_cluster(ctx, cluster, description='transient') # Add event log info cleanup context.ctx().current_instance_info = context.InstanceInfo() - context.set_ctx(None) @periodic_task.periodic_task(spacing=zombie_task_spacing) + @set_context def check_for_zombie_proxy_users(self, ctx): - ctx = context.get_admin_context() - context.set_ctx(ctx) for user in p.proxy_domain_users_list(): if user.name.startswith('job_'): je_id = user.name[4:] @@ -164,17 +170,15 @@ def _make_periodic_tasks(): LOG.debug('Found zombie proxy user {username}'.format( username=user.name)) p.proxy_user_delete(user_id=user.id) - context.set_ctx(None) @periodic_task.periodic_task(spacing=3600) + @set_context def terminate_incomplete_clusters(self, ctx): if CONF.cleanup_time_for_incomplete_clusters <= 0: return LOG.debug('Terminating old clusters in non-final state') - ctx = context.get_admin_context() - context.set_ctx(ctx) # NOTE(alazarev) Retrieving all clusters once in hour for now. # Criteria support need to be implemented in sahara db API to # have SQL filtering. @@ -189,7 +193,6 @@ def _make_periodic_tasks(): terminate_cluster(ctx, cluster, description='incomplete') # Add event log info cleanup context.ctx().current_instance_info = context.InstanceInfo() - context.set_ctx(None) return SaharaPeriodicTasks() diff --git a/sahara/utils/api.py b/sahara/utils/api.py index d3f90554..ca6cd27d 100644 --- a/sahara/utils/api.py +++ b/sahara/utils/api.py @@ -17,6 +17,7 @@ import traceback import flask from oslo_log import log as logging +from oslo_middleware import request_id as oslo_req_id from werkzeug import datastructures from sahara import context @@ -73,6 +74,7 @@ class Rest(flask.Blueprint): flask.request.status_code = status kwargs.pop("tenant_id") + req_id = flask.request.environ.get(oslo_req_id.ENV_REQUEST_ID) ctx = context.Context( flask.request.headers['X-User-Id'], flask.request.headers['X-Tenant-Id'], @@ -80,9 +82,9 @@ class Rest(flask.Blueprint): flask.request.headers['X-Service-Catalog'], flask.request.headers['X-User-Name'], flask.request.headers['X-Tenant-Name'], - flask.request.headers['X-Roles'].split(',')) + flask.request.headers['X-Roles'].split(','), + request_id=req_id) context.set_ctx(ctx) - if flask.request.method in ['POST', 'PUT']: kwargs['data'] = request_data()