From a4d6fed1206847969dc8ca5095b09fdd367ebf38 Mon Sep 17 00:00:00 2001 From: Kamil Sambor Date: Mon, 25 Aug 2025 11:58:39 +0200 Subject: [PATCH] [hacking] Improve N373 to catch also other primitives Currently, it also catches semaphores, timeouts, and event-related items. Change-Id: Ibdaf6a107fbc7678fe514005ff1ea8bc5b8031c8 Signed-off-by: Kamil Sambor --- nova/hacking/checks.py | 8 ++++++++ nova/tests/unit/test_hacking.py | 14 ++++++++++++++ nova/tests/unit/virt/libvirt/test_host.py | 9 +++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/nova/hacking/checks.py b/nova/hacking/checks.py index 8b6b971496..9f33a724d4 100644 --- a/nova/hacking/checks.py +++ b/nova/hacking/checks.py @@ -146,6 +146,9 @@ set_daemon_re = re.compile(r"\.setDaemon\(") eventlet_stdlib_primitives_re = re.compile( r".*(eventlet|greenthread)\.sleep\(.*") eventlet_yield_re = re.compile(r".*time\.sleep\(0\).*") +eventlet_primitives_re = re.compile( + r".*(eventlet)\.(semaphore|timeout|event).*" + r"|from\s+eventlet\s+import\s+(semaphore|timeout|event)") class BaseASTChecker(ast.NodeVisitor): @@ -1120,6 +1123,11 @@ def check_eventlet_primitives(logical_line, filename): if match: yield (0, msg) + match = re.match(eventlet_primitives_re, logical_line) + + if match: + yield (0, msg) + @core.flake8ext def check_eventlet_yield(logical_line, filename): diff --git a/nova/tests/unit/test_hacking.py b/nova/tests/unit/test_hacking.py index e9a88423ad..9560035ce5 100644 --- a/nova/tests/unit/test_hacking.py +++ b/nova/tests/unit/test_hacking.py @@ -1074,6 +1074,20 @@ class HackingTestCase(test.NoDBTestCase): code, checks.check_eventlet_primitives, expected_errors=errors) code = """ + from eventlet import timeout + from eventlet import event + eventlet.event.Event + eventlet.timeout.Timeout(deadline) + eventlet.semaphore.Semaphore(3) + eventlet.semaphore.BoundedSemaphore(2) + """ + errors = [(x + 1, 0, 'N373') for x in range(6)] + self._assert_has_errors( + code, checks.check_eventlet_primitives, expected_errors=errors) + + code = """ + threading.Semaphore(value=1) + threading.Event() time.sleep(0) time.sleep(1) """ diff --git a/nova/tests/unit/virt/libvirt/test_host.py b/nova/tests/unit/virt/libvirt/test_host.py index cb86c9a851..eda6bea52b 100644 --- a/nova/tests/unit/virt/libvirt/test_host.py +++ b/nova/tests/unit/virt/libvirt/test_host.py @@ -27,6 +27,7 @@ from oslo_utils import uuidutils from oslo_utils import versionutils import testtools +from nova.compute import manager from nova.compute import vm_states from nova import exception from nova import objects @@ -459,8 +460,12 @@ class HostTestCase(test.NoDBTestCase): @mock.patch.object(host.Host, "_connect") def test_conn_event_thread(self, mock_conn): - event = eventlet.event.Event() - h = host.Host("qemu:///system", conn_event_handler=event.send) + event = manager.ThreadingEventWithResult() + + # This emulates LibvirtDriver._handle_conn_event + def conn_event_handler(*args, **kwargs): + event.set() + h = host.Host("qemu:///system", conn_event_handler=conn_event_handler) h.initialize() h.get_connection()