From: Yuriy Nesenenko Date: Wed, 16 Dec 2015 14:22:46 +0000 (+0200) Subject: Move wsgi to oslo_service.wsgi X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=082235d31196cc87ef6ea1cd34e773d38de6eeaf;p=openstack-build%2Fcinder-build.git Move wsgi to oslo_service.wsgi This patch replaces wsgi with oslo_service.wsgi in service.py DocImpact Implements: blueprint reusing-wsgi-from-oslo.service Change-Id: Ib4c4bf9d78571d63c667753ea10dfea28ea6b866 --- diff --git a/cinder/service.py b/cinder/service.py index 66c015e21..549e2ef1f 100644 --- a/cinder/service.py +++ b/cinder/service.py @@ -29,6 +29,7 @@ from oslo_log import log as logging import oslo_messaging as messaging from oslo_service import loopingcall from oslo_service import service +from oslo_service import wsgi from oslo_utils import importutils import osprofiler.notifier from osprofiler import profiler @@ -41,8 +42,7 @@ from cinder import objects from cinder.objects import base as objects_base from cinder import rpc from cinder import version -from cinder.wsgi import common as wsgi_common -from cinder.wsgi import eventlet_server as wsgi + LOG = logging.getLogger(__name__) @@ -358,7 +358,7 @@ class WSGIService(service.ServiceBase): """ self.name = name self.manager = self._get_manager() - self.loader = loader or wsgi_common.Loader() + self.loader = loader or wsgi.Loader(CONF) self.app = self.loader.load_app(name) self.host = getattr(CONF, '%s_listen' % name, "0.0.0.0") self.port = getattr(CONF, '%s_listen_port' % name, 0) diff --git a/cinder/tests/unit/integrated/integrated_helpers.py b/cinder/tests/unit/integrated/integrated_helpers.py index bfbee797b..42661bf00 100644 --- a/cinder/tests/unit/integrated/integrated_helpers.py +++ b/cinder/tests/unit/integrated/integrated_helpers.py @@ -16,13 +16,14 @@ """ Provides common functionality for integrated unit tests """ - +import os.path import random import string import uuid import fixtures import mock +from oslo_config import cfg from oslo_log import log as logging from cinder import service @@ -30,6 +31,7 @@ from cinder import test # For the flags from cinder.tests.unit.integrated.api import client +CONF = cfg.CONF LOG = logging.getLogger(__name__) @@ -80,6 +82,10 @@ class _IntegratedTestBase(test.TestCase): self.api = client.TestOpenStackClient('fake', 'fake', self.auth_url) def _start_api_service(self): + default_conf = os.path.abspath(os.path.join( + os.path.dirname(__file__), '..', '..', '..', '..', + 'etc/cinder/api-paste.ini')) + CONF.api_paste_config = default_conf self.osapi = service.WSGIService("osapi_volume") self.osapi.start() # FIXME(ja): this is not the auth url - this is the service url diff --git a/cinder/tests/unit/integrated/test_volumes.py b/cinder/tests/unit/integrated/test_volumes.py index 6a83dd6fd..d9d548281 100644 --- a/cinder/tests/unit/integrated/test_volumes.py +++ b/cinder/tests/unit/integrated/test_volumes.py @@ -18,7 +18,6 @@ import time from oslo_log import log as logging import testtools -from cinder import service from cinder.tests.unit import fake_driver from cinder.tests.unit.integrated.api import client from cinder.tests.unit.integrated import integrated_helpers @@ -32,12 +31,6 @@ class VolumesTest(integrated_helpers._IntegratedTestBase): super(VolumesTest, self).setUp() fake_driver.LoggingVolumeDriver.clear_logs() - def _start_api_service(self): - self.osapi = service.WSGIService("osapi_volume") - self.osapi.start() - self.auth_url = 'http://%s:%s/v2' % (self.osapi.host, self.osapi.port) - LOG.warning(self.auth_url) - def _get_flags(self): f = super(VolumesTest, self)._get_flags() f['volume_driver'] = \ diff --git a/cinder/tests/unit/test_service.py b/cinder/tests/unit/test_service.py index ee8f02099..995d07bd1 100644 --- a/cinder/tests/unit/test_service.py +++ b/cinder/tests/unit/test_service.py @@ -32,7 +32,6 @@ from cinder import objects from cinder import rpc from cinder import service from cinder import test -from cinder.wsgi import common as wsgi test_service_opts = [ @@ -252,58 +251,60 @@ class TestWSGIService(test.TestCase): def setUp(self): super(TestWSGIService, self).setUp() - def test_service_random_port(self): - with mock.patch.object(wsgi.Loader, 'load_app') as mock_load_app: - test_service = service.WSGIService("test_service") - self.assertEqual(0, test_service.port) - test_service.start() - self.assertNotEqual(0, test_service.port) - test_service.stop() - self.assertTrue(mock_load_app.called) - - def test_reset_pool_size_to_default(self): - with mock.patch.object(wsgi.Loader, 'load_app') as mock_load_app: - test_service = service.WSGIService("test_service") - test_service.start() - - # Stopping the service, which in turn sets pool size to 0 - test_service.stop() - self.assertEqual(0, test_service.server._pool.size) - - # Resetting pool size to default - test_service.reset() - test_service.start() - self.assertEqual(1000, test_service.server._pool.size) - self.assertTrue(mock_load_app.called) - - @mock.patch('oslo_service.wsgi.Server') - def test_workers_set_default(self, wsgi_server): - self.override_config('osapi_volume_listen_port', 0) + @mock.patch('oslo_service.wsgi.Loader') + def test_service_random_port(self, mock_loader): + test_service = service.WSGIService("test_service") + self.assertEqual(0, test_service.port) + test_service.start() + self.assertNotEqual(0, test_service.port) + test_service.stop() + self.assertTrue(mock_loader.called) + + @mock.patch('oslo_service.wsgi.Loader') + def test_reset_pool_size_to_default(self, mock_loader): + test_service = service.WSGIService("test_service") + test_service.start() + + # Stopping the service, which in turn sets pool size to 0 + test_service.stop() + self.assertEqual(0, test_service.server._pool.size) + + # Resetting pool size to default + test_service.reset() + test_service.start() + self.assertEqual(1000, test_service.server._pool.size) + self.assertTrue(mock_loader.called) + + @mock.patch('oslo_service.wsgi.Loader') + def test_workers_set_default(self, mock_loader): test_service = service.WSGIService("osapi_volume") - self.assertEqual(processutils.get_worker_count(), test_service.workers) + self.assertEqual(processutils.get_worker_count(), + test_service.workers) + self.assertTrue(mock_loader.called) - @mock.patch('oslo_service.wsgi.Server') - def test_workers_set_good_user_setting(self, wsgi_server): - self.override_config('osapi_volume_listen_port', 0) + @mock.patch('oslo_service.wsgi.Loader') + def test_workers_set_good_user_setting(self, mock_loader): self.override_config('osapi_volume_workers', 8) test_service = service.WSGIService("osapi_volume") self.assertEqual(8, test_service.workers) + self.assertTrue(mock_loader.called) - @mock.patch('oslo_service.wsgi.Server') - def test_workers_set_zero_user_setting(self, wsgi_server): - self.override_config('osapi_volume_listen_port', 0) + @mock.patch('oslo_service.wsgi.Loader') + def test_workers_set_zero_user_setting(self, mock_loader): self.override_config('osapi_volume_workers', 0) test_service = service.WSGIService("osapi_volume") - # If a value less than 1 is used, defaults to number of procs available - self.assertEqual(processutils.get_worker_count(), test_service.workers) - - @mock.patch('oslo_service.wsgi.Server') - def test_workers_set_negative_user_setting(self, wsgi_server): + # If a value less than 1 is used, defaults to number of procs + # available + self.assertEqual(processutils.get_worker_count(), + test_service.workers) + self.assertTrue(mock_loader.called) + + @mock.patch('oslo_service.wsgi.Loader') + def test_workers_set_negative_user_setting(self, mock_loader): self.override_config('osapi_volume_workers', -1) self.assertRaises(exception.InvalidInput, - service.WSGIService, - "osapi_volume") - self.assertFalse(wsgi_server.called) + service.WSGIService, "osapi_volume") + self.assertTrue(mock_loader.called) class OSCompatibilityTestCase(test.TestCase): diff --git a/cinder/wsgi/common.py b/cinder/wsgi/common.py index 1e4eaf37d..4da4ffa0b 100644 --- a/cinder/wsgi/common.py +++ b/cinder/wsgi/common.py @@ -16,14 +16,10 @@ from oslo_config import cfg from oslo_log import log as logging -from oslo_service import wsgi -from paste import deploy import webob.dec import webob.exc -from cinder import exception -from cinder.i18n import _, _LE -from cinder import utils +from cinder.i18n import _ CONF = cfg.CONF LOG = logging.getLogger(__name__) @@ -159,32 +155,3 @@ class Middleware(Application): return response response = req.get_response(self.application) return self.process_response(response) - - -class Loader(object): - """Used to load WSGI applications from paste configurations.""" - - def __init__(self, config_path=None): - """Initialize the loader, and attempt to find the config. - - :param config_path: Full or relative path to the paste config. - :returns: None - - """ - wsgi.register_opts(CONF) # noqa - config_path = config_path or CONF.api_paste_config - self.config_path = utils.find_config(config_path) - - def load_app(self, name): - """Return the paste URLMap wrapped WSGI application. - - :param name: Name of the application to load. - :returns: Paste URLMap object wrapping the requested application. - :raises: `cinder.exception.PasteAppNotFound` - - """ - try: - return deploy.loadapp("config:%s" % self.config_path, name=name) - except LookupError: - LOG.exception(_LE("Error loading app %s"), name) - raise exception.PasteAppNotFound(name=name, path=self.config_path) diff --git a/cinder/wsgi/wsgi.py b/cinder/wsgi/wsgi.py index 966993d9c..2f8290521 100644 --- a/cinder/wsgi/wsgi.py +++ b/cinder/wsgi/wsgi.py @@ -22,6 +22,7 @@ warnings.simplefilter('once', DeprecationWarning) from oslo_config import cfg from oslo_log import log as logging +from oslo_service import wsgi from cinder import i18n i18n.enable_lazy() @@ -30,7 +31,6 @@ i18n.enable_lazy() from cinder.common import config # noqa from cinder import rpc from cinder import version -from cinder.wsgi import common as wsgi_common CONF = cfg.CONF @@ -42,4 +42,4 @@ def initialize_application(): logging.setup(CONF, "cinder") rpc.init(CONF) - return wsgi_common.Loader().load_app(name='osapi_volume') + return wsgi.Loader(CONF).load_app(name='osapi_volume')