From 2666141707937039f2e1d2b31e1805c9cbd39a1a Mon Sep 17 00:00:00 2001 From: Rodolfo Alonso Hernandez Date: Thu, 21 Mar 2019 16:19:32 +0000 Subject: [PATCH] Check master/backup router status in DVR functional tests When two routers are created at the same time, we can't assume the status of each one. Instead of this, the status of each router is first checked and then compared to the other router status. Change-Id: If20a3a414986ea29fbfd50616761c14e5b249b2c Closes-Bug: #1819160 (cherry picked from commit 8f35331c918f83381951fc4367f43b2805d556ef) --- .../tests/functional/agent/l3/framework.py | 16 +++-- .../functional/agent/l3/test_dvr_router.py | 67 ++++++++++--------- 2 files changed, 44 insertions(+), 39 deletions(-) diff --git a/neutron/tests/functional/agent/l3/framework.py b/neutron/tests/functional/agent/l3/framework.py index a86c8c3aca5..734aee1e063 100644 --- a/neutron/tests/functional/agent/l3/framework.py +++ b/neutron/tests/functional/agent/l3/framework.py @@ -614,26 +614,30 @@ class L3AgentTestFramework(base.BaseSudoTestCase): return (router1, router2) - def _get_master_and_slave_routers(self, router1, router2): + def _get_master_and_slave_routers(self, router1, router2, + check_external_device=True): try: common_utils.wait_until_true( lambda: router1.ha_state == 'master') - common_utils.wait_until_true( - lambda: self._check_external_device(router1)) + if check_external_device: + common_utils.wait_until_true( + lambda: self._check_external_device(router1)) master_router = router1 slave_router = router2 except common_utils.WaitTimeout: common_utils.wait_until_true( lambda: router2.ha_state == 'master') - common_utils.wait_until_true( - lambda: self._check_external_device(router2)) + if check_external_device: + common_utils.wait_until_true( + lambda: self._check_external_device(router2)) master_router = router2 slave_router = router1 common_utils.wait_until_true( lambda: master_router.ha_state == 'master') - common_utils.wait_until_true( + if check_external_device: + common_utils.wait_until_true( lambda: self._check_external_device(master_router)) common_utils.wait_until_true( lambda: slave_router.ha_state == 'backup') diff --git a/neutron/tests/functional/agent/l3/test_dvr_router.py b/neutron/tests/functional/agent/l3/test_dvr_router.py index 2b9e986dfb5..03f02396620 100644 --- a/neutron/tests/functional/agent/l3/test_dvr_router.py +++ b/neutron/tests/functional/agent/l3/test_dvr_router.py @@ -1477,33 +1477,34 @@ class TestDvrRouter(framework.L3AgentTestFramework): router2 = self._create_dvr_ha_router( self.failover_agent, enable_gw=True) - utils.wait_until_true(lambda: router1.ha_state == 'master') - utils.wait_until_true(lambda: router2.ha_state == 'backup') + master, backup = self._get_master_and_slave_routers( + router1, router2, check_external_device=False) - self._assert_ip_addresses_in_dvr_ha_snat_namespace(router1) - self._assert_no_ip_addresses_in_dvr_ha_snat_namespace(router2) - router1_ha_device = router1.get_ha_device_name() - router2_ha_device = router2.get_ha_device_name() + self._assert_ip_addresses_in_dvr_ha_snat_namespace(master) + self._assert_no_ip_addresses_in_dvr_ha_snat_namespace(backup) + master_ha_device = master.get_ha_device_name() + backup_ha_device = backup.get_ha_device_name() self.assertTrue( - ip_lib.device_exists(router1_ha_device, router1.ha_namespace)) + ip_lib.device_exists(master_ha_device, master.ha_namespace)) self.assertTrue( - ip_lib.device_exists(router2_ha_device, router2.ha_namespace)) + ip_lib.device_exists(backup_ha_device, backup.ha_namespace)) - router1.router['_ha_interface'] = None - self.agent._process_updated_router(router1.router) - router_updated = self.agent.router_info[router1.router_id] + new_master_router = copy.deepcopy(master.router) + new_master_router['_ha_interface'] = None + self.agent._process_updated_router(new_master_router) + router_updated = self.agent.router_info[master.router_id] self.assertTrue(self._namespace_exists(router_updated.ns_name)) self._assert_snat_namespace_exists(router_updated) snat_namespace_name = dvr_snat_ns.SnatNamespace.get_snat_ns_name( router_updated.router_id) self.assertFalse( - ip_lib.device_exists(router1_ha_device, snat_namespace_name)) + ip_lib.device_exists(master_ha_device, snat_namespace_name)) - utils.wait_until_true(lambda: router2.ha_state == 'master') - self._assert_ip_addresses_in_dvr_ha_snat_namespace(router2) + utils.wait_until_true(lambda: backup.ha_state == 'master') + self._assert_ip_addresses_in_dvr_ha_snat_namespace(backup) self.assertTrue( - ip_lib.device_exists(router2_ha_device, router2.ha_namespace)) + ip_lib.device_exists(backup_ha_device, backup.ha_namespace)) def _test_dvr_ha_router_failover_with_gw_and_fip(self, enable_gw, enable_centralized_fip, @@ -1519,18 +1520,18 @@ class TestDvrRouter(framework.L3AgentTestFramework): self.failover_agent, enable_gw=enable_gw, enable_centralized_fip=enable_centralized_fip, snat_bound_fip=snat_bound_fip) - utils.wait_until_true(lambda: router1.ha_state == 'master') - utils.wait_until_true(lambda: router2.ha_state == 'backup') + master, backup = self._get_master_and_slave_routers( + router1, router2, check_external_device=False) - self._assert_ip_addresses_in_dvr_ha_snat_namespace_with_fip(router1) - self._assert_no_ip_addresses_in_dvr_ha_snat_namespace_with_fip(router2) - self.fail_ha_router(router1) + self._assert_ip_addresses_in_dvr_ha_snat_namespace_with_fip(master) + self._assert_no_ip_addresses_in_dvr_ha_snat_namespace_with_fip(backup) + self.fail_ha_router(master) - utils.wait_until_true(lambda: router2.ha_state == 'master') - utils.wait_until_true(lambda: router1.ha_state == 'backup') + utils.wait_until_true(lambda: backup.ha_state == 'master') + utils.wait_until_true(lambda: master.ha_state == 'backup') - self._assert_ip_addresses_in_dvr_ha_snat_namespace_with_fip(router2) - self._assert_no_ip_addresses_in_dvr_ha_snat_namespace_with_fip(router1) + self._assert_ip_addresses_in_dvr_ha_snat_namespace_with_fip(backup) + self._assert_no_ip_addresses_in_dvr_ha_snat_namespace_with_fip(master) def _test_dvr_ha_router_failover(self, enable_gw): self._setup_dvr_ha_agents() @@ -1539,19 +1540,19 @@ class TestDvrRouter(framework.L3AgentTestFramework): router1 = self._create_dvr_ha_router(self.agent, enable_gw=enable_gw) router2 = self._create_dvr_ha_router(self.failover_agent, enable_gw) - utils.wait_until_true(lambda: router1.ha_state == 'master') - utils.wait_until_true(lambda: router2.ha_state == 'backup') + master, backup = self._get_master_and_slave_routers( + router1, router2, check_external_device=False) - self._assert_ip_addresses_in_dvr_ha_snat_namespace(router1) - self._assert_no_ip_addresses_in_dvr_ha_snat_namespace(router2) + self._assert_ip_addresses_in_dvr_ha_snat_namespace(master) + self._assert_no_ip_addresses_in_dvr_ha_snat_namespace(backup) - self.fail_ha_router(router1) + self.fail_ha_router(master) - utils.wait_until_true(lambda: router2.ha_state == 'master') - utils.wait_until_true(lambda: router1.ha_state == 'backup') + utils.wait_until_true(lambda: backup.ha_state == 'master') + utils.wait_until_true(lambda: master.ha_state == 'backup') - self._assert_ip_addresses_in_dvr_ha_snat_namespace(router2) - self._assert_no_ip_addresses_in_dvr_ha_snat_namespace(router1) + self._assert_ip_addresses_in_dvr_ha_snat_namespace(backup) + self._assert_no_ip_addresses_in_dvr_ha_snat_namespace(master) @test_base.unstable_test("bug 1819160") def test_dvr_ha_router_failover_with_gw(self):