diff --git a/releasenotes/notes/add-can-migrate-between-any-hosts-config-option-x8ah4f9737a28e9b.yaml b/releasenotes/notes/add-can-migrate-between-any-hosts-config-option-x8ah4f9737a28e9b.yaml new file mode 100644 index 0000000000..26fe01a674 --- /dev/null +++ b/releasenotes/notes/add-can-migrate-between-any-hosts-config-option-x8ah4f9737a28e9b.yaml @@ -0,0 +1,9 @@ +--- +features: + - Add a new config option can_migrate_between_any_hosts in the + compute-feature-enabled section, which can be set to False for environment + with non homogeneous compute nodes, so that it can select a destination + host for migrating automatically, otherwise the testcase may fail + unexpectedly. e.g., if source host is with CPU "E5-2699 v4" and the + selected target host is with CPU "E5-2670 v3", the live-migration will + fail because of the downgrade issue. diff --git a/tempest/api/compute/admin/test_live_migration.py b/tempest/api/compute/admin/test_live_migration.py index 836b9751e4..6921d5ed4a 100644 --- a/tempest/api/compute/admin/test_live_migration.py +++ b/tempest/api/compute/admin/test_live_migration.py @@ -70,6 +70,10 @@ class LiveMigrationTestBase(base.BaseV2ComputeAdminTest): def _live_migrate(self, server_id, target_host, state, volume_backed=False): + # If target_host is None, check whether source host is different with + # the new host after migration. + if target_host is None: + source_host = self.get_host_for_server(server_id) self._migrate_server_to(server_id, target_host, volume_backed) waiters.wait_for_server_status(self.servers_client, server_id, state) migration_list = (self.admin_migration_client.list_migrations() @@ -81,8 +85,12 @@ class LiveMigrationTestBase(base.BaseV2ComputeAdminTest): if (live_migration['instance_uuid'] == server_id): msg += "\n%s" % live_migration msg += "]" - self.assertEqual(target_host, self.get_host_for_server(server_id), - msg) + if target_host is None: + self.assertNotEqual(source_host, + self.get_host_for_server(server_id), msg) + else: + self.assertEqual(target_host, self.get_host_for_server(server_id), + msg) class LiveMigrationTest(LiveMigrationTestBase): @@ -104,7 +112,11 @@ class LiveMigrationTest(LiveMigrationTestBase): server_id = self.create_test_server(wait_until="ACTIVE", volume_backed=volume_backed)['id'] source_host = self.get_host_for_server(server_id) - destination_host = self.get_host_other_than(server_id) + if not CONF.compute_feature_enabled.can_migrate_between_any_hosts: + # not to specify a host so that the scheduler will pick one + destination_host = None + else: + destination_host = self.get_host_other_than(server_id) if state == 'PAUSED': self.admin_servers_client.pause_server(server_id) @@ -150,7 +162,11 @@ class LiveMigrationTest(LiveMigrationTestBase): def test_iscsi_volume(self): server = self.create_test_server(wait_until="ACTIVE") server_id = server['id'] - target_host = self.get_host_other_than(server_id) + if not CONF.compute_feature_enabled.can_migrate_between_any_hosts: + # not to specify a host so that the scheduler will pick one + target_host = None + else: + target_host = self.get_host_other_than(server_id) volume = self.create_volume() diff --git a/tempest/config.py b/tempest/config.py index 0f888d68fc..c778d923d0 100644 --- a/tempest/config.py +++ b/tempest/config.py @@ -483,6 +483,12 @@ ComputeFeaturesGroup = [ 'MIN_LIBVIRT_VERSION is >= 1.2.17 on all ' 'branches from stable/rocky and will be ' 'removed in a future release.'), + cfg.BoolOpt('can_migrate_between_any_hosts', + default=True, + help="Does the test environment support migrating between " + "any hosts? In environments with non-homogeneous compute " + "nodes you can set this to False so that it will select " + "destination host for migrating automatically"), cfg.BoolOpt('vnc_console', default=False, help='Enable VNC console. This configuration value should '