From 3b6283d2337f789a24396e14b970264017e6f76e Mon Sep 17 00:00:00 2001 From: Federico Ressi Date: Thu, 20 May 2021 12:01:29 +0200 Subject: [PATCH] Restore "Add new scenario test cases for live migration"" This reverts commit a655a71c7d59c318bc017bbd33e56ad936d6ac9f. Change-Id: Iac2ee8b42366ba9ff67107c9e5c3b7ab2c86f6e9 --- tobiko/openstack/nova/__init__.py | 1 + tobiko/openstack/nova/_client.py | 16 +++++++ tobiko/tests/scenario/nova/test_server.py | 51 ++++++++++++++++------- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/tobiko/openstack/nova/__init__.py b/tobiko/openstack/nova/__init__.py index 6c56b7d62..7fa8ba5cc 100644 --- a/tobiko/openstack/nova/__init__.py +++ b/tobiko/openstack/nova/__init__.py @@ -41,6 +41,7 @@ WaitForServerStatusTimeout = _client.WaitForServerStatusTimeout shutoff_server = _client.shutoff_server activate_server = _client.activate_server ensure_server_status = _client.ensure_server_status +live_migrate_server = _client.live_migrate_server migrate_server = _client.migrate_server confirm_resize = _client.confirm_resize reboot_server = _client.reboot_server diff --git a/tobiko/openstack/nova/_client.py b/tobiko/openstack/nova/_client.py index 060972a5d..4d8b2a3f0 100644 --- a/tobiko/openstack/nova/_client.py +++ b/tobiko/openstack/nova/_client.py @@ -150,6 +150,22 @@ def migrate_server(server: typing.Optional[ServerType] = None, info=params) +def live_migrate_server(server: typing.Optional[ServerType] = None, + server_id: typing.Optional[str] = None, + host: typing.Optional[str] = None, + block_migration: typing.Union[str, bool] = True, + disk_over_commit: bool = False, + client: NovaClientType = None, + **params): + server_id = get_server_id(server=server, server_id=server_id) + LOG.debug(f"Start server live migration (server_id='{server_id}', " + f"host={host}, block_migration={block_migration}, " + f"disk_over_commit={disk_over_commit}, info={params})") + return nova_client(client).servers.live_migrate( + server=server_id, host=host, block_migration=block_migration, + disk_over_commit=disk_over_commit, **params) + + def confirm_resize(server: typing.Optional[ServerType] = None, server_id: typing.Optional[str] = None, client: NovaClientType = None, **params): diff --git a/tobiko/tests/scenario/nova/test_server.py b/tobiko/tests/scenario/nova/test_server.py index ac41a9c9a..fda91ebc4 100644 --- a/tobiko/tests/scenario/nova/test_server.py +++ b/tobiko/tests/scenario/nova/test_server.py @@ -77,19 +77,20 @@ class MigrateServerStack(stacks.CirrosServerStackFixture): class MigrateServerTest(testtools.TestCase): stack = tobiko.required_setup_fixture(MigrateServerStack) + peer_stack = tobiko.required_setup_fixture(stacks.CirrosServerStackFixture) - def test_migrate_server(self): + def test_migrate_server(self, live=False): """Tests cold migration actually changes hypervisor """ server = self.setup_server() initial_hypervisor = nova.get_server_hypervisor(server) - server = self.migrate_server(server) + server = self.migrate_server(server, live=live) final_hypervisor = nova.get_server_hypervisor(server) self.assertNotEqual(initial_hypervisor, final_hypervisor) - def test_migrate_server_with_host(self): + def test_migrate_server_with_host(self, live=False): """Tests cold migration actually ends on target hypervisor """ server = self.setup_server() @@ -99,30 +100,50 @@ class MigrateServerTest(testtools.TestCase): target_hypervisor = hypervisor.hypervisor_hostname break else: + target_hypervisor = None self.skipTest("Cannot find a valid hypervisor host to migrate " "server to") - server = self.migrate_server(server=server, host=target_hypervisor) + server = self.migrate_server(server=server, host=target_hypervisor, + live=live) final_hypervisor = nova.get_server_hypervisor(server) self.assertEqual(target_hypervisor, final_hypervisor) + def test_live_migrate_server(self): + self.test_migrate_server(live=True) + + @tobiko.skip("Expected to create problems on compute nodes") + def test_live_migrate_server_with_host(self): + self.test_migrate_server_with_host(live=True) + def setup_server(self): server = self.stack.ensure_server_status('ACTIVE') self.assertEqual('ACTIVE', server.status) return server - def migrate_server(self, server, **params): - self.assertEqual('ACTIVE', server.status) - nova.migrate_server(server, **params) - - server = nova.wait_for_server_status(server, 'VERIFY_RESIZE') - self.assertEqual('VERIFY_RESIZE', server.status) - nova.confirm_resize(server) - - server = nova.wait_for_server_status( - server, 'ACTIVE', transient_status={'VERIFY_RESIZE'}) + def migrate_server(self, server, live=False, **params): self.assertEqual('ACTIVE', server.status) - ping.ping_until_received(self.stack.ip_address).assert_replied() + if live: + nova.live_migrate_server(server, **params) + server = nova.wait_for_server_status( + server, 'ACTIVE', transient_status=['MIGRATING']) + else: + nova.migrate_server(server, **params) + + server = nova.wait_for_server_status(server, 'VERIFY_RESIZE') + self.assertEqual('VERIFY_RESIZE', server.status) + nova.confirm_resize(server) + + server = nova.wait_for_server_status( + server, 'ACTIVE', transient_status=['VERIFY_RESIZE']) + self.assertEqual('ACTIVE', server.status) + + # wait until all VM fixed IPs are reachable + ping.assert_reachable_hosts(self.stack.list_fixed_ips(), + timeout=900., + ssh_client=self.peer_stack.ssh_client) + # check floating IP is reachable + ping.assert_reachable_hosts([self.stack.floating_ip_address]) return server