Remove eventlet usage
This entirely removes the eventlet usage. We do not monkey patch anything anymore. As far as messaging is concerned, what's used now is the threading executor. Change-Id: I42416e05671ef766ca2a8b326d84e7664e14de7d
This commit is contained in:
parent
64e46b5840
commit
bb870f861a
@ -14,13 +14,6 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
# This must be set before the initial import of eventlet because if
|
|
||||||
# dnspython is present in your environment then eventlet monkeypatches
|
|
||||||
# socket.getaddrinfo() with an implementation which doesn't work for IPv6.
|
|
||||||
import os
|
|
||||||
|
|
||||||
os.environ['EVENTLET_NO_GREENDNS'] = 'yes'
|
|
||||||
|
|
||||||
|
|
||||||
class NotImplementedError(NotImplementedError):
|
class NotImplementedError(NotImplementedError):
|
||||||
# FIXME(jd) This is used by WSME to return a correct HTTP code. We should
|
# FIXME(jd) This is used by WSME to return a correct HTTP code. We should
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
# -*- encoding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Copyright 2014 OpenStack Foundation
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
# NOTE(jd) We need to monkey patch the socket and select module for,
|
|
||||||
# at least, oslo.messaging, otherwise everything's blocked on its
|
|
||||||
# first read() or select(), thread need to be patched too, because
|
|
||||||
# oslo.messaging use threading.local
|
|
||||||
eventlet.monkey_patch(socket=True, select=True, thread=True, time=True)
|
|
@ -50,7 +50,7 @@ def get_rpc_server(conf, transport, topic, endpoint):
|
|||||||
serializer = oslo_serializer.RequestContextSerializer(
|
serializer = oslo_serializer.RequestContextSerializer(
|
||||||
oslo_serializer.JsonPayloadSerializer())
|
oslo_serializer.JsonPayloadSerializer())
|
||||||
return oslo_messaging.get_rpc_server(transport, target,
|
return oslo_messaging.get_rpc_server(transport, target,
|
||||||
[endpoint], executor='eventlet',
|
[endpoint], executor='threading',
|
||||||
serializer=serializer)
|
serializer=serializer)
|
||||||
|
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ def get_notification_listener(transport, targets, endpoints,
|
|||||||
allow_requeue=False):
|
allow_requeue=False):
|
||||||
"""Return a configured oslo_messaging notification listener."""
|
"""Return a configured oslo_messaging notification listener."""
|
||||||
return oslo_messaging.get_notification_listener(
|
return oslo_messaging.get_notification_listener(
|
||||||
transport, targets, endpoints, executor='eventlet',
|
transport, targets, endpoints, executor='threading',
|
||||||
allow_requeue=allow_requeue)
|
allow_requeue=allow_requeue)
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
"""Rest alarm notifier."""
|
"""Rest alarm notifier."""
|
||||||
|
|
||||||
import eventlet
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from oslo_context import context
|
from oslo_context import context
|
||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
@ -102,4 +101,4 @@ class RestAlarmNotifier(notifier.AlarmNotifier):
|
|||||||
session = requests.Session()
|
session = requests.Session()
|
||||||
session.mount(action.geturl(),
|
session.mount(action.geturl(),
|
||||||
requests.adapters.HTTPAdapter(max_retries=max_retries))
|
requests.adapters.HTTPAdapter(max_retries=max_retries))
|
||||||
eventlet.spawn_n(session.post, action.geturl(), **kwargs)
|
session.post(action.geturl(), **kwargs)
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
import functools
|
import functools
|
||||||
import os.path
|
import os.path
|
||||||
|
|
||||||
import eventlet
|
|
||||||
import oslo_messaging.conffixture
|
import oslo_messaging.conffixture
|
||||||
from oslo_utils import timeutils
|
from oslo_utils import timeutils
|
||||||
from oslotest import base
|
from oslotest import base
|
||||||
@ -39,11 +38,6 @@ class BaseTestCase(base.BaseTestCase):
|
|||||||
exchange = 'aodh'
|
exchange = 'aodh'
|
||||||
conf.set_override("control_exchange", exchange)
|
conf.set_override("control_exchange", exchange)
|
||||||
|
|
||||||
# NOTE(sileht): oslo.messaging fake driver uses time.sleep
|
|
||||||
# for task switch, so we need to monkey_patch it
|
|
||||||
# and also ensure the correct exchange have been set
|
|
||||||
eventlet.monkey_patch(time=True, thread=True)
|
|
||||||
|
|
||||||
# NOTE(sileht): Ensure a new oslo.messaging driver is loaded
|
# NOTE(sileht): Ensure a new oslo.messaging driver is loaded
|
||||||
# between each tests
|
# between each tests
|
||||||
self.transport = messaging.get_transport(conf, "fake://", cache=False)
|
self.transport = messaging.get_transport(conf, "fake://", cache=False)
|
||||||
|
@ -95,10 +95,6 @@ class TestAlarmNotifier(tests_base.BaseTestCase):
|
|||||||
'alarm_id': 'foobar',
|
'alarm_id': 'foobar',
|
||||||
'condition': {'threshold': 42}})
|
'condition': {'threshold': 42}})
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _fake_spawn_n(func, *args, **kwargs):
|
|
||||||
func(*args, **kwargs)
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _notification(action):
|
def _notification(action):
|
||||||
notification = {}
|
notification = {}
|
||||||
@ -115,15 +111,14 @@ class TestAlarmNotifier(tests_base.BaseTestCase):
|
|||||||
def test_notify_alarm_rest_action_ok(self):
|
def test_notify_alarm_rest_action_ok(self):
|
||||||
action = 'http://host/action'
|
action = 'http://host/action'
|
||||||
|
|
||||||
with mock.patch('eventlet.spawn_n', self._fake_spawn_n):
|
with mock.patch.object(requests.Session, 'post') as poster:
|
||||||
with mock.patch.object(requests.Session, 'post') as poster:
|
self.service.notify_alarm(context.get_admin_context(),
|
||||||
self.service.notify_alarm(context.get_admin_context(),
|
self._notification(action))
|
||||||
self._notification(action))
|
poster.assert_called_with(action, data=mock.ANY,
|
||||||
poster.assert_called_with(action, data=mock.ANY,
|
headers=mock.ANY)
|
||||||
headers=mock.ANY)
|
args, kwargs = poster.call_args
|
||||||
args, kwargs = poster.call_args
|
self.assertEqual(self.HTTP_HEADERS, kwargs['headers'])
|
||||||
self.assertEqual(self.HTTP_HEADERS, kwargs['headers'])
|
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
||||||
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
|
||||||
|
|
||||||
def test_notify_alarm_rest_action_with_ssl_client_cert(self):
|
def test_notify_alarm_rest_action_with_ssl_client_cert(self):
|
||||||
action = 'https://host/action'
|
action = 'https://host/action'
|
||||||
@ -131,16 +126,15 @@ class TestAlarmNotifier(tests_base.BaseTestCase):
|
|||||||
|
|
||||||
self.CONF.set_override("rest_notifier_certificate_file", certificate)
|
self.CONF.set_override("rest_notifier_certificate_file", certificate)
|
||||||
|
|
||||||
with mock.patch('eventlet.spawn_n', self._fake_spawn_n):
|
with mock.patch.object(requests.Session, 'post') as poster:
|
||||||
with mock.patch.object(requests.Session, 'post') as poster:
|
self.service.notify_alarm(context.get_admin_context(),
|
||||||
self.service.notify_alarm(context.get_admin_context(),
|
self._notification(action))
|
||||||
self._notification(action))
|
poster.assert_called_with(action, data=mock.ANY,
|
||||||
poster.assert_called_with(action, data=mock.ANY,
|
headers=mock.ANY,
|
||||||
headers=mock.ANY,
|
cert=certificate, verify=True)
|
||||||
cert=certificate, verify=True)
|
args, kwargs = poster.call_args
|
||||||
args, kwargs = poster.call_args
|
self.assertEqual(self.HTTP_HEADERS, kwargs['headers'])
|
||||||
self.assertEqual(self.HTTP_HEADERS, kwargs['headers'])
|
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
||||||
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
|
||||||
|
|
||||||
def test_notify_alarm_rest_action_with_ssl_client_cert_and_key(self):
|
def test_notify_alarm_rest_action_with_ssl_client_cert_and_key(self):
|
||||||
action = 'https://host/action'
|
action = 'https://host/action'
|
||||||
@ -150,62 +144,58 @@ class TestAlarmNotifier(tests_base.BaseTestCase):
|
|||||||
self.CONF.set_override("rest_notifier_certificate_file", certificate)
|
self.CONF.set_override("rest_notifier_certificate_file", certificate)
|
||||||
self.CONF.set_override("rest_notifier_certificate_key", key)
|
self.CONF.set_override("rest_notifier_certificate_key", key)
|
||||||
|
|
||||||
with mock.patch('eventlet.spawn_n', self._fake_spawn_n):
|
with mock.patch.object(requests.Session, 'post') as poster:
|
||||||
with mock.patch.object(requests.Session, 'post') as poster:
|
self.service.notify_alarm(context.get_admin_context(),
|
||||||
self.service.notify_alarm(context.get_admin_context(),
|
self._notification(action))
|
||||||
self._notification(action))
|
poster.assert_called_with(action, data=mock.ANY,
|
||||||
poster.assert_called_with(action, data=mock.ANY,
|
headers=mock.ANY,
|
||||||
headers=mock.ANY,
|
cert=(certificate, key), verify=True)
|
||||||
cert=(certificate, key), verify=True)
|
args, kwargs = poster.call_args
|
||||||
args, kwargs = poster.call_args
|
self.assertEqual(self.HTTP_HEADERS, kwargs['headers'])
|
||||||
self.assertEqual(self.HTTP_HEADERS, kwargs['headers'])
|
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
||||||
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
|
||||||
|
|
||||||
def test_notify_alarm_rest_action_with_ssl_verify_disable_by_cfg(self):
|
def test_notify_alarm_rest_action_with_ssl_verify_disable_by_cfg(self):
|
||||||
action = 'https://host/action'
|
action = 'https://host/action'
|
||||||
|
|
||||||
self.CONF.set_override("rest_notifier_ssl_verify", False)
|
self.CONF.set_override("rest_notifier_ssl_verify", False)
|
||||||
|
|
||||||
with mock.patch('eventlet.spawn_n', self._fake_spawn_n):
|
with mock.patch.object(requests.Session, 'post') as poster:
|
||||||
with mock.patch.object(requests.Session, 'post') as poster:
|
self.service.notify_alarm(context.get_admin_context(),
|
||||||
self.service.notify_alarm(context.get_admin_context(),
|
self._notification(action))
|
||||||
self._notification(action))
|
poster.assert_called_with(action, data=mock.ANY,
|
||||||
poster.assert_called_with(action, data=mock.ANY,
|
headers=mock.ANY,
|
||||||
headers=mock.ANY,
|
verify=False)
|
||||||
verify=False)
|
args, kwargs = poster.call_args
|
||||||
args, kwargs = poster.call_args
|
self.assertEqual(self.HTTP_HEADERS, kwargs['headers'])
|
||||||
self.assertEqual(self.HTTP_HEADERS, kwargs['headers'])
|
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
||||||
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
|
||||||
|
|
||||||
def test_notify_alarm_rest_action_with_ssl_verify_disable(self):
|
def test_notify_alarm_rest_action_with_ssl_verify_disable(self):
|
||||||
action = 'https://host/action?aodh-alarm-ssl-verify=0'
|
action = 'https://host/action?aodh-alarm-ssl-verify=0'
|
||||||
|
|
||||||
with mock.patch('eventlet.spawn_n', self._fake_spawn_n):
|
with mock.patch.object(requests.Session, 'post') as poster:
|
||||||
with mock.patch.object(requests.Session, 'post') as poster:
|
self.service.notify_alarm(context.get_admin_context(),
|
||||||
self.service.notify_alarm(context.get_admin_context(),
|
self._notification(action))
|
||||||
self._notification(action))
|
poster.assert_called_with(action, data=mock.ANY,
|
||||||
poster.assert_called_with(action, data=mock.ANY,
|
headers=mock.ANY,
|
||||||
headers=mock.ANY,
|
verify=False)
|
||||||
verify=False)
|
args, kwargs = poster.call_args
|
||||||
args, kwargs = poster.call_args
|
self.assertEqual(self.HTTP_HEADERS, kwargs['headers'])
|
||||||
self.assertEqual(self.HTTP_HEADERS, kwargs['headers'])
|
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
||||||
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
|
||||||
|
|
||||||
def test_notify_alarm_rest_action_with_ssl_verify_enable_by_user(self):
|
def test_notify_alarm_rest_action_with_ssl_verify_enable_by_user(self):
|
||||||
action = 'https://host/action?aodh-alarm-ssl-verify=1'
|
action = 'https://host/action?aodh-alarm-ssl-verify=1'
|
||||||
|
|
||||||
self.CONF.set_override("rest_notifier_ssl_verify", False)
|
self.CONF.set_override("rest_notifier_ssl_verify", False)
|
||||||
|
|
||||||
with mock.patch('eventlet.spawn_n', self._fake_spawn_n):
|
with mock.patch.object(requests.Session, 'post') as poster:
|
||||||
with mock.patch.object(requests.Session, 'post') as poster:
|
self.service.notify_alarm(context.get_admin_context(),
|
||||||
self.service.notify_alarm(context.get_admin_context(),
|
self._notification(action))
|
||||||
self._notification(action))
|
poster.assert_called_with(action, data=mock.ANY,
|
||||||
poster.assert_called_with(action, data=mock.ANY,
|
headers=mock.ANY,
|
||||||
headers=mock.ANY,
|
verify=True)
|
||||||
verify=True)
|
args, kwargs = poster.call_args
|
||||||
args, kwargs = poster.call_args
|
self.assertEqual(self.HTTP_HEADERS, kwargs['headers'])
|
||||||
self.assertEqual(self.HTTP_HEADERS, kwargs['headers'])
|
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
||||||
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _fake_urlsplit(*args, **kwargs):
|
def _fake_urlsplit(*args, **kwargs):
|
||||||
@ -249,14 +239,13 @@ class TestAlarmNotifier(tests_base.BaseTestCase):
|
|||||||
self.useFixture(mockpatch.Patch('keystoneclient.v3.client.Client',
|
self.useFixture(mockpatch.Patch('keystoneclient.v3.client.Client',
|
||||||
lambda **kwargs: client))
|
lambda **kwargs: client))
|
||||||
|
|
||||||
with mock.patch('eventlet.spawn_n', self._fake_spawn_n):
|
with mock.patch.object(requests.Session, 'post') as poster:
|
||||||
with mock.patch.object(requests.Session, 'post') as poster:
|
self.service.notify_alarm(context.get_admin_context(),
|
||||||
self.service.notify_alarm(context.get_admin_context(),
|
self._notification(action))
|
||||||
self._notification(action))
|
headers = {'X-Auth-Token': 'token_1234'}
|
||||||
headers = {'X-Auth-Token': 'token_1234'}
|
headers.update(self.HTTP_HEADERS)
|
||||||
headers.update(self.HTTP_HEADERS)
|
poster.assert_called_with(
|
||||||
poster.assert_called_with(
|
url, data=mock.ANY, headers=mock.ANY)
|
||||||
url, data=mock.ANY, headers=mock.ANY)
|
args, kwargs = poster.call_args
|
||||||
args, kwargs = poster.call_args
|
self.assertEqual(headers, kwargs['headers'])
|
||||||
self.assertEqual(headers, kwargs['headers'])
|
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
||||||
self.assertEqual(DATA_JSON, jsonutils.loads(kwargs['data']))
|
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
alembic>=0.7.2
|
alembic>=0.7.2
|
||||||
retrying!=1.3.0,>=1.2.3 # Apache-2.0
|
retrying!=1.3.0,>=1.2.3 # Apache-2.0
|
||||||
croniter>=0.3.4 # MIT License
|
croniter>=0.3.4 # MIT License
|
||||||
eventlet>=0.17.4
|
|
||||||
jsonschema!=2.5.0,<3.0.0,>=2.0.0
|
jsonschema!=2.5.0,<3.0.0,>=2.0.0
|
||||||
keystonemiddleware>=2.2.0
|
keystonemiddleware>=2.2.0
|
||||||
lxml>=2.3
|
lxml>=2.3
|
||||||
|
10
setup.cfg
10
setup.cfg
@ -60,11 +60,11 @@ aodh.notifier =
|
|||||||
|
|
||||||
console_scripts =
|
console_scripts =
|
||||||
aodh-api = aodh.cmd.api:main
|
aodh-api = aodh.cmd.api:main
|
||||||
aodh-dbsync = aodh.cmd.eventlet.storage:dbsync
|
aodh-dbsync = aodh.cmd.storage:dbsync
|
||||||
aodh-expirer = aodh.cmd.eventlet.storage:expirer
|
aodh-expirer = aodh.cmd.storage:expirer
|
||||||
aodh-evaluator = aodh.cmd.eventlet.alarm:evaluator
|
aodh-evaluator = aodh.cmd.alarm:evaluator
|
||||||
aodh-notifier = aodh.cmd.eventlet.alarm:notifier
|
aodh-notifier = aodh.cmd.alarm:notifier
|
||||||
aodh-listener = aodh.cmd.eventlet.alarm:listener
|
aodh-listener = aodh.cmd.alarm:listener
|
||||||
|
|
||||||
oslo.config.opts =
|
oslo.config.opts =
|
||||||
aodh = aodh.opts:list_opts
|
aodh = aodh.opts:list_opts
|
||||||
|
2
tox.ini
2
tox.ini
@ -9,7 +9,6 @@ deps = -r{toxinidir}/requirements.txt
|
|||||||
install_command = pip install -U {opts} {packages}
|
install_command = pip install -U {opts} {packages}
|
||||||
usedevelop = True
|
usedevelop = True
|
||||||
setenv = VIRTUAL_ENV={envdir}
|
setenv = VIRTUAL_ENV={envdir}
|
||||||
EVENTLET_NO_GREENDNS=yes
|
|
||||||
OS_TEST_PATH=aodh/tests/unit
|
OS_TEST_PATH=aodh/tests/unit
|
||||||
passenv = OS_TEST_TIMEOUT OS_STDOUT_CAPTURE OS_STDERR_CAPTURE OS_LOG_CAPTURE
|
passenv = OS_TEST_TIMEOUT OS_STDOUT_CAPTURE OS_STDERR_CAPTURE OS_LOG_CAPTURE
|
||||||
commands =
|
commands =
|
||||||
@ -38,7 +37,6 @@ commands =
|
|||||||
|
|
||||||
[testenv:functional]
|
[testenv:functional]
|
||||||
setenv = VIRTUAL_ENV={envdir}
|
setenv = VIRTUAL_ENV={envdir}
|
||||||
EVENTLET_NO_GREENDNS=yes
|
|
||||||
OS_TEST_PATH=aodh/tests/functional/
|
OS_TEST_PATH=aodh/tests/functional/
|
||||||
GABBI_LIVE_FAIL_IF_NO_TEST=1
|
GABBI_LIVE_FAIL_IF_NO_TEST=1
|
||||||
passenv = {[testenv]passenv} AODH_*
|
passenv = {[testenv]passenv} AODH_*
|
||||||
|
Loading…
Reference in New Issue
Block a user