# 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()
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(),
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)
--- /dev/null
+#!/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)
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