diff --git a/tobiko/tests/scenario/neutron/test_trunk.py b/tobiko/tests/scenario/neutron/test_trunk.py index eff4174c3..f80acf79f 100644 --- a/tobiko/tests/scenario/neutron/test_trunk.py +++ b/tobiko/tests/scenario/neutron/test_trunk.py @@ -21,7 +21,9 @@ import testtools import tobiko from tobiko import config from tobiko.openstack import neutron +from tobiko.openstack import nova from tobiko.openstack import stacks +from tobiko.shell import ip CONF = config.CONF @@ -29,31 +31,59 @@ LOG = log.getLogger(__name__) class RebootTrunkServerStackFixture(stacks.UbuntuServerStackFixture): - pass + + def validate_created_stack(self): + # (fressi) must wait cloud init to complete Nova + # server setup before shutting it down so that we ensure all + # network devices gets persistent after reboots + stack = super().validate_created_stack() + nova.activate_server(server=self.server_id) + self.wait_for_cloud_init_done() + return stack @neutron.skip_if_missing_networking_extensions('trunk') class RebootTrunkTest(testtools.TestCase): """Tests trunk functionality""" - stack = tobiko.required_fixture(RebootTrunkServerStackFixture) + stack: RebootTrunkServerStackFixture = tobiko.required_fixture( + RebootTrunkServerStackFixture) - def setUp(self): - super().setUp() - # (fressi) must wait cloud init to complete VM setup before - # shutting it down so that we ensure all IPs settings are - # permanent on VM + def test_0_vlan_ip_addresses(self): + """Check Nova server VLAN port IP addresses""" self.stack.ensure_server_status('ACTIVE') - self.stack.wait_for_cloud_init_done() + expected = set(self.stack.list_vlan_fixed_ips()) + for attempt in tobiko.retry(): + actual = set(ip.list_ip_addresses(device=self.stack.vlan_device, + ssh_client=self.stack.ssh_client, + scope='global')) + unexpected = actual - expected + if unexpected: + self.fail("Unexpected IP address assigned to VLAN port: " + f"{unexpected}") - @pytest.mark.ovn_migration - def test_0_ping_vlan(self): + missing = expected - actual + if missing: + if attempt.is_last: + self.fail("IP addresses not assigned to VLAN port: " + f"{unexpected}") + else: + LOG.debug("IP addresses still not assigned to VLAN port: " + f"{unexpected}") + else: + break + else: + raise RuntimeError("Broken retry loop") + self.assertEqual(set(expected), set(actual)) + + def test_1_ping_vlan_port(self): """Check Nova server VLAN port is reachable""" + self.stack.ensure_server_status('ACTIVE') self.stack.assert_vlan_is_reachable() @pytest.mark.ovn_migration - def test_1_ping_vlan_after_reboot(self): - """Check Nova server VLAN port is reachable after restarting it""" + def test_2_ping_vlan_port_after_restart(self): + """Check Nova server VLAN port is reachable after hard restart""" self.stack.ensure_server_status('SHUTOFF') self.stack.assert_vlan_is_unreachable()