From aedb872e4f29b00d7658faccc0e664e00f2d2613 Mon Sep 17 00:00:00 2001 From: Slawek Kaplonski Date: Thu, 22 Feb 2024 10:06:58 +0100 Subject: [PATCH] Ensure that haproxy spawned by the metadata agents is active In both neutron-metadata and neutron-ovn-metadata agents we should ensure that haproxy service spawned for network/router is actually active before moving on. This patch adds that check and this is similar to what was already implemented some time ago for the dnsmasq process spawned by the dhcp agent. Conflicts: neutron/tests/unit/agent/dhcp/test_agent.py Related-Bug: #2052787 Change-Id: Ic58640d89952fa03bd1059608ee6c9072fbaabf5 (cherry picked from commit 2f7f7c2fc29d0ac26b5ff9d82867952a40f0fa1b) (cherry picked from commit 0dfe8dedd63aba2bf5b75ad8494b0ead4ba1b79f) --- neutron/agent/metadata/driver.py | 2 +- neutron/agent/ovn/metadata/driver.py | 2 +- neutron/tests/unit/agent/dhcp/test_agent.py | 3 ++- neutron/tests/unit/agent/metadata/test_driver.py | 7 ++++++- neutron/tests/unit/agent/ovn/metadata/test_driver.py | 7 ++++++- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/neutron/agent/metadata/driver.py b/neutron/agent/metadata/driver.py index 5f1d6190fee..4b5b5279a33 100644 --- a/neutron/agent/metadata/driver.py +++ b/neutron/agent/metadata/driver.py @@ -295,7 +295,7 @@ class MetadataDriver(object): ns_name=ns_name, callback=callback) try: - pm.enable() + pm.enable(ensure_active=True) except exceptions.ProcessExecutionError as exec_err: LOG.error("Encountered process execution error %(err)s while " "starting process in namespace %(ns)s", diff --git a/neutron/agent/ovn/metadata/driver.py b/neutron/agent/ovn/metadata/driver.py index 5b59635914f..56f302c80f6 100644 --- a/neutron/agent/ovn/metadata/driver.py +++ b/neutron/agent/ovn/metadata/driver.py @@ -206,7 +206,7 @@ class MetadataDriver(object): ns_name=ns_name, callback=callback) try: - pm.enable() + pm.enable(ensure_active=True) except exceptions.ProcessExecutionError as exec_err: LOG.error("Encountered process execution error %(err)s while " "starting process in namespace %(ns)s", diff --git a/neutron/tests/unit/agent/dhcp/test_agent.py b/neutron/tests/unit/agent/dhcp/test_agent.py index 7fa4b1dbd9b..44a88a9fc0f 100644 --- a/neutron/tests/unit/agent/dhcp/test_agent.py +++ b/neutron/tests/unit/agent/dhcp/test_agent.py @@ -637,6 +637,7 @@ class TestDhcpAgent(base.BaseTestCase): 'IpAddrCommand.wait_until_address_ready') as mock_wait: mock_wait.return_value = True dhcp = dhcp_agent.DhcpAgent(HOSTNAME) + dhcp.update_isolated_metadata_proxy = mock.Mock() self.assertEqual(set(), dhcp.dhcp_ready_ports) dhcp.configure_dhcp_for_network(fake_network) self.assertEqual({fake_port1.id}, dhcp.dhcp_ready_ports) @@ -834,7 +835,7 @@ class TestDhcpAgentEventHandler(base.BaseTestCase): process_instance.assert_has_calls([ mock.call.disable(sig=str(int(signal.SIGTERM))), mock.call.get_pid_file_name(), - mock.call.enable()]) + mock.call.enable(ensure_active=True)]) else: process_instance.assert_has_calls([ mock.call.disable(sig=str(int(signal.SIGTERM)))]) diff --git a/neutron/tests/unit/agent/metadata/test_driver.py b/neutron/tests/unit/agent/metadata/test_driver.py index aad6cf36a23..70e6f867758 100644 --- a/neutron/tests/unit/agent/metadata/test_driver.py +++ b/neutron/tests/unit/agent/metadata/test_driver.py @@ -168,7 +168,12 @@ class TestMetadataDriverProcess(base.BaseTestCase): 'IpAddrCommand.wait_until_address_ready') as mock_wait,\ mock.patch( 'neutron.agent.linux.ip_lib.' - 'delete_ip_address') as mock_del: + 'delete_ip_address') as mock_del,\ + mock.patch( + 'neutron.agent.linux.external_process.' + 'ProcessManager.active', + new_callable=mock.PropertyMock, + side_effect=[False, True]): agent = l3_agent.L3NATAgent('localhost') agent.process_monitor = mock.Mock() cfg_file = os.path.join( diff --git a/neutron/tests/unit/agent/ovn/metadata/test_driver.py b/neutron/tests/unit/agent/ovn/metadata/test_driver.py index c6c8227ed48..e790fdd7382 100644 --- a/neutron/tests/unit/agent/ovn/metadata/test_driver.py +++ b/neutron/tests/unit/agent/ovn/metadata/test_driver.py @@ -68,7 +68,12 @@ class TestMetadataDriverProcess(base.BaseTestCase): return_value=test_utils.FakeUser(self.EUNAME)),\ mock.patch('grp.getgrnam', return_value=test_utils.FakeGroup(self.EGNAME)),\ - mock.patch('os.makedirs'): + mock.patch('os.makedirs'),\ + mock.patch( + 'neutron.agent.linux.external_process.' + 'ProcessManager.active', + new_callable=mock.PropertyMock, + side_effect=[False, True]): cfg_file = os.path.join( metadata_driver.HaproxyConfigurator.get_config_path( cfg.CONF.state_path),