From 774b519342532acadb4429670b399376ac462a56 Mon Sep 17 00:00:00 2001 From: Masahito Muroi Date: Fri, 17 Nov 2017 16:28:20 +0900 Subject: [PATCH] Move wsgi app class to api directory This commit moves the wsgi application class from cmd/api.py to api/app.py. This enables admins to deploy blazar-api via WSGI. It is good to place the class outside of the cmd directory. Partially Implements: blueprint deploy-api-in-wsgi Change-Id: I4305ead55995ca04aeae34c4c489e4865391f8a1 --- blazar/api/app.py | 59 +++++++++++++++++++++++ blazar/cmd/api.py | 45 +---------------- blazar/tests/api/test_version_selector.py | 2 +- 3 files changed, 62 insertions(+), 44 deletions(-) create mode 100644 blazar/api/app.py diff --git a/blazar/api/app.py b/blazar/api/app.py new file mode 100644 index 00000000..ae172615 --- /dev/null +++ b/blazar/api/app.py @@ -0,0 +1,59 @@ +# Copyright (c) 2017 NTT Inc. +# +# 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. + +import json + +from blazar.api.v1 import app as v1_app +from blazar.api.v2 import app as v2_app + + +class VersionSelectorApplication(object): + """Maps WSGI versioned apps and defines default WSGI app.""" + + def __init__(self): + self._status = '' + self._response_headers = [] + self.v1 = v1_app.make_app() + self.v2 = v2_app.make_app() + + def _append_versions_from_app(self, versions, app, environ): + tmp_versions = app(environ, self.internal_start_response) + if self._status.startswith("300"): + tmp_versions = json.loads("".join(tmp_versions)) + versions['versions'].extend(tmp_versions['versions']) + + def internal_start_response(self, status, response_headers, exc_info=None): + self._status = status + self._response_headers = response_headers + + def __call__(self, environ, start_response): + self._status = '' + self._response_headers = [] + + if environ['PATH_INFO'] == '/' or environ['PATH_INFO'] == '/versions': + versions = {'versions': []} + self._append_versions_from_app(versions, self.v1, environ) + self._append_versions_from_app(versions, self.v2, environ) + if len(versions['versions']): + start_response("300 Multiple Choices", + [("Content-Type", "application/json")]) + return [json.dumps(versions)] + else: + start_response("204 No Content", []) + return [] + else: + if environ['PATH_INFO'].startswith('/v1'): + return self.v1(environ, start_response) + return self.v2(environ, start_response) diff --git a/blazar/cmd/api.py b/blazar/cmd/api.py index 5d9e3a1a..1b719b8c 100644 --- a/blazar/cmd/api.py +++ b/blazar/cmd/api.py @@ -18,7 +18,6 @@ eventlet.monkey_patch( os=True, select=True, socket=True, thread=True, time=True) import gettext -import json import sys from eventlet import wsgi @@ -27,7 +26,7 @@ from oslo_log import log as logging gettext.install('blazar') -from blazar.api.v1 import app as v1_app +from blazar.api import app as wsgi_app from blazar.api.v2 import app as v2_app from blazar.utils import service as service_utils @@ -52,46 +51,6 @@ CONF.register_opts(api_opts) CONF.import_opt('host', 'blazar.config') -class VersionSelectorApplication(object): - """Maps WSGI versioned apps and defines default WSGI app.""" - - def __init__(self): - self._status = '' - self._response_headers = [] - self.v1 = v1_app.make_app() - self.v2 = v2_app.make_app() - - def _append_versions_from_app(self, versions, app, environ): - tmp_versions = app(environ, self.internal_start_response) - if self._status.startswith("300"): - tmp_versions = json.loads("".join(tmp_versions)) - versions['versions'].extend(tmp_versions['versions']) - - def internal_start_response(self, status, response_headers, exc_info=None): - self._status = status - self._response_headers = response_headers - - def __call__(self, environ, start_response): - self._status = '' - self._response_headers = [] - - if environ['PATH_INFO'] == '/' or environ['PATH_INFO'] == '/versions': - versions = {'versions': []} - self._append_versions_from_app(versions, self.v1, environ) - self._append_versions_from_app(versions, self.v2, environ) - if len(versions['versions']): - start_response("300 Multiple Choices", - [("Content-Type", "application/json")]) - return [json.dumps(versions)] - else: - start_response("204 No Content", []) - return [] - else: - if environ['PATH_INFO'].startswith('/v1'): - return self.v1(environ, start_response) - return self.v2(environ, start_response) - - def main(): """Entry point to start Blazar API wsgi server.""" cfg.CONF(sys.argv[1:], project='blazar', prog='blazar-api') @@ -99,7 +58,7 @@ def main(): if not CONF.enable_v1_api: app = v2_app.make_app() else: - app = VersionSelectorApplication() + app = wsgi_app.VersionSelectorApplication() wsgi.server(eventlet.listen((CONF.host, CONF.port), backlog=500), app) diff --git a/blazar/tests/api/test_version_selector.py b/blazar/tests/api/test_version_selector.py index b9bdefcb..10361e54 100644 --- a/blazar/tests/api/test_version_selector.py +++ b/blazar/tests/api/test_version_selector.py @@ -15,9 +15,9 @@ import json +from blazar.api import app as api from blazar.api.v1 import app as v1_app from blazar.api.v2 import app as v2_app -from blazar.cmd import api from blazar import tests