Do not specify a host for live-migration for non homogeneous nodes

In production cloud with non homogeneous compute nodes, specifying
a host for live-migration 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.

So this is to add config option can_migrate_between_any_hosts which
can be set to False so that in non homogeneous cloud it can select
destination host automatically.

Change-Id: I05e9c8360b86326b7f58b2c0600fcb420bc31482
Closes-Bug: #1851185
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 0000000..26fe01a
--- /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 836b975..6921d5e 100644
--- a/tempest/api/compute/admin/test_live_migration.py
+++ b/tempest/api/compute/admin/test_live_migration.py
@@ -70,6 +70,10 @@
 
     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 @@
             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 @@
         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 @@
     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 0f888d6..c778d92 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -483,6 +483,12 @@
                                   '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 '