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
This commit is contained in:
Yuriy Nesenenko
2015-12-16 16:22:46 +02:00
parent 1847abf0a5
commit 082235d311
6 changed files with 52 additions and 85 deletions

View File

@@ -29,6 +29,7 @@ from oslo_log import log as logging
import oslo_messaging as messaging import oslo_messaging as messaging
from oslo_service import loopingcall from oslo_service import loopingcall
from oslo_service import service from oslo_service import service
from oslo_service import wsgi
from oslo_utils import importutils from oslo_utils import importutils
import osprofiler.notifier import osprofiler.notifier
from osprofiler import profiler from osprofiler import profiler
@@ -41,8 +42,7 @@ from cinder import objects
from cinder.objects import base as objects_base from cinder.objects import base as objects_base
from cinder import rpc from cinder import rpc
from cinder import version from cinder import version
from cinder.wsgi import common as wsgi_common
from cinder.wsgi import eventlet_server as wsgi
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@@ -358,7 +358,7 @@ class WSGIService(service.ServiceBase):
""" """
self.name = name self.name = name
self.manager = self._get_manager() 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.app = self.loader.load_app(name)
self.host = getattr(CONF, '%s_listen' % name, "0.0.0.0") self.host = getattr(CONF, '%s_listen' % name, "0.0.0.0")
self.port = getattr(CONF, '%s_listen_port' % name, 0) self.port = getattr(CONF, '%s_listen_port' % name, 0)

View File

@@ -16,13 +16,14 @@
""" """
Provides common functionality for integrated unit tests Provides common functionality for integrated unit tests
""" """
import os.path
import random import random
import string import string
import uuid import uuid
import fixtures import fixtures
import mock import mock
from oslo_config import cfg
from oslo_log import log as logging from oslo_log import log as logging
from cinder import service from cinder import service
@@ -30,6 +31,7 @@ from cinder import test # For the flags
from cinder.tests.unit.integrated.api import client from cinder.tests.unit.integrated.api import client
CONF = cfg.CONF
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@@ -80,6 +82,10 @@ class _IntegratedTestBase(test.TestCase):
self.api = client.TestOpenStackClient('fake', 'fake', self.auth_url) self.api = client.TestOpenStackClient('fake', 'fake', self.auth_url)
def _start_api_service(self): 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 = service.WSGIService("osapi_volume")
self.osapi.start() self.osapi.start()
# FIXME(ja): this is not the auth url - this is the service url # FIXME(ja): this is not the auth url - this is the service url

View File

@@ -18,7 +18,6 @@ import time
from oslo_log import log as logging from oslo_log import log as logging
import testtools import testtools
from cinder import service
from cinder.tests.unit import fake_driver from cinder.tests.unit import fake_driver
from cinder.tests.unit.integrated.api import client from cinder.tests.unit.integrated.api import client
from cinder.tests.unit.integrated import integrated_helpers from cinder.tests.unit.integrated import integrated_helpers
@@ -32,12 +31,6 @@ class VolumesTest(integrated_helpers._IntegratedTestBase):
super(VolumesTest, self).setUp() super(VolumesTest, self).setUp()
fake_driver.LoggingVolumeDriver.clear_logs() 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): def _get_flags(self):
f = super(VolumesTest, self)._get_flags() f = super(VolumesTest, self)._get_flags()
f['volume_driver'] = \ f['volume_driver'] = \

View File

