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:
		@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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'] = \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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')
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user