From 8a3942d64a83d06aaaa23c1c3a0a9ad1e393f9c6 Mon Sep 17 00:00:00 2001 From: Adelina Tuvenie Date: Tue, 24 Mar 2015 03:06:21 -0700 Subject: [PATCH] Add eventlet monkey_patch helper Eventlet monkey patching the os and thread modules causes subprocess.Popen to fail on Windows when using pipes due to missing non-blocking IO support. There is an reported bug on eventlet [1] with this issue. The solution for this issue is to not monkey_patch os and thread. This change is needed in order to run ovs_neutron_agent on Windows platforms. [1] https://bitbucket.org/eventlet/eventlet/issue/132/eventletmonkey_patch-breaks Partially implements blueprint: hyper-v-ovs-agent Change-Id: I73f5dfc16563da2c09b5440a687484ba5a1fc2de --- neutron/cmd/eventlet/__init__.py | 5 +-- .../cmd/eventlet/plugins/ovs_neutron_agent.py | 20 ++++++++++++ neutron/common/eventlet_utils.py | 32 +++++++++++++++++++ .../openvswitch/agent/ovs_neutron_agent.py | 3 -- neutron/tests/__init__.py | 5 +-- setup.cfg | 2 +- 6 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 neutron/cmd/eventlet/plugins/ovs_neutron_agent.py create mode 100644 neutron/common/eventlet_utils.py diff --git a/neutron/cmd/eventlet/__init__.py b/neutron/cmd/eventlet/__init__.py index e8620504805..01f9f693363 100644 --- a/neutron/cmd/eventlet/__init__.py +++ b/neutron/cmd/eventlet/__init__.py @@ -10,5 +10,6 @@ # License for the specific language governing permissions and limitations # under the License. -import eventlet -eventlet.monkey_patch() +from neutron.common import eventlet_utils + +eventlet_utils.monkey_patch() diff --git a/neutron/cmd/eventlet/plugins/ovs_neutron_agent.py b/neutron/cmd/eventlet/plugins/ovs_neutron_agent.py new file mode 100644 index 00000000000..ef686f86c6c --- /dev/null +++ b/neutron/cmd/eventlet/plugins/ovs_neutron_agent.py @@ -0,0 +1,20 @@ +# Copyright (c) 2015 Cloudbase Solutions. +# 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. + +from neutron.plugins.openvswitch.agent import ovs_neutron_agent + + +def main(): + ovs_neutron_agent.main() diff --git a/neutron/common/eventlet_utils.py b/neutron/common/eventlet_utils.py new file mode 100644 index 00000000000..cf995d5a1e2 --- /dev/null +++ b/neutron/common/eventlet_utils.py @@ -0,0 +1,32 @@ +# Copyright (c) 2015 Cloudbase Solutions. +# 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. + +import os + +import eventlet + + +def monkey_patch(): + if os.name == 'nt': + # eventlet monkey patching the os and thread modules causes + # subprocess.Popen to fail on Windows when using pipes due + # to missing non-blocking IO support. + # + # bug report on eventlet: + # https://bitbucket.org/eventlet/eventlet/issue/132/ + # eventletmonkey_patch-breaks + eventlet.monkey_patch(os=False, thread=False) + else: + eventlet.monkey_patch() diff --git a/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py b/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py index 1a820de34d8..5bacef11404 100644 --- a/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py @@ -19,9 +19,6 @@ import signal import sys import time -import eventlet -eventlet.monkey_patch() - import netaddr from oslo_config import cfg from oslo_log import log as logging diff --git a/neutron/tests/__init__.py b/neutron/tests/__init__.py index bacc1911e8e..1850daaffa3 100644 --- a/neutron/tests/__init__.py +++ b/neutron/tests/__init__.py @@ -10,5 +10,6 @@ # License for the specific language governing permissions and limitations # under the License. -import eventlet -eventlet.monkey_patch() +from neutron.common import eventlet_utils + +eventlet_utils.monkey_patch() diff --git a/setup.cfg b/setup.cfg index 2c15a35309b..a9e1714931b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -104,7 +104,7 @@ console_scripts = neutron-netns-cleanup = neutron.cmd.netns_cleanup:main neutron-ns-metadata-proxy = neutron.cmd.eventlet.agents.metadata_proxy:main neutron-nvsd-agent = neutron.plugins.oneconvergence.agent.nvsd_neutron_agent:main - neutron-openvswitch-agent = neutron.plugins.openvswitch.agent.ovs_neutron_agent:main + neutron-openvswitch-agent = neutron.cmd.eventlet.plugins.ovs_neutron_agent:main neutron-ovs-cleanup = neutron.cmd.ovs_cleanup:main neutron-restproxy-agent = neutron.plugins.bigswitch.agent.restproxy_agent:main neutron-server = neutron.cmd.eventlet.server:main