@@ -32,7 +32,6 @@ from cinder import objects
from cinder import rpc from cinder import rpc
from cinder import service from cinder import service
from cinder import test from cinder import test
from cinder.wsgi import common as wsgi
test_service_opts = [ test_service_opts = [
@@ -252,58 +251,60 @@ class TestWSGIService(test.TestCase):
def setUp(self): def setUp(self):
super(TestWSGIService, self).setUp() super(TestWSGIService, self).setUp()
def test_service_random_port(self): @mock.patch('oslo_service.wsgi.Loader')
with mock.patch.object(wsgi.Loader, 'load_app') as mock_load_app: def test_service_random_port(self, mock_loader):
test_service = service.WSGIService("test_service") test_service = service.WSGIService("test_service")
self.assertEqual(0, test_service.port) self.assertEqual(0, test_service.port)
test_service.start() test_service.start()
self.assertNotEqual(0, test_service.port) self.assertNotEqual(0, test_service.port)
test_service.stop() test_service.stop()
self.assertTrue(mock_load_app.called) self.assertTrue(mock_loader.called)
def test_reset_pool_size_to_default(self): @mock.patch('oslo_service.wsgi.Loader')
with mock.patch.object(wsgi.Loader, 'load_app') as mock_load_app: def test_reset_pool_size_to_default(self, mock_loader):
test_service = service.WSGIService("test_service") test_service = service.WSGIService("test_service")
test_service.start() test_service.start()
# Stopping the service, which in turn sets pool size to 0 # Stopping the service, which in turn sets pool size to 0
test_service.stop() test_service.stop()
self.assertEqual(0, test_service.server._pool.size) self.assertEqual(0, test_service.server._pool.size)
# Resetting pool size to default # Resetting pool size to default
test_service.reset() test_service.reset()
test_service.start() test_service.start()
self.assertEqual(1000, test_service.server._pool.size) self.assertEqual(1000, test_service.server._pool.size)
self.assertTrue(mock_load_app.called) self.assertTrue(mock_loader.called)
@mock.patch('oslo_service.wsgi.Server') @mock.patch('oslo_service.wsgi.Loader')
def test_workers_set_default(self, wsgi_server): def test_workers_set_default(self, mock_loader):
self.override_config('osapi_volume_listen_port', 0)
test_service = service.WSGIService("osapi_volume") 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') @mock.patch('oslo_service.wsgi.Loader')
def test_workers_set_good_user_setting(self, wsgi_server): def test_workers_set_good_user_setting(self, mock_loader):
self.override_config('osapi_volume_listen_port', 0)
self.override_config('osapi_volume_workers', 8) self.override_config('osapi_volume_workers', 8)
test_service = service.WSGIService("osapi_volume") test_service = service.WSGIService("osapi_volume")
self.assertEqual(8, test_service.workers) self.assertEqual(8, test_service.workers)
self.assertTrue(mock_loader.called)
@mock.patch('oslo_service.wsgi.Server') @mock.patch('oslo_service.wsgi.Loader')
def test_workers_set_zero_user_setting(self, wsgi_server): def test_workers_set_zero_user_setting(self, mock_loader):
self.override_config('osapi_volume_listen_port', 0)
self.override_config('osapi_volume_workers', 0) self.override_config('osapi_volume_workers', 0)
test_service = service.WSGIService("osapi_volume") test_service = service.WSGIService("osapi_volume")
# If a value less than 1 is used, defaults to number of procs available # If a value less than 1 is used, defaults to number of procs
self.assertEqual(processutils.get_worker_count(), test_service.workers) # available
self.assertEqual(processutils.get_worker_count(),
test_service.workers)
self.assertTrue(mock_loader.called)
@mock.patch('oslo_service.wsgi.Server') @mock.patch('oslo_service.wsgi.Loader')
def test_workers_set_negative_user_setting(self, wsgi_server): def test_workers_set_negative_user_setting(self, mock_loader):
self.override_config('osapi_volume_workers', -1) self.override_config('osapi_volume_workers', -1)
self.assertRaises(exception.InvalidInput, self.assertRaises(exception.InvalidInput,
service.WSGIService, service.WSGIService, "osapi_volume")
"osapi_volume") self.assertTrue(mock_loader.called)
self.assertFalse(wsgi_server.called)
class OSCompatibilityTestCase(test.TestCase): class OSCompatibilityTestCase(test.TestCase):

View File

@@ -16,14 +16,10 @@
from oslo_config import cfg from oslo_config import cfg
from oslo_log import log as logging from oslo_log import log as logging
from oslo_service import wsgi
from paste import deploy
import webob.dec import webob.dec
import webob.exc import webob.exc
from cinder import exception from cinder.i18n import _
from cinder.i18n import _, _LE
from cinder import utils
CONF = cfg.CONF CONF = cfg.CONF
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@@ -159,32 +155,3 @@ class Middleware(Application):
return response return response
response = req.get_response(self.application) response = req.get_response(self.application)
return self.process_response(response) 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)

View File

@@ -22,6 +22,7 @@ warnings.simplefilter('once', DeprecationWarning)
from oslo_config import cfg from oslo_config import cfg
from oslo_log import log as logging from oslo_log import log as logging
from oslo_service import wsgi
from cinder import i18n from cinder import i18n
i18n.enable_lazy() i18n.enable_lazy()
@@ -30,7 +31,6 @@ i18n.enable_lazy()
from cinder.common import config # noqa from cinder.common import config # noqa
from cinder import rpc from cinder import rpc
from cinder import version from cinder import version
from cinder.wsgi import common as wsgi_common
CONF = cfg.CONF CONF = cfg.CONF
@@ -42,4 +42,4 @@ def initialize_application():
logging.setup(CONF, "cinder") logging.setup(CONF, "cinder")
rpc.init(CONF) rpc.init(CONF)
return wsgi_common.Loader().load_app(name='osapi_volume') return wsgi.Loader(CONF).load_app(name='osapi_volume')