Revert "Pecan WSGI: prevent plugins from opening AMQP connections"

This reverts commit 2ba2456f9d
because it has a conflict with upstream commit
9f6bd17703. We need to merge
master into pecan with this reverted and then revert the revert
and resolve the conflict there so we don't have any conflict
resolutions in merge commits.

Change-Id: I22388de076cbd90da33502249e101749e019e0cb
This commit is contained in:
Kevin Benton 2015-09-16 03:02:49 -07:00
parent d4ca8b521c
commit 4f1fb05959
6 changed files with 29 additions and 146 deletions

View File

@ -10,14 +10,8 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron.server import wsgi_eventlet
from neutron.server import wsgi_pecan
from neutron import server
def main_wsgi_eventlet():
# This also starts the RPC server
wsgi_eventlet.main()
def main_wsgi_pecan():
wsgi_pecan.main()
def main():
server.main()

View File

@ -47,12 +47,6 @@ TRANSPORT_ALIASES = {
'neutron.rpc.impl_zmq': 'zmq',
}
# NOTE(salv-orlando): I am afraid this is a global variable. While not ideal,
# they're however widely used throughout the code base. It should be set to
# true if the RPC server is not running in the current process space. This
# will prevent get_connection from creating connections to the AMQP server
RPC_DISABLED = False
def init(conf):
global TRANSPORT, NOTIFIER
@ -207,25 +201,6 @@ class Connection(object):
server.wait()
class VoidConnection(object):
def create_consumer(self, topic, endpoints, fanout=False):
pass
def consume_in_threads(self):
pass
def close(self):
pass
# functions
def create_connection(new=True):
# NOTE(salv-orlando): This is a clever interpreation of the factory design
# patter aimed at preventing plugins from initializing RPC servers upon
# initialization when they are running in the REST over HTTP API server.
# The educated reader will perfectly be able that this a fairly dirty hack
# to avoid having to change the initialization process of every plugin.
if RPC_DISABLED:
return VoidConnection()
return Connection()

View File

@ -18,21 +18,43 @@
import sys
import eventlet
from oslo_config import cfg
from oslo_log import log as logging
from neutron.common import config
from neutron.i18n import _LI
from neutron import service
LOG = logging.getLogger(__name__)
def boot_server(server_func):
def main():
# the configuration will be read into the cfg.CONF global data structure
config.init(sys.argv[1:])
config.setup_logging()
if not cfg.CONF.config_file:
sys.exit(_("ERROR: Unable to find configuration file via the default"
" search paths (~/.neutron/, ~/, /etc/neutron/, /etc/) and"
" the '--config-file' option!"))
try:
server_func()
pool = eventlet.GreenPool()
neutron_api = service.serve_wsgi(service.NeutronApiService)
api_thread = pool.spawn(neutron_api.wait)
try:
neutron_rpc = service.serve_rpc()
except NotImplementedError:
LOG.info(_LI("RPC was already started in parent process by "
"plugin."))
else:
rpc_thread = pool.spawn(neutron_rpc.wait)
# api and rpc should die together. When one dies, kill the other.
rpc_thread.link(lambda gt: api_thread.kill())
api_thread.link(lambda gt: rpc_thread.kill())
pool.waitall()
except KeyboardInterrupt:
pass
except RuntimeError as e:

View File

@ -1,47 +0,0 @@
#!/usr/bin/env python
# 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 eventlet
from oslo_log import log
from neutron.i18n import _LI
from neutron import server
from neutron import service
LOG = log.getLogger(__name__)
def _eventlet_wsgi_server():
pool = eventlet.GreenPool()
neutron_api = service.serve_wsgi(service.NeutronApiService)
api_thread = pool.spawn(neutron_api.wait)
try:
neutron_rpc = service.serve_rpc()
except NotImplementedError:
LOG.info(_LI("RPC was already started in parent process by "
"plugin."))
else:
rpc_thread = pool.spawn(neutron_rpc.wait)
# api and rpc should die together. When one dies, kill the other.
rpc_thread.link(lambda gt: api_thread.kill())
api_thread.link(lambda gt: rpc_thread.kill())
pool.waitall()
def main():
server.boot_server(_eventlet_wsgi_server)

View File

@ -1,60 +0,0 @@
#!/usr/bin/env python
# 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 logging as std_logging
from wsgiref import simple_server
from oslo_config import cfg
from oslo_log import log
from six.moves import socketserver
from neutron.common import rpc as n_rpc
from neutron.i18n import _LI, _LW
from neutron.pecan_wsgi import app as pecan_app
from neutron import server
LOG = log.getLogger(__name__)
class ThreadedSimpleServer(socketserver.ThreadingMixIn,
simple_server.WSGIServer):
pass
def _pecan_wsgi_server():
LOG.info(_LI("Pecan WSGI server starting..."))
# No AMQP connection should be created within this process
n_rpc.RPC_DISABLED = True
application = pecan_app.setup_app()
host = cfg.CONF.bind_host
port = cfg.CONF.bind_port
wsgi = simple_server.make_server(
host,
port,
application,
server_class=ThreadedSimpleServer
)
# Log option values
cfg.CONF.log_opt_values(LOG, std_logging.DEBUG)
LOG.warning(
_LW("Development Server Serving on http://%(host)s:%(port)s"),
{'host': host, 'port': port}
)
wsgi.serve_forever()
def main():
server.boot_server(_pecan_wsgi_server)

View File

@ -95,8 +95,7 @@ console_scripts =
neutron-ovs-cleanup = neutron.cmd.ovs_cleanup:main
neutron-pd-notify = neutron.cmd.pd_notify:main
neutron-restproxy-agent = neutron.plugins.bigswitch.agent.restproxy_agent:main
neutron-server = neutron.cmd.eventlet.server:main_wsgi_eventlet
neutron-dev-server = neutron.cmd.eventlet.server:main_wsgi_pecan
neutron-server = neutron.cmd.eventlet.server:main
neutron-rootwrap = oslo_rootwrap.cmd:main
neutron-rootwrap-daemon = oslo_rootwrap.cmd:daemon
neutron-usage-audit = neutron.cmd.usage_audit:main