diff --git a/neutron/cmd/eventlet/server/__init__.py b/neutron/cmd/eventlet/server/__init__.py index 01c3b52c1ec..f88d5ec92bb 100644 --- a/neutron/cmd/eventlet/server/__init__.py +++ b/neutron/cmd/eventlet/server/__init__.py @@ -10,14 +10,20 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron.server import rpc_eventlet from neutron.server import wsgi_eventlet from neutron.server import wsgi_pecan def main_wsgi_eventlet(): - # This also starts the RPC server wsgi_eventlet.main() +# Eventlet patching is not required for Pecan, but some plugins still spawn +# eventlet threads def main_wsgi_pecan(): wsgi_pecan.main() + + +def main_rpc_eventlet(): + rpc_eventlet.main() diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py index d5bcd550a7e..a4792bfcd56 100644 --- a/neutron/plugins/ml2/plugin.py +++ b/neutron/plugins/ml2/plugin.py @@ -146,17 +146,12 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, self.type_manager.initialize() self.extension_manager.initialize() self.mechanism_manager.initialize() - - self._setup_rpc() self._setup_dhcp() + self._start_rpc_notifiers() LOG.info(_LI("Modular L2 Plugin initialization complete")) def _setup_rpc(self): """Initialize components to support agent communication.""" - self.notifier = rpc.AgentNotifierApi(topics.AGENT) - self.agent_notifiers[const.AGENT_TYPE_DHCP] = ( - dhcp_rpc_agent_api.DhcpAgentNotifyAPI() - ) self.endpoints = [ rpc.RpcCallbacks(self.notifier, self.type_manager), securitygroups_rpc.SecurityGroupServerRpcCallback(), @@ -178,9 +173,18 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, def supported_qos_rule_types(self): return self.mechanism_manager.supported_qos_rule_types + @log_helpers.log_method_call + def _start_rpc_notifiers(self): + """Initialize RPC notifiers for agents.""" + self.notifier = rpc.AgentNotifierApi(topics.AGENT) + self.agent_notifiers[const.AGENT_TYPE_DHCP] = ( + dhcp_rpc_agent_api.DhcpAgentNotifyAPI() + ) + @log_helpers.log_method_call def start_rpc_listeners(self): """Start the RPC loop to let the plugin communicate with agents.""" + self._setup_rpc() self.topic = topics.PLUGIN self.conn = n_rpc.create_connection(new=True) self.conn.create_consumer(self.topic, self.endpoints, fanout=False) diff --git a/neutron/server/rpc_eventlet.py b/neutron/server/rpc_eventlet.py new file mode 100644 index 00000000000..218d009e0d5 --- /dev/null +++ b/neutron/server/rpc_eventlet.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +# Copyright 2011 VMware, Inc. +# All Rights Reserved. +# +# 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. + +# If ../neutron/__init__.py exists, add ../ to Python search path, so that +# it will override what happens to be installed in /usr/(local/)lib/python... + +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_rpc_server(): + pool = eventlet.GreenPool() + LOG.info(_LI("Eventlet based AMQP RPC server starting...")) + try: + neutron_rpc = service.serve_rpc() + except NotImplementedError: + LOG.info(_LI("RPC was already started in parent process by " + "plugin.")) + else: + pool.spawn(neutron_rpc.wait) + pool.waitall() + + +def main(): + server.boot_server(_eventlet_rpc_server) diff --git a/setup.cfg b/setup.cfg index 87480ad1123..69f554df99d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -95,6 +95,7 @@ console_scripts = 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-rpc-server = neutron.cmd.eventlet.server:main_rpc_eventlet neutron-rootwrap = oslo_rootwrap.cmd:main neutron-rootwrap-daemon = oslo_rootwrap.cmd:daemon neutron-usage-audit = neutron.cmd.usage_audit:main