From 32af674783c69c87d0feed622434c6839938a141 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. Related-Bug: #2052787 Change-Id: Ic58640d89952fa03bd1059608ee6c9072fbaabf5 (cherry picked from commit 2f7f7c2fc29d0ac26b5ff9d82867952a40f0fa1b) --- 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 b7b4d859942..44fb0ea8c48 100644 --- a/neutron/agent/metadata/driver.py +++ b/neutron/agent/metadata/driver.py @@ -279,7 +279,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 6553a622d11..f9a7438f0b1 100644 --- a/neutron/agent/ovn/metadata/driver.py +++ b/neutron/agent/ovn/metadata/driver.py @@ -192,7 +192,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 978a36b0f2d..7917a005858 100644 --- a/neutron/tests/unit/agent/dhcp/test_agent.py +++ b/neutron/tests/unit/agent/dhcp/test_agent.py @@ -658,6 +658,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) @@ -854,7 +855,7 @@ class TestDhcpAgentEventHandler(base.BaseTestCase): is_ovn_network): process_instance.assert_has_calls([ mock.call.disable(sig=str(int(signal.SIGTERM))), - 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 6399d548f8a..6dfaf5497f0 100644 --- a/neutron/tests/unit/agent/metadata/test_driver.py +++ b/neutron/tests/unit/agent/metadata/test_driver.py @@ -180,7 +180,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 964c070c354..799ee2b297a 100644 --- a/neutron/tests/unit/agent/ovn/metadata/test_driver.py +++ b/neutron/tests/unit/agent/ovn/metadata/test_driver.py @@ -94,7 +94,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),